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:

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:

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"

source

image builder