OpenWRT Image Builder
Image Builder (outrora Image Generator) é um ambiente precompilado construído a partir de uma release estável do OpenWRT, e apropriado para que usuários criem versões customizadas sem precisar recompilar o sistema e os aplicativos à partir de suas respectivas fontes. Nesse caso, o que será customizado é a lista dos pacotes que serão instalados nessa imagem a ser produzida, ou seja, é possível remover pacotes que sejam considerados desnecessários (suporte a PPP e/ou IPv6, por exemplo) para acomodar outras aplicações ou módulos (digamos: WPA3 ou protocolos para redes mesh).
Da mesma maneira, também é possível manipular os arquivos dentro da árvore do sistema, seja inserindo novos arquivos ou alterando quaisquer configurações pré-definidas pelo OpenWRT.
Aviso anti-bricagem: alguns pacotes não devem ser removidos, sob pena de inviabilizar o funcionamento mínimo adequado do dispositivo: nominalmente, coisas como Dropbear ou drivers da placa de rede. Deve-se também prestar atenção redobrada aos arquivos inseridos e modificados, pois eventuais erros - tanto de digitação como de lógica - podem deixar o dispositivo igualmente inacessível.
Atualmente, há duas versões estáveis de OpenWRT:
- https://downloads.openwrt.org/releases/19.07.8/targets/ : Lançado em agosto de 2021, usa Kernel 4.14 e ainda dá suporte a dispositivos 4/32 RAM.
- https://downloads.openwrt.org/releases/21.02.0/targets/ : Lançado em setembro de 2021, usa Kernel 5.4, traz WPA3 por padrão.
A arquitetura ar71xx foi substituida por ath79. Caso o seu dispositivo seja deste tipo, recomendo o uso da versão 19, devido às limitações do hardware.
Arquiteturas testadas com a versão 19.07.8:
- ipq806x (tp-ac2600)
- ath79 generic (tl-wr1043-v1, tl-wr1043-v2, tl-wr2543-v1)
- ath79 tiny (tl-wa850, tl-wr941-v3, tl-mr3020-v1)
- raspberry (bcm53xx)
- armvirt / virtual x86
Partindo dos links acima, escolhe-se a arquitetura alvo (ipq806x -> generic) e no fim da página estão os arquivos suplementares. O nome do pacote a ser baixado segue o padrão openwrt-imagebuilder-[ARQUITETURA].Linux-x86_64.tar.xz. Uma vez baixado, deve-se descompactá-lo em um path sem links simbólicos.
Deve ser executado como usuário non-root, à partir da pasta raíz do Image Builder. Levando-se em conta é escrito em inglês, o principal comando a ser executado é make, e ao executá-lo vemos suas opções
$ cd /path/to/Image_Builder
$ make
Para listar os modelos compiláveis:
$ make info
O dispositivo-alvo, que será declarado abaixo como o parametro PROFILE, tem que aparecer na saída do comando anterior. Caso contrário, não vai funcionar pois a arquitetura escolhida não está correta.
$ make image PROFILE=<modelo> FILES=<caminho/para/arquivos> PACKAGES=<lista de pacotes>
Onde:
-
PROFILE = modelo do dispositivo. Deve-se prestar atenção às versões de hardware, para que o dispositivo não termine bricado.
PROFILE=tplink_tl-wa850re-v1
-
FILES = árvore de diretórios que segue a estrutura padrão do sistema. Serve tanto para incluir diretórios e arquivos que não existem na imagem original (digamos /etc/ssl/server.cert.pem), como para alterar arquivos que existem por padrão (digamos /etc/config/wireless habilitado e modificado para conectar-se automaticamente em uma rede pré-determinada). Aceita caminhos absolutos ou relativos à raíz do image builder. Para facilitar o uso, eu criei uma pasta fora do image builder onde guardo as configurações de diferentes dispositivos, e fiz um link simbólico chamado ‘files’ dentro do image builder apontando para essa pasta.
FILES=files/device02 Parent folder |-----> image-builder | |--- (image builder regular folders and files) | |--- files (symlink to common) |-----> common |--- device01 |--- device02 |--- (other devices)
-
PACKAGES = Lista de pacotes que será instalada na imagem a ser gerada. Dependencias são resolvidas automaticamente, por isso deve-se prestar bastante atenção ao que está sendo listado para instalação, tanto para não estourar o limite de armazenamento como para não omitir módulos essenciais e ficar “trancado para fora” do dispositivo. Pacotes pode ser incluidos na lista, ou explicitamente removidos ao serem precedido por - .
Para zerar o image builder, ou seja, limpar arquivos gerados em outras execuções:
# distclean não funciona
$ make clean
Para gerar a lista dos pacotes instalados (aka manifest), incluindo suas dependências:
$ make manifest PACKAGES="(graaande lista)"
non usb
Modelos testados:
- tl-wa850re-v1
- tl-wr941nd-v3
O espaço disponiível neste tipo de dispostivo é realmente pequeno (4MB total), portanto cada kb deve ser bem ocupado.
O primeiro pacote que vai embora é swconfig, uma vez que eles não dispõem de switch de rede. Pacotes relativos ao protocolo PPP também podem ser descartados, pois é mais recomendado que tais conexões sejam gerenciadas por dispositivos com mais recursos de hardware.
Na sequência, temos que optar por determinadas funcionalidades em detrimento de outras:
- dnsmasq pode ser removido se o caso de uso do dispositivo não requeira DNS e/ou DHCP;
- se protocolo IPv4 for suficente, a pilha inteira de IPv6 pode ser removida;
- quem gosta de diversão com linha de comando, pode remover interface web luci, ou….
- … enxugar os módulos, instalando apenas o essencial
E o que fazer com esses minguados kbytes? Quais aplicações são suportadas?
- instalar sudo
- integrar WPA3
- protocolos de rede mesh (olsr, batman-adv);
O que não seria suportado? Essencialmente, qualquer coisa que requeira mais do que 32 MB de RAM e/ou menos que duas centenas de kilobytes. Para outras coisas realmente divertidas, é necessário mais hardware, tanto storage quanto RAM, assim como USB.
generic usb2
PACKAGES="base-files libc libgcc busybox dropbear mtd uci opkg netifd fstools uclient-fetch logd dnsmasq iptables -ip6tables ppp ppp-mod-pppoe firewall -odhcpd-ipv6only -odhcp6c kmod-gpio-button-hotplug swconfig kmod-ath9k wpad-mini uboot-envtools iwinfo kmod-usb-storage kmod-fs-ext4 kmod-loop kmod-fs-isofs block-mount blkid lsblk sudo openssl-util libustream-openssl ca-certificates uhttpd uhttpd-mod-ubus libiwinfo-lua luci-base luci-app-firewall luci-mod-admin-full luci-theme-bootstrap adblock luci-app-adblock openvpn-openssl luci-app-openvpn"
Tested devices:
- tl-wr1043-v1
- tl-wr1043-v2
- tl-wr2543-v1
reduced usb2
- tl-mr3020-v1
usb3: tl-ac2600-v1
A lista de pacotes é um tanto extensa, mas permite o uso de USB logo ao iniciar.
# make image PROFILE=tplink_c2600 FILES=files/$HostName PACKAGES="base-files libc libgcc busybox dropbear mtd uci opkg netifd fstools uclient-fetch logd urandom-seed urngd dnsmasq iptables ip6tables ppp ppp-mod-pppoe firewall odhcpd-ipv6only odhcp6c kmod-ipt-offload kmod-leds-gpio kmod-gpio-button-hotplug swconfig kmod-ata-core kmod-ata-ahci kmod-ata-ahci-platform kmod-usb-core kmod-usb-ohci kmod-usb2 kmod-usb-ledtrig-usbport kmod-usb3 kmod-usb-dwc3-of-simple kmod-usb-phy-qcom-dwc3 kmod-ath10k-ct wpad-basic uboot-envtools iwinfo kmod-usb-storage kmod-fs-ext4 kmod-loop kmod-fs-isofs block-mount blkid lsblk sudo openssl-util libustream-openssl ca-certificates uhttpd uhttpd-mod-ubus libiwinfo-lua luci-base luci-app-firewall luci-mod-admin-full luci-theme-bootstrap adblock luci-app-adblock openvpn-openssl luci-app-openvpn"