Autor: Alexandre Jeronimo Correa
GitHub: github.com/ajcorrea/openwrt
E-mail: ajcorrea@gmail.com
O script build_openwrt.sh gera firmware OpenWrt para qualquer target com partição de rootfs (PC/VM x86, Raspberry Pi e similares). Ele usa o ImageBuilder e o SDK oficiais da release escolhida e inclui:
- FullCone NAT (
kmod-nft-fullcone,firewall4com patch,luci-app-fullcone); - LuCI completo (
uhttpd,rpcd-mod-luci,luci-ssl); - tema Argon 3.0.0 como padrão, com tradução pt-BR;
- pacotes extras (collectd, vnstat2, nlbwmon, tcpdump, nmap etc.);
- expand_root: no 1º boot, a rootfs passa a ocupar o disco/SD inteiro.
Targets já gerados e validados por este script (release 25.12.5):
| Equipamento | Target/Subtarget | Profile | Arquitetura |
|---|---|---|---|
| PC / mini-PC / VM x86 64 bits | x86/64 |
generic |
x86_64 |
| Raspberry Pi 4B / 400 / CM4 | bcm27xx/bcm2711 |
rpi-4 |
aarch64_cortex-a72 (ARMv8) |
mkdir -p ~/openwrt && cd ~/openwrt
curl -fLO https://raw.githubusercontent.com/ajcorrea/openwrt/main/build_openwrt.sh
chmod +x build_openwrt.shTudo (downloads, work/, tmp/, images/) é criado dentro da pasta onde o script está. Você pode renomear o arquivo (ex.: build.sh): a ajuda e as mensagens usam o nome real.
./build_openwrt.sh <VERSÃO> <TARGET/SUBTARGET> [PROFILE]
O 1º argumento é sempre a versão. Se você começar direto pelo target (ex.: ./build_openwrt.sh x86/64 generic), o script avisa e usa a versão padrão (25.12.5).
./build_openwrt.sh 25.12.5 x86/64 genericImagens principais em images/:
openwrt-25.12.5-fullcone-argon-extra-expandroot-x86-64-generic-squashfs-combined-efi.img.gz(boot UEFI);openwrt-25.12.5-fullcone-argon-extra-expandroot-x86-64-generic-squashfs-combined.img.gz(boot BIOS/legacy).
./build_openwrt.sh 25.12.5 bcm27xx/bcm2711 rpi-4Imagens principais em images/:
openwrt-25.12.5-fullcone-argon-extra-expandroot-bcm27xx-bcm2711-rpi-4-squashfs-factory.img.gz(gravar no cartão SD);openwrt-25.12.5-fullcone-argon-extra-expandroot-bcm27xx-bcm2711-rpi-4-squashfs-sysupgrade.img.gz(atualizar um Pi que já roda OpenWrt).
# TARGET e SUBTARGET separados (equivale aos exemplos acima)
./build_openwrt.sh 25.12.5 x86 64 generic
./build_openwrt.sh 25.12.5 bcm27xx bcm2711 rpi-4
# Nova release: só troque a versão
./build_openwrt.sh 25.12.6 x86/64 generic
./build_openwrt.sh 25.12.6 bcm27xx/bcm2711 rpi-4- Se você não informar o profile, o script usa o padrão conhecido (
x86/64 -> generic,bcm27xx/bcm2711 -> rpi-4). - Sem nenhum argumento, ele gera
25.12.5 bcm27xx/bcm2711 rpi-4. Esse padrão foi mantido por compatibilidade; prefira informar versão e target. - Para descobrir o target e o profile de outro equipamento, use
--list-profiles(seção abaixo).
./build_openwrt.sh --help # ajuda completa
./build_openwrt.sh --check-deps # só verifica as dependências (não compila)
# Valida imagens já geradas, sem refazer o build
./build_openwrt.sh --validate 25.12.5 x86/64 generic
./build_openwrt.sh --validate 25.12.5 bcm27xx/bcm2711 rpi-4O script sempre verifica as dependências antes de começar. Se faltar alguma, ele lista cada item faltante (comando ou biblioteca de desenvolvimento e o pacote correspondente), mostra o comando de instalação pronto para a sua distro (apt, dnf, pacman ou zypper) e para — nada é instalado automaticamente. Instale com o comando mostrado e rode o script de novo.
A validação lê o rootfs de dentro da imagem squashfs gerada (squashfs-combined.img.gz no x86, squashfs-sysupgrade.img.gz no Raspberry Pi). Ela confere o manifest, os pacotes obrigatórios e os scripts 70-rootpt-resize, 80-rootfs-resize e 99-argon-default. Se falhar, grava tmp/validate/diagnostico.txt (versão do unsquashfs, offset da partição, uci-defaults encontrados, conteúdo de files/).
x86/64 é o único target x86 de 64 bits. x86/generic, x86/legacy e x86/geode são de 32 bits.
Arquivo (openwrt-<versão>-fullcone-argon-extra-expandroot-x86-64-generic-…) |
Uso |
|---|---|
squashfs-combined-efi.img.gz |
Recomendado: PC/VM com boot UEFI (permite reset de fábrica) |
squashfs-combined.img.gz |
PC/VM com boot BIOS/legacy |
ext4-combined-efi.img.gz / ext4-combined.img.gz |
Mesmo uso, rootfs ext4 (gravável, sem reset de fábrica) |
*-rootfs.img.gz, kernel.bin, rootfs.tar.gz |
Uso avançado (ex.: container/LXC no Proxmox) |
As imagens combined servem tanto para gravar no disco (dd, ou converter para VM com qemu-img convert) quanto para sysupgrade. A validação final do script lê o rootfs de dentro da squashfs-combined.img.gz.
Gravar num disco/SSD (troque /dev/sdX pelo disco correto — apaga tudo):
gunzip -c openwrt-25.12.5-fullcone-argon-extra-expandroot-x86-64-generic-squashfs-combined-efi.img.gz | sudo dd of=/dev/sdX bs=4M status=progress conv=fsyncConverter para disco de VM (Proxmox/QEMU):
gunzip -k openwrt-25.12.5-fullcone-argon-extra-expandroot-x86-64-generic-squashfs-combined-efi.img.gz
qemu-img convert -f raw -O qcow2 openwrt-25.12.5-fullcone-argon-extra-expandroot-x86-64-generic-squashfs-combined-efi.img openwrt-x86-64.qcow2Downloads interrompidos não quebram mais o build: o SDK e o ImageBuilder são baixados para .part e conferidos com o sha256sums oficial. Um arquivo incompleto que já esteja em work/ é detectado e baixado de novo.
Antes do build, descubra o target e o nome exato do profile do seu equipamento. O script lê os JSON oficiais da release (.overview.json e profiles.json). Ele não baixa SDK nem ImageBuilder e não exige as dependências de compilação (só curl e python3).
| Comando | O que mostra |
|---|---|
--list-profiles |
Todos os targets da release padrão (25.12.5), com nº de profiles |
--list-profiles 25.12.6 |
Todos os targets da release informada |
--list-profiles 25.12.5 x86/64 |
Profiles de um target específico |
--list-profiles 25.12.5 all |
Todos os profiles de todos os targets (~1900) |
# 1) ver todos os targets
./build_openwrt.sh --list-profiles 25.12.5
# 2) procurar seu equipamento em todos os profiles
./build_openwrt.sh --list-profiles 25.12.5 all | grep -i "raspberry pi 4"
# 3) ver os profiles de um target
./build_openwrt.sh --list-profiles 25.12.5 x86/64
./build_openwrt.sh --list-profiles 25.12.5 bcm27xx bcm2711Saída de exemplo (todos os targets, trecho):
[INFO] Targets disponíveis no OpenWrt 25.12.5
TARGET/SUBTARGET | PROFILES
---------------------+---------
apm821xx/nand | 5
...
bcm27xx/bcm2711 | 1
...
mediatek/filogic | 170
...
x86/64 | 1
Total: 90 target(s) | 1932 profile(s)
Saída de exemplo (profiles de um target):
[INFO] Profiles para OpenWrt 25.12.5 | target=x86 | subtarget=64
PROFILE | DISPOSITIVO(S)
--------+-------------------------------
generic | Generic x86/64
Total: 1 profile(s)
Exemplo: ./build_openwrt.sh 25.12.5 x86/64 generic
Se a plataforma não existir na release, o script mostra a URL consultada e o link da lista de targets: https://downloads.openwrt.org/releases/<versão>/targets/.
Atenção: o expand_root e a validação final foram feitos para imagens com partição de rootfs (x86, Raspberry Pi). Em roteadores com flash NAND/NOR (ex.:
mediatek/filogic), o build pode precisar de ajustes. Lá não existem as imagenssquashfs-combined/squashfs-sysupgradeque a validação procura.
O script automaticamente:
- baixa SDK + ImageBuilder da versão informada;
- recompila FullCone e Argon;
- embute pacotes extras;
- adiciona scripts de
expand_rootno primeiro boot; - gera as imagens em
images/(combinedno x86,factory/sysupgradeno Raspberry Pi); - executa validação final automática (manifest + pacotes obrigatórios + presença dos scripts
uci-defaultsno rootfs).
O repositório informado (github.com/akorshun/fullcone-openwrt) não expõe um pacote com nome literal openwrt-sonic-fullcone; ele entrega o FullCone via conjunto de pacotes, principalmente:
kmod-nft-fullconeluci-app-fullconefirewall4(patch para suporte fullcone)libnftnl11(patch)nftables-json(patch)
Esses pacotes são compilados no SDK oficial do target escolhido (ex.: x86/64, bcm27xx/bcm2711) e injetados no ImageBuilder. O módulo do kernel só funciona com o kernel exato da release/target em que foi compilado.
Manifesto da imagem do Raspberry Pi 4 (25.12.5):
images/openwrt-25.12.5-fullcone-argon-extra-expandroot-bcm27xx-bcm2711-rpi-4.manifest
Entradas relevantes presentes:
firewall4 - 2025.03.17~b6e51575-r202kmod-nft-fullcone - 6.12.94.2023.05.17~07d93b62-r3libnftnl11 - 1.3.1-r201luci-app-fullcone - 26.278.52999~fa29808nftables-json - 1.1.6-r202
No manifest do x86/64 (images/openwrt-25.12.5-fullcone-argon-extra-expandroot-x86-64-generic.manifest), os mesmos pacotes aparecem com revisões r101/r102 (firewall4 - 2025.03.17~b6e51575-r102, kmod-nft-fullcone - 6.12.94.2023.05.17~07d93b62-r3). As versões oficiais da release são r2; uma revisão maior indica que o pacote com patch foi o usado.
Diretório de saída:
images/
openwrt-25.12.5-fullcone-argon-extra-expandroot-bcm27xx-bcm2711-rpi-4-ext4-sysupgrade.img.gzopenwrt-25.12.5-fullcone-argon-extra-expandroot-bcm27xx-bcm2711-rpi-4-squashfs-sysupgrade.img.gzopenwrt-25.12.5-fullcone-argon-extra-expandroot-bcm27xx-bcm2711-rpi-4-ext4-factory.img.gzopenwrt-25.12.5-fullcone-argon-extra-expandroot-bcm27xx-bcm2711-rpi-4-squashfs-factory.img.gz
As imagens
-argon-,-webui-e sem sufixo são de builds anteriores.Para as imagens x86/64, veja a seção "Imagens geradas para x86/64" acima.
luci-theme-argon3.0.0 (github.com/jerrykuku/luci-theme-argon, commit539e3e1), compilado no SDK 25.12.5, com painel de configuração integrado e traduçãoluci-i18n-argon-config-pt-br.- O script
files/etc/uci-defaults/99-argon-defaultdefine o Argon como tema padrão no primeiro boot (inclusive após sysupgrade mantendo configs). - Para trocar: System → System → Language and Style.
Também foram gerados:
sha256sumsprofiles.json.manifest
- Abra o Raspberry Pi Imager.
- Escolha Use custom / imagem personalizada.
- Selecione o arquivo
.img.gzdesejado (factory é o mais comum para gravação inicial em SD). - Selecione o cartão SD.
- Grave.
- Abra o balenaEtcher.
- Selecione o
.img.gz. - Selecione o cartão SD.
- Clique em Flash.
Atenção: confirme o dispositivo correto (ex.:
/dev/sdXou/dev/mmcblk0) para não sobrescrever disco errado.
gzip -dc openwrt-25.12.5-fullcone-argon-extra-expandroot-bcm27xx-bcm2711-rpi-4-squashfs-factory.img.gz | sudo dd of=/dev/sdX bs=4M status=progress conv=fsync
syncNo OpenWrt 25.12.x, o gerenciador padrão é apk (não opkg).
- Verificar pacotes (incluindo web UI):
apk info | grep -E 'luci|uhttpd|rpcd|fullcone|firewall4|nftables|libnftnl'- Verificar se o servidor web está ativo:
service uhttpd status
logread | grep -i uhttpd- Verificar módulo FullCone carregado:
lsmod | grep nft_fullcone- Habilitar FullCone NAT via UCI:
uci set firewall.@defaults[0].fullcone='1'
uci commit firewall
service firewall restart- Conferir regra nftables:
nft list chain inet fw4 srcnat_wan | grep -i fullcone- Via LuCI (se preferir):
- Network → Firewall → FullCone NAT → habilitar.
# no PC
scp -O openwrt-25.12.5-fullcone-argon-extra-expandroot-bcm27xx-bcm2711-rpi-4-squashfs-sysupgrade.img.gz root@192.168.1.1:/tmp/
# no roteador
sysupgrade -T /tmp/openwrt-25.12.5-fullcone-argon-extra-expandroot-bcm27xx-bcm2711-rpi-4-squashfs-sysupgrade.img.gz # só testa
sysupgrade -v /tmp/openwrt-25.12.5-fullcone-argon-extra-expandroot-bcm27xx-bcm2711-rpi-4-squashfs-sysupgrade.img.gz # mantém configsUse sysupgrade -n para apagar as configurações. Use a variante (ext4/squashfs) igual à instalada hoje.
No x86/64 é igual, com a imagem combined (use -efi se o equipamento instalado hoje dá boot em UEFI):
scp -O openwrt-25.12.5-fullcone-argon-extra-expandroot-x86-64-generic-squashfs-combined-efi.img.gz root@192.168.1.1:/tmp/
sysupgrade -T /tmp/openwrt-25.12.5-fullcone-argon-extra-expandroot-x86-64-generic-squashfs-combined-efi.img.gz
sysupgrade -v /tmp/openwrt-25.12.5-fullcone-argon-extra-expandroot-x86-64-generic-squashfs-combined-efi.img.gzForam embutidos os pacotes adicionais solicitados (monitoramento/rede/ferramentas), incluindo: collectd (+ módulos CPU/Memória/Network/Interface/IWInfo/RRD), vnstat2 + luci-app-vnstat2, nlbwmon + luci-app-nlbwmon, luci-app-statistics, luci-app-upnp, luci-app-wol, miniupnpd-nftables, curl, tcpdump, htop, iftop, iperf3, nmap-full, mtr-nojson, parted, losetup, resize2fs, entre outros.
Para aplicar o procedimento do guia expand_root no primeiro boot, a imagem já inclui:
/etc/uci-defaults/70-rootpt-resize/etc/uci-defaults/80-rootfs-resize
Esses scripts usam parted + losetup + resize2fs e fazem reboot automático durante a expansão.
- Sobe normalmente.
- Executa
70-rootpt-resizee reinicia. - Executa
80-rootfs-resizee reinicia novamente. - Na terceira subida, o rootfs já está expandido para ocupar todo o disco (x86) ou cartão SD (Raspberry Pi).
df -h /
lsblk
cat /etc/rootpt-resize /etc/rootfs-resizeSe os arquivos /etc/rootpt-resize e /etc/rootfs-resize existem, a expansão foi concluída.
- Releases OpenWrt:
https://downloads.openwrt.org/releases/ - ImageBuilder e SDK oficiais de cada release/target, baixados de
https://downloads.openwrt.org/releases/<versão>/targets/<target>/<subtarget>/e conferidos com osha256sumsoficial - Repositório FullCone:
https://github.com/akorshun/fullcone-openwrt
- O build usa os pacotes do repositório
akorshun/fullcone-openwrt, compilados no SDK oficial de cada target. - As revisões maiores dos pacotes com patch (
r1xx/r2xx, contrar2na release oficial) garantem prioridade sobre os pacotes padrão na composição da imagem.