No artigo anterior OpenWRT – um clássico dos roteadores foi realizada uma abordagem ampla sobre OpenWRT, e desta vez será realizado download do projeto OpenWRT e o ambiente de buildsystem para configurar e gerar uma Distribuição Linux OpenWRT para algum dos modelos de RaspberryPI com algumas customizações.
Nesse artigo será realizada menção de HOST se referindo ao computador/notebook utilizado para os trabalhos e TARGET como sendo o hardware alvo, como exemplo, RaspberryPI 3B.
Preparando o Host
Algumas dependências são necessárias para o Host Linux
Acesse Install buildsystem Linux Distributions para selecionar a sua Distribuição Linux e instalar as dependências.
Exemplo Debian/Ubuntu:
sudo apt update
sudo apt install build-essential ccache ecj fastjar file g++ gawk \
gettext git java-propose-classpath libelf-dev libncurses5-dev \
libncursesw5-dev libssl-dev python python2.7-dev python3 unzip wget \
python3-distutils python3-setuptools python3-dev rsync subversion \
swig time xsltproc zlib1g-devMais informações: https://openwrt.org/docs/guide-developer/toolchain/install-buildsystem#prerequisites
O ambiente utilizado neste artigo foi com Container Docker, o Dockerfile está no repositorio build-openwrt-rpi[https://github.com/cleitonbueno/build-openwrt-rpi] e para gerar a imagem acesse o diretório onde salvou o Dockerfile em seu computador e execute o comando:
$ docker build -t embarcados/build-openwrt .Verificando a imagem gerada:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
embarcados/build-openwrt latest e4538ff725d5 28 hours ago 805MBAntes de iniciar o Container, crie o diretório mkdir ~/openwrt sendo o diretorio de persistência dos trabalhos que será realizado na construção do OpenWRT, e execute o comando:
$ docker run -it --rm --privileged --name build-openwrt -v $HOME/openwrt:/home/user/openwrt -v /tmp:/tmp embarcados/build-openwrt /bin/bashNosso Container em execução:
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
81c8df85e7eb embarcados/build-openwrt "/bin/bash" About a minute ago Up About a minute build-openwrtFica a critério do leitor utilizar o HOST ou Container, o resultado será o mesmo.
Baixando Repositório OpenWRT
Em um computador Linux com pelo menos 25G de espaço disponível, acesse o diretório $HOME ou de sua preferência no caso do HOST ou dentro do Container e clone o repositório git do openwrt.
$ git clone https://git.openwrt.org/openwrt/openwrt.git
Cloning into 'openwrt'...
remote: Enumerating objects: 588212, done.
remote: Counting objects: 100% (588212/588212), done.
remote: Compressing objects: 100% (157082/157082), done.
remote: Total 588212 (delta 411205), reused 583740 (delta 406886), pack-reused 0
Receiving objects: 100% (588212/588212), 171.55 MiB | 3.35 MiB/s, done.
Resolving deltas: 100% (411205/411205), done.
Checking connectivity... done.Próximo passo, acessar o diretório openwrt e vamos fazer checkout para versão v21.02.1:
$ cd openwrt
$ git checkout v21.02.1Neste ponto, temos o openwrt, mas precisamos atualizar os feeds que possuem informações e procedimentos para baixar, configurar, compilar os mais de 3000 softwares incluindo o LUCI:
$ ./scripts/feeds update -a
$ ./scripts/feeds install -aConfigurando a placa alvo e pacotes para o OpenWRT
Agora, utilizando o utilitário make será chamado o menuconfig para abrir a tela de configuração onde será configurado a placa alvo, aplicações e recursos:
$ make menuconfigUma observação importante nesta etapa, ao selecionar uma opção com <*> o pacote será baixar, configurado, compilado e instalado na imagem do TARGET, no entanto, ao marcar com <M> o pacote será baixado, configurado, compilado e copiado no diretórios packages mas não será instalado no rootfs da imagem gerada, mas poderá ser transferido e instalado via opkg.
Abaixo, um resumo de navegação, as opções a serem selecionadas e a seleção para cada modelo de Raspberry PI:
Target System --->
(X) Broadcom BCM27xxRaspberryPI Zero/RaspberryPI ZeroW
Subtarget --->
(X) BCM2708 boards(32 bit)
Target Profile --->
(X) Raspberry Pi B/B+/CM/Zero/ZeroWRaspberryPI 3B/3B+/3CM, RaspberryPI 4B/400/4CM e RaspberryPI 2B
Subtarget --->
(X) BCM2709/BCM2710/BCM2711 boards (32 bit)
Target Profile --->
(X) Raspberry Pi 3B/3B+/3CM (32bit) (Raspberry Pi 2B/2B 1.2
(X) Raspberry Pi 4B/400/4CM (32bit) (Raspberry Pi 2B/2B 1.2
(X) Raspberry Pi 2B/2B 1.2 (32bit)RaspberryPI 3B/3B+/3CM e RaspberryPI 2B (64bit)
Subtarget --->
(X) BCM2710 boards (64 bit)
Target Profile --->
(X) Raspberry Pi 2B-1.2 (64bit) (Raspberry Pi 3B/3B+/3CM (64bit)
(X) Raspberry Pi 3B/3B+/3CM (64bit) RaspberryPI 4B/400/4CM (64bit)
Subtarget --->
(X) BCM2711 boards (64 bit)
Target Profile --->
(X) Raspberry Pi 4B/400/4CM (64bit)Vamos adicionar algumas pacotes adicionais:
Administration --->
<M> atop
<*> htop
Kernel modules --->
USB Support --->
<*> kmod-usb-hid
<*> kmod-usb2
<*> kmod-usb3
Languages --->
Python --->
<*> python3
<*> python3-paho-mqtt
<*> python3-ubus
<*> python3-uci
Libraries --->
<*> libssh
<*> libssh2
<*> libustream-openssl
LuCI --->
1. Collections --->
<*> luci
<*> luci-ssl-openssl
Utilities --->
<*> psmisc
<*> usbutilsSelecionar Save, confirmar o arquivo .config e selecionar Exit, um exemplo da tela do menuconfig.
Processo de compilação e geração de imagem
Antes de iniciar o processo de construção, pode-se configurar o nível de mensagens que deseja acompanhar ao executar o make, é utilizado o parâmetro V=x, hoje depreciado mas em versões anteriores era utilizado V=1 até V=99 configurando o grau de detalhamento durante o processo, as opções atuais são:
Iniciando o processo de construção:
user@7233738f6f44:~/openwrt/openwrt$ time make -j1 V=sCom o parâmetro -j=1 estamos utilizando apenas um núcleo para processamento, se quiser agilizar pode configurar `-j$(nproc)` para utilizar todos os núcleos disponíveis do processador.
user@7233738f6f44:~/openwrt/openwrt$ time make -j$(nproc) V=s
...
...
...
Signing package index...
make[2]: Leaving directory '/home/user/openwrt/openwrt'
export MAKEFLAGS= ;make -w -r json_overview_image_info
make[2]: Entering directory '/home/user/openwrt/openwrt'
make[2]: Nothing to be done for 'json_overview_image_info'.
make[2]: Leaving directory '/home/user/openwrt/openwrt'
export MAKEFLAGS= ;make -w -r checksum
make[2]: Entering directory '/home/user/openwrt/openwrt'
make[2]: Leaving directory '/home/user/openwrt/openwrt'
make[1]: Leaving directory '/home/user/openwrt/openwrt'
real 158m41.243s
user 120m23.020s
sys 10m21.320sSerá feito download, configuração, compilação, empacotamento de todos pacotes e dependências de software e por fim, gerar rootfs e montar a imagem no formato EXT4 e SquashFS.
Estrutura de Diretórios
Alguns diretórios e suas respectivas funções, os principais são:
- bin/ – Diretório com a imagem final gerada e os pacotes .ipk
- build_dir/ – Diretório de construção referente aos recursos de tools/ e toolchain/
- dl/ – Código-fonte de todas dependências
- tools/ – Descrição de compilação das ferramentas e dependências para a compilação-cruzada no HOST
- toolchain/ – Descrição do toolchain referente a libc, compilador e utilitários para compilação-cruzada e como gerar
- staging_dir/ – Resultado do toolchain e tools já compilados e “instalado”
No caso do nosso TARGET(RaspberryPI) os pacotes serão salvos em:
bin/packages/arm_cortex-a7_neon-vfpv4
A imagem será gerada em:
bin/targets/bcm27xx/bcm2709/
user@7233738f6f44:~/openwrt/openwrt$ cd bin/targets/bcm27xx/bcm2709/Preparando MicroSD para boot
Conecte um MicroSD no HOST para gravar a imagem gerada, para saber o nome do dispositivo MicroSD utilize o comando dmesg ou execute no seu computador:
$ sudo fdisk -l | grep "Disk /"`
Disk /dev/sda: 931,5 GiB, 1000204886016 bytes, 1953525168 sectors
Disk /dev/mmcblk0: 7,4 GiB, 7948206080 bytes, 15523840 sectorsNesta prática o dispositivo do HOST é /dev/mmcblk0.
Lembre-se de desmontar a unidade ou via comando umount, antes de realizar gravação, exemplo:
$ umount /dev/mmcblk0p1Acesse o diretorio ~/openwrt/bin/targets/bcm27xx/bcm2709/ no seu computador e execute o comando para descomprimir a imagem gerada e gravar no microSD via dd.
~/bin/targets/bcm27xx/bcm2709 $ sudo gzip -dc openwrt-bcm27xx-bcm2709-rpi-2-ext4-factory.img.gz | sudo dd of=/dev/mmcblk0 bs=1M conv=fsync
0+5632 registros de entrada
0+5632 registros de saída
184549376 bytes (185 MB, 176 MiB) copied, 18,1345 s, 10,2 MB/sPrimeiro boot
O acesso ao hardware Raspberry PI pode ser feito via Serial Console ou SSH, como exemplo:
$ sudo picocom /dev/ttyUSB0 -b115200
$ ssh root@192.168.1.1
Conecte um cabo de rede do TARGET no HOST e um IP será atribuído, acessando WebPage LUCI via IP 192.168.1.1:
Obtendo algumas informações do sistema OpenWRT em execução, como uso de memória RAM e Armazenamento:
O sistema em execução utiliza aproximadamente 19M de Memória RAM e 40M de RootFS.
Utilizando os comandos uci e ubus via CLI:
Foi realizada uma breve customização do OpenWRT após clonar o seu repositório e selecionar um modelo da RaspberryPI já suportado, pode verificar os demais TARGETS prontos para uso, realizado o processo de gravação e acesso ao OpenWRT em execução.
Boa diversão!
Documentação
A documentação do OpenWRT é excelente, aborda todos os aspectos do buildsystem, dependências, arquitetura do OpenWRT, componentes, customizações, segue a base para consulta:
https://openwrt.org/docs/start
Referências
https://openwrt.org/docs/guide-developer/toolchain/use-buildsystem
https://openwrt.org/docs/guide-developer/toolchain/buildsystem_essentials#directory_structure






Excelente artigo Cleiton, tá de parabéns e vou testá-lo em breve, mas tenho uma dúvida: Imagino que seja mais específico ao OpenWRT do que a implementação ao hardware da Raspi mas, é possível fazer mesh com Raspi + OpenWRT ?
Olá Marcelo, que bom que gostou do artigo. Nunca implementei Mesh com OpenWRT mas há uma documentação sobre o assunto.
https://openwrt.org/docs/guide-user/network/wifi/mesh/start