OpenWRT – Customizando e Embarcando na Raspberry Pi

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-dev

Mais 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        805MB

Antes 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/bash

Nosso 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-openwrt

Fica 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.1

Neste 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 -a

Configurando 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 menuconfig

Uma 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 BCM27xx

RaspberryPI Zero/RaspberryPI ZeroW

Subtarget --->
    (X) BCM2708 boards(32 bit)
Target Profile --->
    (X) Raspberry Pi B/B+/CM/Zero/ZeroW

RaspberryPI 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
    <*> usbutils

Selecionar Save, confirmar o arquivo .config e selecionar Exit, um exemplo da tela do menuconfig.

OpenWRT na Raspberry Pi

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=s

Com 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.320s

Será 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 sectors

Nesta 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/mmcblk0p1

Acesse 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/s

Primeiro boot

O acesso ao hardware Raspberry PI pode ser feito via Serial Console ou SSH, como exemplo:

$ sudo picocom /dev/ttyUSB0 -b115200
OpenWRT na Raspberry Pi
$ ssh root@192.168.1.1
OpenWRT na Raspberry Pi

Conecte um cabo de rede do TARGET no HOST e um IP será atribuído, acessando WebPage LUCI via IP 192.168.1.1:

OpenWRT na Raspberry Pi
OpenWRT na Raspberry Pi

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

Comentários:
Notificações
Notificar
2 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Marcelo Campos
Marcelo Campos
15/02/2022 12:09

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 ?

Home » Linux Embarcado » OpenWRT – Customizando e Embarcando na Raspberry Pi

EM DESTAQUE

WEBINARS

VEJA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste: