Rotinas de Update e Upgrade com o OpenWrt

 Por Ciro Mota |  7, Maio 2023 |  Tempo de leitura aproximadamente 6 minutos.
 Edições: Publicação. Em 7, Maio 2023.

Olá pessoal, como vão?

Depois de um tempinho sem escrita lá vamos nós fazer jus a este blog compartilhando sempre novas descobertas.

Há alguns meses que aderi ao uso do OpenWrt na minha rede e há tempos eu já o admirava por ser um projeto open source em substituição aos firmwares dos fabricantes de roteadores. Eu como fã de distros Linux e o OpenWrt usa o kernel Linux em sua estrutura não poderia deixar de usá-lo. Aliás um outro fator em favor é lidar contra a obsolescência imposta por esses mesmos fabricantes onde roteadores fora de linha há anos (como o lendário WR1043NDv1) até hoje possuem suporte por lá.

Concordo que o OpenWrt possa não ser para todos os públicos, assim como o Arch Linux não é. Mas assim como o mesmo Arch Linux a sua documentação é extensa e é necessário somente um pouco de entendimento e pesquisas para fazer as coisas funcionarem.

O processo mais vital de um sistema é o seu período de atualização e com o OpenWrt isso não é diferente. Porém não é por se tratar de uma distro que o comportamento dessas atualizações seja o mesmo. Neste artigo irei tentar aplicar um pouco do meu processo de aprendizado a esse respeito.

Update

O processo de atualização do OpenWrt assim como uma distro Linux envolve duas etapas, o Update e o Upgrade. Sendo o primeiro a atualização dos pacotes assim como ocorre corriqueiramente em uma distro e o segundo o processo de atualização do próprio sistema. Por ser um sistema crítico e que envolve operações onde estabilidade é o principal ponto, você deve ponderar sempre ao realizar atualizações dos pacotes em uma instalação do OpenWrt. O processo aqui é dividido em duas etapas: Os pacotes Base que são a estrutura do sistema e que são instalados em uma partição exclusiva de somente leitura junto com o próprio sistema e os pacotes Custom que são instalados em outra partição com leitura e escrita.

O processo de atualização (Update) dos pacotes Base, se houver, irá criar uma cópia de si mesmo na partição de leitura e escrita ao invés de substituí-los na partição de origem, a Base. Desta forma mais espaço alocado em disco será necessário para tal armazenamento e sabemos que roteadores ainda possui espaço de memória limitado. O ideal aqui é que aguarde as atualizações PATCH ou MINOR (falaremos dela em seguida) para realizar as atualizações destes pacotes, exceto em caso de falhas graves de segurança e seu aparelho possua espaço suficiente para aplicação.

Já as atualizações Custom funcionam como em uma distro Linux qualquer mas ainda assim nem todas as atualizações são referentes a correções de segurança ou estabilidade, aqui você também deverá ponderar sobre o que vai aplicar, já que nem sempre haverá algum ganho. A dica é estar atento aos log de alterações para embasar sua decisão. Caso haja muitos pacotes a serem atualizados você não deve executar o comando de upgrade direto sob risco de trazer problemas ao sistema com uma dessas atualizações.

Neste e neste link você encontra um pouco mais de informações a respeito do que eu cito e minha fonte de pesquisa.

Um outro fator super importante é a quantidade de escritas que você fará nas memórias do aparelho. Uma memória de roteador pode não ser tão durável quanto a de um SSD por exemplo. Quanto menos escritas por lá, melhor.

Upgrade

O processo de Upgrade e mais uma vez tomando como comparação uma distro Linux comum, é feito de tempos em tempos após disponibilizadas as novas versões. No caso do OpenWrt não há uma periodicidade exata sobre quando novas versões podem sair e em adição a isso o processo de lançamento de novas versões obedece ao Semantic Versioning, ou seja, poderão haver versões MAJOR (22.x.x) MINOR (22.03.x) e PATCH (22.03.5) (exemplo da versão mais atual no momento da escrita deste texto).

Você pode livremente fazer o sysupgrade mantendo suas configurações dentro de lançamentos PATCH e MINOR mas é altamente recomendável recomeçar do zero ao aplicar um lançamento MAJOR, isso devido as diferenças de configurações do próprio sistema, modificações e implementações que possam ter sido adicionadas e poderão ocasionar conflitos com configurações antigas.

Para os outros dois lançamentos como dito, você pode manter configurações mas não é possível manter os apps que foram instalados. Comentaremos sobre isso a seguir.

Preservando os apps após o Upgrade

O OpenWrt não mantém por padrão os apps que você instala no sistema após uma rotina de upgrade de versão, sendo necessário o uso de scripts para essa operação posteriormente. O script em que para meu uso eu obtive o melhor resultado foi o desenvolvido pelo tboege. Execute linha a linha abaixo:

cat << "EOF" > /tmp/listuserpackages.awk
#!/usr/bin/awk -f
BEGIN {
    ARGV[ARGC++] = "/usr/lib/opkg/status"
    cmd="opkg info busybox | grep '^Installed-Time: '"
    cmd | getline FLASH_TIME
    close(cmd)
    FLASH_TIME=substr(FLASH_TIME,17)
}
/^Package:/{PKG= $2}
/^Installed-Time:/{
    INSTALLED_TIME= $2
    # Find all packages installed after FLASH_TIME
    if ( INSTALLED_TIME > FLASH_TIME ) {
        cmd="opkg whatdepends " PKG " | wc -l"
        cmd | getline WHATDEPENDS
        close(cmd)
        # If nothing depends on the package, it is installed by user
        if ( WHATDEPENDS == 3 ) print PKG
    }
}
EOF

Permissão de execução:

chmod +x /tmp/listuserpackages.awk

O comando abaixo finalmente irá salvar a lista dos apps que foram instalados por você no OpenWrt. A implementação original do script no meu caso gerou uma lista duplicada dos apps e para contornar isso nós podemos fazer o uso do comando sort -u que além de organizar em ordem alfabética irá remover os duplicados (vide imagem).

Lista de apps gerada pelo script mostrando o resultado com duplicatas e sem as duplicatas com a adição do comando sort

E por fim a lista será salva no arquivo opkg-beforeupgrade

/tmp/listuserpackages.awk /usr/lib/opkg/status | sort -u > /etc/opkg-beforeupgrade

Para finalizar você deverá escrever no arquivo sysupgrade.conf, que é um arquivo de customização de Upgrade, para que o outro arquivo opkg-beforeupgrade seja preservado depois da atualização de versão do OpenWrt.

echo "/etc/opkg-beforeupgrade" >> /etc/sysupgrade.conf

Conteúdo do arquivo sysupgrade.conf mostrando a linha adicionada no passo anterior

No meu caso o arquivo restore.sh é uma rotina automatizada que eu criei em um Shell Script para repor esses apps após o Upgrade do sistema. Sim, é possível criar um Shell Script de automação geral por lá também. Se for muito pedido quem sabe eu não teste e publique um que possa ser de auxílio para vocês.

Após atualizada a versão e o roteador reiniciar e caso você esteja conectado à internet (deverá estar se você manteve as configurações) você deve executar:

opkg update && cat /etc/opkg-beforeupgrade | xargs opkg install

Com isso o sistema irá atualizar os repositórios e instalar os apps. Não será necessário reconfigurar, apenas reinstalar os apps que eram utilizados.

OBS: Se você usa DNSCrypt como eu você deverá alterar o DNS forwardings para um DNS público e reiniciar o dnsmasq para que a conexão retorne. Só a partir dai você conseguirá executar a instalação dos apps. Após reinstalar o DNSCrypt, retorne para o DNS padrão do app.

Conclusão

Em si não é difícil manter o OpenWrt conforme vimos neste artigo, a exceção de como manter os apps após o Upgrade ele vai te demandar pesquisas e tempo para se adaptar. Mas é um tempo muito bem gasto para um sistema vasto e muito gosto de usar.

Caso queira se familiarizar com ele eu tenho dois artigos criados onde você poderá emulá-lo tanto na VirtualBox quanto no QEMU:

Espero que este artigo seja útil para você.
Até mais!