Expansão e Customizações

Intro

Um dos principais diferenciais do OpenWRT é o seu sistema de gerenciamento de pacotes, baseado no padrão Debian dpkg e conhecido por opkg. Para utilizá-los, o princípio é o mesmo: primeiro deve-se atualizar as fontes de pacotes, para então instalar algo. Isso requer conexão à internet.

# opkg update   
# opkg install <pacoteira>

Em dispositivos com poucos recursos (32MB de RAM ou menos), a execução do primeiro comando pode falhar por falta de memória. Nesse caso, deve-se remover algumas das fontes em /etc/ e tentar novamente. A criação de um espaço de memória swap resolve permanentemente o problema. Será visto como fazer isso logo abaixo.

As principais limitações para o que pode (ou deve) ser instalado são espaço de armazenamento e memória RAM. Roteadores costumam ter muito pouco espaço de armazenamento persistente (8 MB ou menos), mas mesmo que seja possível espremer programas para caberem nesse espaço reduzido, sempre haverá o limite, em termos de RAM ou mesmo CPU, do que o dispositivo pode executar simultaneamente.

De qualquer modo, observa-se consistentemente que é possível aproveitar melhor o hardware do roteador quando se instala OpenWRT em substituição ao firmware que veio de fábrica. Via de regra, qualquer eventual funcionalidade que exista na configuração original pode ser replicada e, por consequencia, aprimorada no novo sistema.

Portanto, vamos começar expandindo o espaço de armazenamento persistente disponível através do uso de um dispositivo USB montado como secundário, para depois transferir defiinivamente o sistema para uma partição pré-determinada. Serão descritos alguns exemplos concretos de como executar esse pivô para mover o sistema do roteador para uma partição externa, tanto com USB 3 como USB 2. Há um outro cenário possível, que pode ser visto aqui (link para image builder)

O que será executado e qual será o resultado?

  • um pendrive será preparado para servir como “disco rígido” do roteador;
  • opkg, para viabilizar o uso da porta usb;
  • o pendrive será montado no OpenWRT e um espaço de swap será criado ali;
  • habilitar fstab e swap para executarem automaticamente após rebootar;
  • mover o sistema para o pendrive (tar overlay pivot & reboot);

Resultado: no dispositivo onde antes havia apenas megabytes, agora há gigabytes.

A partir deste momento, espaço de armazenamento disponível para o sistema torna-se, de facto, infinito, e a grande limitação passa a ser o que se consegue configurar ou a carga de execução.

Com isso, podemos instalar:

  • openssl -> ca-certs, different libs, luci
  • lighttpd -> with openssl and php, serve mounted iso
  • isofs -> install, config
  • dnsmasq -> tftp,dhcp options
  • pixie -> wrapper menu

preparação

Antes de iniciar, partimos do principio que:

  • o roteador pode se conectar à internet para que “opkg” execute sem erros;
  • pode reiniciado ou, em casos extremos, fazer factory reset a qualquer momento, caso ocorra algum problema;
  • não há problemas em usar linha de comando

Particionamento do usb

  • /dev/sda1 1GB
  • /dev/sda2 [espaço restante]

opkg

No primeiro comando, as fontes de pacotes são atualizadas, e no segundo, são instalados pacotes para que o roteador possa reconhecer o pendrive logicamente, assim como utilizar os sistemas de arquivos EXT2 a EXT4, e montar imagens ISO com loopback. Os trê últimos pacotes instalam scripts e binários para executar operações de disco (montagem, informações do dispositivo, etc)

# opkg update
# opkg install kmod-usb-storage kmod-fs-ext4 kmod-loop kmod-fs-isofs block-mount blkid lsblk
# block info

A saída deste último comando deverá mostrar pelo menos dois tipos de dispositivos: /dev/mtdblock e /dev/sda. Se aparecer apenas mtdblock, isto significa que o USB não foi instalado e/ou detectado corretamente.

Se houve algum erro relacionado à falta de espaço em disco, deve-se customizar a lista de pacotes para que seja possível instalar suporte a USB. Ver image builder (link)

swapfile

Com isso, podemos montar as duas partições e criar um arquivo de swap:

# mkdir /mnt/pivot
# mkdir /mnt/routerdata
# mount /dev/sda2 /mnt/routerdata
# mount /dev/sda1 /mnt/pivot

# dd status=progress bs=1024 if=/dev/zero of=/mnt/routerdata/swapfile count=32768
# mkswap /mnt/routerdata/swapfile
# swapon /mnt/routerdata/swapfile
# free -h 

Parametros do comando dd

  • status=progress mostra o status de execução
  • bs : tamanho do bloco de dados (block size)
  • if : input, neste caso fornecendo sequencia de 0 (zero)
  • of : output, arquivo de saida no disco USB
  • count : quantidade de blocos gerados, neste caso 32 MB

Agora com swap ativada, vamos tornar permanente essa configuração:

# cat <<EOF >/etc/init.d/swapfile

#!/bin/sh /etc/rc.common
# (C) 2016 Fernao Vellozo

START=90

boot() {
  swapon /mnt/swapfile
}

start() {
  swapon /mnt/swapfile
}

stop() {
  swapoff /mnt/swapfile
}
EOF

# chmod +x /etc/init.d/swapfile
# /etc/init.d/swapfile enable

Um arquivo de inicialização é criado em /etc/init.d/swapfile, transformado em executável com a flag x e habilitado para iniciar automaticamente;

movendo o sistema

Quem já mexeu com sistemas *nix certamente conhece o arquivo fstab, abreviatura de “filesystem table”, que permite configurar amontagem de blocos e partições de disco na inicialização do sistema. No OpenWRT, ele se localiza em /etc/config/fstab, e é regido por UCI, a exemplo dos outros arquivos que se encontram no mesmo diretório. Embora exista um arquivo /etc/fstab, na prática ele normalmente não é utilizado e deve ser ignorado.

Para evitar problemas decorrentes de condições de concorrência na inicialização (o que se traduz em dois dispositivos que iniciam como /dev/sda e /dev/sdb não respeitarem essa ordem a cada reboot), deve-se utilizar o UUID de cada partição, que serão armazenados em variáveis de shell e impressos no arquivo.

Na sequência, os arquivos do sistema em /overlay são transferidos para a partição montada em /mnt/pivot, e do próximo reboot em diante, a instalação de OpenWRT será executada à partir do pendrive.

# Overlay=`lsblk -o UUID -n --nodeps /dev/sda1`
# Routerdata=`lsblk -o UUID -n --nodeps /dev/sda2`
# cat <<EOF > /etc/config/fstab
config global
	option anon_swap '0'
	option anon_mount '0'
	option auto_swap '0'
	option auto_mount '0'
	option delay_root '5'
	option check_fs '0'

config 'mount'
	option target '/overlay'
	option uuid '$Overlay'
	option enabled '1'
	option fstype 'ext4'

config 'mount'
	option target '/mnt/routerdata'
	option uuid '$Routerdata'
	option enabled '1'
	option fstype 'ext4'
EOF
# /etc/init.d/fstab enable

# mount /dev/sda1 /mnt/pivot
# tar -C /overlay -cvf - . | tar -C /mnt/pivot -xf -
# reboot -d 2

conclusão

Para testar se tudo está montado corretamente e utilizando o dispositivo USB:

# df -h | grep -v tmpfs
# free -h

Deverá ser possível ver /overlay com o tamanho designado no particionamento do pendrive, assim como as quantidades de memórias RAM e SWAP em uso e disponíveis.