ÍNDICE DE CONTEÚDO
Introdução
No ambiente de desenvolvimento com Linux embarcado, dependendo dos objetivos da pessoa desenvolvedora, pode ser que seja necessário recompilar ou usar uma versão diferente do kernel, modificar a device tree de acordo com a evolução da sua plataforma, ou realizar mudanças no sistema, como manutenção de módulos do kernel, introdução de novas aplicações, dentre outras. Normalmente, para efetivar qualquer uma dessas mudanças, seria necessário aplicá-la ao dispositivo de armazenamento que a sua plataforma embarcada está utilizando, que, em geral, é uma mídia removível (e.g. cartão SD ou pen drive). Porém, durante o processo de desenvolvimento, pode ser necessário testar mudanças de forma incremental, exigindo que o dispositivo de armazenamento seja transferido muitas vezes do dispositivo embarcado para o computador e vice-versa, consumindo muito tempo
As soluções para esse tipo de problema são diversas, mas neste tutorial será focada a abordagem de inicialização de uma plataforma embarcada utilizando interface de rede (network boot). A placa BeagleBone Black Rev. C será utilizada como base para os experimentos. Caberá a você extrapolar os conceitos mostrados aqui para a sua plataforma.
Antes de explicar a arquitetura da inicialização da BeagleBone Black (BBB) por interface de rede, é necessário entender como essa plataforma é inicializada. A Figura 1 ilustra o processo de inicialização da BBB e que se dá nos seguintes passos:
- RBL (ROM Bootloader): é o primeiro programa a ser executado e está armazenado permanentemente na memória ROM da placa; seu papel é carregar o bootloader secundário da memória flash, cartão SD ou outros periféricos para a memória SRAM do SoC e executá-lo;
- SPL (Secondary Program Loader) ou MLO (Memory Loader): é o bootloader secundário e seu papel é carregar e executar o bootloader terciário, como o U-boot, na memória RAM da placa;
- U-boot: é o bootloader terciário e seu papel é carregar e executar o kernel Linux;
- Linux: após inicialização do kernel o sistema de arquivos raiz (root file system) estará disponível para uso;
A BBB já vem pré-gravada com uma distribuição Debian na sua memória flash e se, durante a inicialização, o botão da placa for pressionado, os programas serão carregados do cartão SD, caso contrário, virão da memória flash pré-gravada.
Enfim, com isso definido, conseguimos entender os artefatos que podem ser modificados em uma distribuição Linux customizada para a BBB. Em um ambiente tradicional de desenvolvimento, uma das práticas seria armazenar essas imagens no cartão SD. Mas no caso deste tutorial será diferente, de modo que as imagens mais sujeitas a modificações serão carregadas via rede. A Figura 2 ilustra a arquitetura de inicialização da BBB usando interface de rede (tudo isso ficará claro de acordo com que o tutorial for evoluindo).
Note que a arquitetura anterior foi expandida com alguns blocos a mais. Durante a inicialização por interface de rede, apenas as imagens do MLO e U-boot estarão localizados no cartão SD, pois não são comumente modificadas após introduzidas na placa. As demais imagens, como kernel, device tree blob e o sistema de arquivos raiz serão buscados diretamente da sua máquina de desenvolvimento por uma interface de rede.
O protocolo TFTP (Trivial File Transfer Protocol) é fácil e simples para usar e é útil para transferir arquivos de um servidor para um cliente TFTP. Nesse caso o cliente TFTP no U-boot vai buscar a uImage do kernel e a device tree blob do servidor TFTP na máquina local de desenvolvimento.
Já o protocolo NFS (Network File System) permite o acesso remoto a arquivos por uma interface de rede. Esse recurso será usado para manter o sistema de arquivos raiz do sistema embarcado na máquina de desenvolvimento (onde estará o servidor TFTP)para fácil manutenção e desenvolvimento, enquanto a BeagleBone Black acessa-o remotamente sem a necessidade de que seja atualizado no cartão SD após a cada mudança.
Com o objetivo traçado, agora é hora de colocar em prática esse tipo de inicialização.
Materiais
- Máquina Linux para desenvolvimento (o experimento foi desenvolvido utilizando Ubuntu 20.04 LTS);
- BeagleBone Black Rev. C (será a plataforma alvo/target dos experimentos);
- Cartão micro SD (com o mínimo de capacidade possível, pois serão utilizados apenas alguns megabytes, mas 1GB seria suficiente);
- Cabo Ethernet (para conexão entre o BBB e computador de desenvolvimento);
- Cabo mini USB para USB-A (para alimentação da BBB durante esse experimento; apenas o cabo USB será necessário, mas se for precisar exigir mais recursos da placa, será necessário utilizar uma fonte de alimentação DC 5V@2A);
- Adaptador USB Serial TTL (para monitorar os logs de inicialização e interagir com o terminal da distribuição Linux embarcada);
Compilação das imagens
Para esse tutorial serão compiladas todas as imagens individualmente a partir do código-fonte, com o objetivo de dar uma visão detalhada de como é todo o processo de customização do processo de inicialização. Mas nada impede de que elas sejam geradas a partir do Buildroot, Yocto ou até baixadas de uma distribuição pronta.
As imagens que serão compiladas são: U-boot (quando compilado já vai gerar o MLO e u-boot.img), Linux kernel (será compilada a uImage e device tree blob) e Busybox como o sistema de arquivos raiz;
Baixando o código fonte
Baixe o código fonte do U-boot para a BeagleBone Black via git clone:
1 |
usuario@local:~$ git clone -b v2022.04-bbb.io-am335x-am57xx --single-branch --depth=1 https://git.beagleboard.org/beagleboard/U-boot U-boot |
Em seguida baixe o código fonte para o kernel Linux da BeagleBone Black:
1 |
usuario@local:~$ git clone -b v5.10.168-ti-r71 --single-branch --depth=1 https://github.com/beagleboard/linux linux |
Para o sistema de arquivos raiz pode ser usado o Busybox que é suficiente para as demonstrações desse tutorial (mas sinta-se à vontade para usar o sistema de arquivos raiz que preferir):
1 |
usuario@local:~$ git clone -b 1_36_stable --single-branch --depth=1 https://github.com/mirror/busybox busybox |
Com todo o código-fonte baixado, agora é hora da compilação das imagens. Antes disso é necessário a toolchain correta para a compilação cruzada de código para a arquitetura ARM da BeagleBone Black na sua máquina x86 (ou x86_64). A toolchain arm-linux-gnueabihf da Linaro é suficiente:
1 2 |
usuario@local:~$ wget https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz usuario@local:~$ tar -xf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz |
Adicione o caminho dos binários da toolchain ao caminho do sistema (variável PATH). Você pode adicionar permanentemente em seu arquivo .bashrc ou .profile, ou pode apenas exportar o caminho para cada sessão do seu terminal. Pela simplicidade, esse tutorial vai usar a última opção:
1 |
usuario@local:~$ export PATH=$PATH:/home/usuario/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin |
Ao compilar o U-boot, kernel Linux e Busybox a toolchain utilizada deve ser passada com o argumento CROSS_COMPILE=arm-linux-gnueabihf-
. Note que apenas o prefixo da toolchain é utilizado, já que a ferramenta a ser utilizada, como o gcc, será decidida pelo sistema de compilação.
U-boot
Primeiramente para compilar o U-boot siga os passos abaixo. Limpe todos os artefatos de compilações passadas e configurações com o comando abaixo:
1 |
usuario@local:~/U-boot$ make CROSS_COMPILE=arm-linux-gnueabihf- distclean |
Em seguida use a configuração padrão para a placa como o seu arquivo .config de configuração:
1 |
usuario@local:~/U-boot$ make CROSS_COMPILE=arm-linux-gnueabihf- am335x_evm_defconfig |
Opcionalmente o .config pode ser editado usando o menuconfig (e só deve ser editado por meio dele), mas esse tutorial não fará modificações, portanto as configurações padrões serão usadas:
1 |
usuario@local:~/U-boot$ make CROSS_COMPILE=arm-linux-gnueabihf- menuconfig |
Finalmente rode o comando de compilação:
1 |
usuario@local:~/U-boot$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8 |
Note que foi usado o argumento opcional -j8
1, que significa que 8 núcleos da CPU serão utilizados para agilizar o processo de compilação. Se você precisa saber essa informação em sua máquina, rode o comando:
1 2 3 4 5 6 7 |
usuario@local:~$ lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian Address sizes: 39 bits physical, 48 bits virtual CPU(s): 8 |
Kernel Linux
O kernel Linux pode ser compilado de uma maneira semelhante:
1 |
usuario@local:~/linux$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean |
A configuração padrão pode ser a configuração padrão da comunidade BeagleBoard.org para a BeagleBone Black (bb.org_defconfig). Qualquer edição pode ser feita com o menuconfig.
1 2 |
usuario@local:~/linux$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bb.org_defconfig usuario@local:~/linux$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig |
Compile a uImage do kernel passando o argumento LOADADDR com o valor comumente usado em sistemas ARM (0x80008000):
1 |
usuario@local:~/linux$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- uImage LOADADDR=0x80008000 -j8 |
Não esqueça de compilar a Device Tree Blob (dtb):
1 |
usuario@local:~/linux$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs -j8 |
Sistema de arquivos raiz (Busybox)
Os passos para a compilação do Busybox também são semelhantes aos anteriores, com a exceção de que o caminho de instalação do sistema de arquivos deve ser passado no momento de compilação. Nesse momento não há necessidade de se preocupar com configurações da placa, mas a opção “build static binary” deve ser ativada no menuconfig para gerar binários estáticos:
1 2 3 4 |
usuario@local:~/busybox$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- defconfig usuario@local:~/busybox$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig [*] Build static binary (no shared libs) usuario@local:~/busybox$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- CONFIG_PREFIX=/home/usuario/rootfs/ install |
A árvore do seu sistema de arquivos raiz se parecerá com isso:
1 2 3 4 5 |
rootfs/ ├── bin/ ├── sbin/ ├── usr/ └── linuxrc |
Com isso pronto, na necessidade de compilar módulos do kernel, estes podem ser diretamente instalados no caminho correto:
1 2 |
usuario@local:~/linux$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8 modules usuario@local:~/linux$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/home/usuario/rootfs/ modules_install |
Configurações de inicialização
A inicialização da BeagleBone Black será feita em três partes:
- As imagens pouco modificadas, como o MLO e U-boot.img, serão armazenadas em uma partição BOOT no cartão SD, portanto a inicialização partirá desse dispositivo;
- Em seguida, após inicializado o U-boot, este será capaz de instanciar um cliente TFTP para acessar o servidor TFTP da sua máquina local para carregar a uImage do kernel e o Device Tree Blob na memória;
- Após o U-boot dar controle da inicialização para o kernel Linux, este será capaz de montar o sistema de arquivos raiz usando NFS;
SD card
Primeiro deve-se configurar o cartão SD. Conecte o cartão SD à sua máquina local e confira os logs para o block device alocado ao seu cartão SD:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
usuario@local:~$ dmesg [374003.143036] usb 3-4: new high-speed USB device number 28 using xhci_hcd [374003.296503] usb 3-4: New USB device found, idVendor=14cd, idProduct=1212, bcdDevice= 1.00 [374003.296512] usb 3-4: New USB device strings: Mfr=1, Product=3, SerialNumber=2 [374003.296515] usb 3-4: Product: Mass Storage Device [374003.296518] usb 3-4: Manufacturer: Generic [374003.296520] usb 3-4: SerialNumber: 121220160204 [374003.297920] usb-storage 3-4:1.0: USB Mass Storage device detected [374003.298250] scsi host0: usb-storage 3-4:1.0 [374004.319980] scsi 0:0:0:0: Direct-Access Mass Storage Device 1.00 PQ: 0 ANSI: 0 CCS [374004.320364] sd 0:0:0:0: Attached scsi generic sg0 type 0 [374004.540699] sd 0:0:0:0: [sda] 62333952 512-byte logical blocks: (31.9 GB/29.7 GiB) [374004.541070] sd 0:0:0:0: [sda] Write Protect is off [374004.541078] sd 0:0:0:0: [sda] Mode Sense: 03 00 00 00 [374004.541227] sd 0:0:0:0: [sda] No Caching mode page found [374004.541232] sd 0:0:0:0: [sda] Assuming drive cache: write through [374004.544294] sda: sda1 sda2 ... |
Nesse exemplo o block device é o /dev/sda
. Informações detalhadas sobre as partições dos dispositivos podem ser vistas com o comando abaixo:
1 2 3 4 5 6 7 |
usuario@local:~$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 1 29,7G 0 disk ├─sda1 8:1 1 <size_1>G 0 part /media/usuario/<partition_name_1> ├─sda2 8:2 1 <size_2>G 0 part /media/usuario/<partition_name_1> ... └─sdax 8:3 1 <size_x>G 0 part /media/usuario/<partition_name_x> |
O dispositivo é /dev/sda
e suas partições são /dev/sdax
(sendo x um número inteiro).
Nesse caso precisaremos de uma partição BOOT de mais ou menos 32MB com sistema de arquivos do tipo FAT16 e uma partição ROOT com o tamanho restante do cartão SD e do tipo ext4. Apesar de estarmos usando um sistema de arquivos pela rede (NFS), é uma boa prática manter a partição ROOT caso decida-se usá-la posteriormente. Antes de formatar, você deve desmontar todas as partições. O comando abaixo garante isso (x é o número da partição e esse comando deve ser executado para todas):
1 |
usuario@local:~$ umount /dev/sdax |
Se checar novamente a saída do comando lsblk
o campo MOUNTPOINT deverá estar limpo.
Para a formatação lance a ferramenta utilitária fdisk
apontando para o dispositivo a ser formatado, nesse caso /dev/sda
(observe que o $ foi alterado por #, significando que o comando deve ser executado com privilégios de administrador):
1 2 3 4 5 6 |
usuario@local:~# fdisk /dev/sda Welcome to fdisk (util-linux 2.34). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): |
O comando p
vai listar todas as partições:
1 2 3 4 5 6 7 8 9 10 11 |
Command (m for help): p Disk /dev/sda: 29,74 GiB, 31914983424 bytes, 62333952 sectors Disk model: Storage Device Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x8dd01e8a Device Boot Start End Sectors Size Id Type /dev/sda1 2048 62332927 62330880 29,7G b W95 FAT32 |
Delete as partições com d
:
1 2 3 |
Command (m for help): d Selected partition 1 Partition 1 has been deleted. |
Se existirem mais partições, a ferramenta solicitará que você escolha o número da partição. De toda forma, delete todas. Após isso crie as novas partições com n
. A primeira partição deve ser a BOOT e deverá preencher as opções como o exemplo abaixo (partição do tipo primária; partição 1; primeiro setor 2048; último setor +32M; sim para remover as assinaturas):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Command (m for help): n Partition type p primary (0 primary, 0 extended, 4 free) e extended (container for logical partitions) Select (default p): p Partition number (1-4, default 1): 1 First sector (2048-62333951, default 2048): 2048 Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-62333951, default 62333951): +32M Created a new partition 1 of type 'Linux' and of size 32 MiB. Partition #1 contains a vfat signature. Do you want to remove the signature? [Y]es/[N]o: Y The signature will be removed by a write command. |
Marque a partição como inicializável com o comando a
:
1 2 3 |
Command (m for help): a Selected partition 1 The bootable flag on partition 1 is enabled now. |
Finalmente formate a partição BOOT para FAT16 com o comando t
:
1 2 3 4 5 6 7 8 |
Command (m for help): t Selected partition 1 Hex code (type L to list all codes): L ... 6 FAT16 42 SFS 87 NTFS volume set db CP/M / CTOS / . ... Hex code (type L to list all codes): 6 Changed type of partition 'Linux' to 'FAT16'. |
A partição ROOT pode ser criada de forma similar. Utilize as opções padrão para utilizar o armazenamento restante:
1 2 3 4 5 6 7 8 9 10 |
Command (m for help): n Partition type p primary (1 primary, 0 extended, 3 free) e extended (container for logical partitions) Select (default p): p Partition number (2-4, default 2): 2 First sector (67584-62333951, default 67584): 67584 Last sector, +/-sectors or +/-size{K,M,G,T,P} (67584-62333951, default 62333951): 62333951 Created a new partition 2 of type 'Linux' and of size 29,7 GiB. |
Formate-a para o tipo Linux (preparando para formatá-la para ext4):
1 2 3 4 5 6 7 8 |
Command (m for help): t Partition number (1,2, default 2): 2 Hex code (type L to list all codes): L 2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT- Hex code (type L to list all codes): 83 Changed type of partition 'Linux' to 'Linux'. |
Até esse momento as mudanças não foram salvas no cartão SD. Para isso use o comando w
. Atenção, pois essa operação é irreversível, por isso verifique suas mudanças com o comando p
e se satisfeito, submeta as mudanças com w
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Command (m for help): p Disk /dev/sda: 29,74 GiB, 31914983424 bytes, 62333952 sectors Disk model: Storage Device Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x8dd01e8a Device Boot Start End Sectors Size Id Type /dev/sda1 * 2048 67583 65536 32M 6 FAT16 /dev/sda2 67584 62333951 62266368 29,7G 83 Linux Filesystem/RAID signature on partition 1 will be wiped. Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks. |
Fora do utilitário fdisk
, formate as partições BOOT e ROOT para FAT e ext4, respectivamente, também nomeando elas corretamente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
usuario@local:~# mkfs.vfat -n "BOOT" /dev/sda1 mkfs.fat 4.1 (2017-01-24) usuario@local:~# mkfs.ext4 -L "ROOT" /dev/sda2 mke2fs 1.45.5 (07-Jan-2020) Creating filesystem with 7783296 4k blocks and 1945888 inodes Filesystem UUID: 1b1a6d9f-7ec1-4e62-8cd7-9462dd748244 Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000 Allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done |
Seu cartão SD está pronto para receber as imagens necessárias.
Configuração de rede
Antes de configurar os servidores TFTP e NFS, algumas configurações de rede devem ser feitas. Para a inicialização por interface de rede você precisará de uma conexão Ethernet entre a sua máquina local e a BeagleBone Black. Para isso você usará a interface de rede Ethernet da sua máquina. No Ubuntu instale os pacotes necessários para ativar/desativar as interfaces de rede ifup
e ifdown
) e para monitorar o estado delas (ifconfig
):
1 |
usuario@local:~# apt install ifupdown net-tools |
Para esse tutorial você vai precisar de um endereço de IP estático para sua interface de rede, de forma que a BeagleBone Black possa encontrar facilmente os servidores TFTP e NFS. Neste tutorial, será utilizada a interface eth0. O arquivo /etc/network/interfaces
será editado como o endereço IPv4 192.168.42.2 (escolha arbitrária, mas que está de acordo com a Figura 2) e máscara de rede 255.255.255.0 (IP para broadcast e gateway são definidos para x.x.x.255 and x.x.x.1, respectivamente):
1 2 3 4 5 6 7 8 |
# /etc/network/interfaces auto eth0 iface eth0 inet static address 192.168.42.2 netmask 255.255.255.0 broadcast 192.168.42.255 gateway 192.168.42.1 |
Após isso desative e reative a interface de rede para que as mudanças tenham efeito:
1 2 |
usuario@local:~# ifdown eth0 usuario@local:~# ifup eth0 |
TFTP
Para configurar o TFTP, instale o servidor TFTP tftpd-hpa na máquina local:
1 |
usuario@local:~# apt install tftpd-hpa |
Confira se o servidor TFTP está rodando corretamente:
1 2 3 4 5 6 7 8 9 10 |
usuario@local:~$ systemctl status tftpd-hpa ● tftpd-hpa.service - LSB: HPA's tftp server Loaded: loaded (/etc/init.d/tftpd-hpa; generated) Active: active (running) since Sat 2023-09-16 18:08:18 -04; 2s ago Docs: man:systemd-sysv-generator(8) Process: 18694 ExecStart=/etc/init.d/tftpd-hpa start (code=exited, status=0/SUCCESS) Tasks: 1 (limit: 37829) Memory: 244.0K CGroup: /system.slice/tftpd-hpa.service └─18702 /usr/sbin/in.tftpd --listen --user tftp --address :69 --secure /srv/tftp |
Se não estiver rodando, inicie-o com systemctl start tftpd-hpa
ou systemctl restart tftpd-hpa
(start, stop ou restart necessitam de privilégios de administrador). Após isso o arquivo de configuração /etc/default/tftpd-hpa
deve ser configurado como o exemplo abaixo, garantido de passar o diretório em que a uImage e a dtb estarão localizadas (privilégios de administrador serão necessários para editar esse arquivo):
1 2 3 4 5 6 |
# /etc/default/tftpd-hpa TFTP_USERNAME="tftp" TFTP_DIRECTORY="/home/usuario/tftpboot" TFTP_ADDRESS=":69" TFTP_OPTIONS="--secure --ipv4" |
Após isso crie o diretório tftpboot/ e modifique suas permissões e dono, então reinicia o serviço:
1 2 3 |
usuario@local:~$ chmod -R 777 /home/usuario/tftpboot usuario@local:~# chown -R tftp:tftp /home/usuario/tftpboot usuario@local:~# systemctl restart tftpd-hpa |
Seu servidor TFTP está pronto para ser usado.
NFS
Para configurar o NFS instale o servidor NFS nfs-kernel-server na sua máquina local:
1 |
usuario@local:~# apt install nfs-kernel-server |
Garanta que o diretório do sistema de arquivos raiz possui privilégios suficientes para ser acessado pelo sistema alvo:
1 2 |
usuario@local:~$ chmod -R 777 /home/usuario/rootfs usuario@local:~# chown -R nobody:nogroup /home/usuario/rootfs |
Agora edite o arquivo /etc/exports
para especificar informações de acesso ao diretório compartilhado (a máscara de rede a ser usada é 255.255.255.0=24, conforme aquela usada na configuração da rede da máquina local):
1 2 |
# /etc/exports /home/usuario/rootfs 192.168.42.3/24(rw,sync,no_root_squash,no_subtree_check) |
Cada campo significa:
-
/home/usuario/rootfs
: diretório do sistema de arquivos raiz a ser compartilhado; 192.168.42.3/24
: IP do cliente a usar o diretório compartilhado, nesse caso será usado um IP estático na BeagleBone Black, que será configurado mais a frente (tente ser específico sobre qual o IP dos clientes que acessarão esse diretório);rw
: permissões de leitura e escrita para o cliente;no_root_squash
: o usuário administrador do cliente também terá permissões de administrador sobre esse diretório;no_subtree_check
: o servidor não vai checar por permissões para cada subdiretório;
Aplique as mudanças ao exportar as configurações do arquivo /etc/exports
:
1 |
usuario@local:~# exportfs -ra |
Edite o arquivo /etc/default/nfs-kernel-server
e adicione a opção para vincular o servidor NFS ao IP da interface eth0:
1 2 3 |
# /etc/default/nfs-kernel-server RPCNFSDARGS="-H 192.168.42.2" |
Reinicie o servidor para que as mudanças tenham efeito:
1 2 |
usuario@local:~# systemctl restart nfs-kernel-server usuario@local:~# systemctl restart rpcbind |
Seu servidor NFS está pronto para ser usado.
Inicialização
Configurando o uEnv.txt
O objetivo dessa configuração é que a BeagleBone Black inicialize a partir do cartão SD e que o U-boot utilize o arquivo uEnv.txt localizado na partição BOOT para executar os comandos de inicialização. Nesse caso o arquivo uEnv.txt será editado para refletir as opções de inicialização pela interface de rede. Então, de acordo com as configurações anteriores para os servidores TFTP e NFS, seu arquivo uEnv.txt deverá se parecer como abaixo (sinta-se livre para editar com suas variáveis). Uma observação é que o enderço IP estático da BBB foi definido como 192.168.42.3, que está na mesma sub-rede que o servidor e está de acordo com o valor da Figura 2.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
# uEnv.txt # Configuracoes de rede # console a ser usado para depuracao console=ttyO0,115200n8 # endereco IP da BeagleBone Black ipaddr=192.168.42.3 # endereco IP do servidor TFTP/NFS serverip=192.168.42.2 # gateway padrao gateway=192.168.42.1 # mascara de rede netmask=255.255.255.0 # interface de rede device=eth0 # TFTP # endereco de carregamento do kernel loadaddr=0x82000000 # endereco de carregamento da device tree fdtaddr=0x88000000 # caminho dos arquivos tftp tftppath=/home/usuario/tftpboot/ # variavel com comandos de carregamento das imagens via tftp loadtftp=tftpboot ${loadaddr} uImage; tftpboot ${fdtaddr} am335x-boneblack.dtb; # NFS # caminho do sistema de arquivos no servidor rootpath=/home/usuario/network-boot/rootfs # argumentos de inicializacao do kernel Linux (i.e console, configuracoes de rede, tipo/caminho do sistema de arquivos, etc.) netargs=setenv bootargs console=${console} ip=${ipaddr}:${serverip}:${gateway}:${netmask}::${device}:off root=/dev/nfs rw nfsroot=${serverip}:${rootpath},nfsvers=3,tcp rootfstype=nfs rootwait rootdelay=5 # Inicializar # Executar os comandos acima e carregar o kernel uenvcmd=echo Network boot...; setenv autoload no; run loadtftp; run netargs; bootm ${loadaddr} - ${fdtaddr} |
Destinando as imagens
Como dito anteriormente, as imagens MLO and U-boot.img e o arquivo uEnv.txt deverão estar na partição BOOT do cartão SD:
1 2 3 |
usuario@local:~$ cp U-boot/MLO /media/usuario/BOOT/ usuario@local:~$ cp U-boot/U-boot.img /media/usuario/BOOT/ usuario@local:~$ cp uEnv.txt /media/usuario/BOOT/ |
A imagem do kernel e a dtb deverá ser copiada para o diretório do servidor TFTP:
1 2 |
usuario@local:~$ cp linux/arch/arm/boot/uImage tftpboot/ usuario@local:~$ cp linux/arch/arm/boot/dts/am335x-boneblack.dtb tftpboot/ |
O sistema de arquivo raiz gerado pelo Busybox estará em:
1 2 |
usuario@local:~$ ls rootfs bin linuxrc sbin usr |
Conclusão
Com tudo isso você deverá ser capaz de inicializar sua distribuição Linux embarcada pela rede usando TFTP e NFS. Alguns passos mais detalhados para garantir uma distribuição Linux embarcado totalmente funcional estão faltando, mas o foco desse tutorial foi estabelecer um ambiente para fácil e rápido desenvolvimento.
Confira abaixo os logs da inicialização da BeagleBone Black utilizando a infraestrutura construída nesse tutorial para termos de comparação:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 |
U-boot SPL 2022.04-ge0d31da5 (Sep 18 2023 - 02:14:23 -0400) Trying to boot from MMC1 U-boot 2022.04-ge0d31da5 (Sep 18 2023 - 02:14:23 -0400) CPU : AM335X-GP rev 2.1 Model: TI AM335x BeagleBone Black DRAM: 512 MiB Reset Source: Power-on reset has occurred. RTC 32KCLK Source: External. Core: 150 devices, 14 uclasses, devicetree: separate WDT: Started wdt@44e35000 with servicing (60s timeout) MMC: OMAP SD/MMC: 0, OMAP SD/MMC: 1 Loading Environment from EXT4... ** Unable to use mmc 0:1 for loading the env ** Board: BeagleBone Black <ethaddr> not set. Validating first E-fuse MAC BeagleBone Black: BeagleBone Cape EEPROM: no EEPROM at address: 0x54 BeagleBone Cape EEPROM: no EEPROM at address: 0x55 BeagleBone Cape EEPROM: no EEPROM at address: 0x56 BeagleBone Cape EEPROM: no EEPROM at address: 0x57 Net: eth2: ethernet@4a100000, eth3: usb_ether Press SPACE to abort autoboot in 0 seconds board_name=[A335BNLT] ... board_rev=[00C0] ... switch to partitions #0, OK mmc0 is current device SD/MMC found on device 0 Couldn't find partition 0:2 0x82000000 Can't set block device Couldn't find partition 0:2 0x82000000 Can't set block device switch to partitions #0, OK mmc0 is current device Scanning mmc 0:1... libfdt fdt_check_header(): FDT_ERR_BADMAGIC Scanning disk mmc@48060000.blk... Scanning disk mmc@481d8000.blk... Found 5 disks No EFI system partition BootOrder not defined EFI boot manager: Cannot load any image gpio: pin 56 (gpio 56) value is 0 gpio: pin 55 (gpio 55) value is 0 gpio: pin 54 (gpio 54) value is 0 gpio: pin 53 (gpio 53) value is 1 switch to partitions #0, OK mmc0 is current device gpio: pin 54 (gpio 54) value is 1 Checking for: /uEnv.txt ... 1278 bytes read in 2 ms (624 KiB/s) gpio: pin 55 (gpio 55) value is 1 Loaded environment from /uEnv.txt Importing environment from mmc ... Checking if uenvcmd is set ... gpio: pin 56 (gpio 56) value is 1 Running uenvcmd ... Network boot... ethernet@4a100000 Waiting for PHY auto negotiation to complete...... done link up on port 0, speed 100, full duplex Using ethernet@4a100000 device TFTP from server 192.168.42.2; our IP address is 192.168.42.3 Filename 'uImage'. Load address: 0x82000000 Loading: ################################################## 10.9 MiB 451.2 KiB/s done Bytes transferred = 11469376 (af0240 hex) link up on port 0, speed 100, full duplex Using ethernet@4a100000 device TFTP from server 192.168.42.2; our IP address is 192.168.42.3 Filename 'am335x-boneblack.dtb'. Load address: 0x88000000 Loading: ################################################## 91.3 KiB 2.3 MiB/s done Bytes transferred = 93494 (16d36 hex) ## Booting kernel from Legacy Image at 82000000 ... Image Name: Linux-5.10.168 Created: 2023-09-16 18:33:14 UTC Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 11469312 Bytes = 10.9 MiB Load Address: 80008000 Entry Point: 80008000 Verifying Checksum ... OK ## Flattened Device Tree blob at 88000000 Booting using the fdt blob at 0x88000000 Loading Kernel Image Loading Device Tree to 8ffe6000, end 8ffffd35 ... OK Starting kernel ... [ 0.000000] Booting Linux on physical CPU 0x0 [ 0.000000] Linux version 5.10.168 (usuario@local) (arm-linux-gnueabihf-gcc (Linaro GCC 7.5-2019.12) 7.5.0, GNU ld (Linaro_3 [ 0.000000] CPU: ARMv7 Processor [413fc082] revision 2 (ARMv7), cr=10c5387d [ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache [ 0.000000] OF: fdt: Machine model: TI AM335x BeagleBone Black [ 0.000000] Memory policy: Data cache writeback [ 0.000000] efi: UEFI not found. [ 0.000000] cma: Reserved 48 MiB at 0x9c800000 [ 0.000000] Zone ranges: [ 0.000000] Normal [mem 0x0000000080000000-0x000000009fdfffff] [ 0.000000] HighMem empty [ 0.000000] Movable zone start for each node [ 0.000000] Early memory node ranges [ 0.000000] node 0: [mem 0x0000000080000000-0x000000009fdfffff] [ 0.000000] Initmem setup node 0 [mem 0x0000000080000000-0x000000009fdfffff] [ 0.000000] CPU: All CPU(s) started in SVC mode. [ 0.000000] AM335X ES2.1 (sgx neon) [ 0.000000] percpu: Embedded 21 pages/cpu s54604 r8192 d23220 u86016 [ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 129412 [ 0.000000] Kernel command line: console=ttyO0,115200n8 ip=192.168.42.3:192.168.42.2:192.168.42.1:255.255.255.0::eth0:off root=5 [ 0.000000] Dentry cache hash table entries: 65536 (order: 6, 262144 bytes, linear) [ 0.000000] Inode-cache hash table entries: 32768 (order: 5, 131072 bytes, linear) [ 0.000000] mem auto-init: stack:off, heap alloc:on, heap free:off [ 0.000000] Memory: 445208K/522240K available (14336K kernel code, 1446K rwdata, 4056K rodata, 1024K init, 452K bss, 27880K res) [ 0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1 [ 0.000000] rcu: Preemptible hierarchical RCU implementation. [ 0.000000] rcu: RCU event tracing is enabled. [ 0.000000] rcu: RCU restricting CPUs from NR_CPUS=2 to nr_cpu_ids=1. [ 0.000000] Trampoline variant of Tasks RCU enabled. [ 0.000000] Tracing variant of Tasks RCU enabled. [ 0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies. [ 0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=1 [ 0.000000] NR_IRQS: 16, nr_irqs: 16, preallocated irqs: 16 [ 0.000000] IRQ: Found an INTC at 0x(ptrval) (revision 5.0) with 128 interrupts [ 0.000000] TI gptimer clocksource: always-on /ocp/interconnect@44c00000/segment@200000/target-module@31000 [ 0.000012] sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 89478484971ns [ 0.000033] clocksource: dmtimer: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 79635851949 ns [ 0.000397] TI gptimer clockevent: 24000000 Hz at /ocp/interconnect@48000000/segment@0/target-module@40000 [ 0.001655] Console: colour dummy device 80x30 [ 0.001702] WARNING: Your 'console=ttyO0' has been replaced by 'ttyS0' [ 0.001713] This ensures that you still see kernel messages. Please [ 0.001722] update your kernel commandline. [ 0.001782] Calibrating delay loop... 995.32 BogoMIPS (lpj=1990656) [ 0.048455] pid_max: default: 32768 minimum: 301 [ 0.049114] LSM: Security Framework initializing [ 0.049241] Yama: becoming mindful. [ 0.049558] AppArmor: AppArmor initialized [ 0.049581] TOMOYO Linux initialized [ 0.049796] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes, linear) [ 0.049816] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes, linear) [ 0.051556] CPU: Testing write buffer coherency: ok [ 0.051645] CPU0: Spectre v2: using BPIALL workaround [ 0.072890] Setting up static identity map for 0x80100000 - 0x80100060 [ 0.080476] rcu: Hierarchical SRCU implementation. [ 0.089731] EFI services will not be available. [ 0.100485] smp: Bringing up secondary CPUs ... [ 0.100510] smp: Brought up 1 node, 1 CPU [ 0.100523] SMP: Total of 1 processors activated (995.32 BogoMIPS). [ 0.100534] CPU: All CPU(s) started in SVC mode. [ 0.101465] devtmpfs: initialized [ 0.124789] VFP support v0.3: implementor 41 architecture 3 part 30 variant c rev 3 [ 0.125266] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns [ 0.125311] futex hash table entries: 256 (order: 2, 16384 bytes, linear) [ 0.129502] pinctrl core: initialized pinctrl subsystem [ 0.130670] DMI not present or invalid. [ 0.131734] NET: Registered protocol family 16 [ 0.134864] DMA: preallocated 256 KiB pool for atomic coherent allocations [ 0.157561] l3-aon-clkctrl:0000:0: failed to disable [ 0.158253] audit: initializing netlink subsys (disabled) [ 0.159766] thermal_sys: Registered thermal governor 'fair_share' [ 0.159781] thermal_sys: Registered thermal governor 'bang_bang' [ 0.159798] thermal_sys: Registered thermal governor 'step_wise' [ 0.159809] thermal_sys: Registered thermal governor 'user_space' [ 0.159819] thermal_sys: Registered thermal governor 'power_allocator' [ 0.160224] cpuidle: using governor ladder [ 0.160282] cpuidle: using governor menu [ 0.164573] audit: type=2000 audit(0.148:1): state=initialized audit_enabled=0 res=1 [ 1.452575] hw-breakpoint: debug architecture 0x4 unsupported. [ 1.479862] Kprobes globally optimized [ 1.504879] raid6: skip pq benchmark and using algorithm neonx8 [ 1.504912] raid6: using neon recovery algorithm [ 1.508424] iommu: Default domain type: Translated [ 1.510881] SCSI subsystem initialized [ 1.511722] usbcore: registered new interface driver usbfs [ 1.511789] usbcore: registered new interface driver hub [ 1.511848] usbcore: registered new device driver usb [ 1.512854] mc: Linux media interface: v0.10 [ 1.512915] videodev: Linux video capture interface: v2.00 [ 1.513099] pps_core: LinuxPPS API ver. 1 registered [ 1.513114] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it> [ 1.513171] PTP clock support registered [ 1.515466] NetLabel: Initializing [ 1.515492] NetLabel: domain hash size = 128 [ 1.515502] NetLabel: protocols = UNLABELED CIPSOv4 CALIPSO [ 1.515602] NetLabel: unlabeled traffic allowed by default [ 1.516866] clocksource: Switched to clocksource dmtimer [ 2.579516] VFS: Disk quotas dquot_6.6.0 [ 2.579685] VFS: Dquot-cache hash table entries: 1024 (order 0, 4096 bytes) [ 2.579984] FS-Cache: Loaded [ 2.580432] CacheFiles: Loaded [ 2.581574] AppArmor: AppArmor Filesystem Enabled [ 2.594885] NET: Registered protocol family 2 [ 2.595200] IP idents hash table entries: 8192 (order: 4, 65536 bytes, linear) [ 2.596802] tcp_listen_portaddr_hash hash table entries: 512 (order: 0, 6144 bytes, linear) [ 2.597194] TCP established hash table entries: 4096 (order: 2, 16384 bytes, linear) [ 2.597268] TCP bind hash table entries: 4096 (order: 3, 32768 bytes, linear) [ 2.597330] TCP: Hash tables configured (established 4096 bind 4096) [ 2.597994] MPTCP token hash table entries: 512 (order: 1, 8192 bytes, linear) [ 2.598107] UDP hash table entries: 256 (order: 1, 8192 bytes, linear) [ 2.598144] UDP-Lite hash table entries: 256 (order: 1, 8192 bytes, linear) [ 2.598411] NET: Registered protocol family 1 [ 2.611930] RPC: Registered named UNIX socket transport module. [ 2.611959] RPC: Registered udp transport module. [ 2.611969] RPC: Registered tcp transport module. [ 2.611978] RPC: Registered tcp NFSv4.1 backchannel transport module. [ 2.611996] NET: Registered protocol family 44 [ 2.613742] hw perfevents: enabled with armv7_cortex_a8 PMU driver, 5 counters available [ 2.619318] Initialise system trusted keyrings [ 2.619890] workingset: timestamp_bits=14 max_order=17 bucket_order=3 [ 2.628416] zbud: loaded [ 2.636823] NFS: Registering the id_resolver key type [ 2.637201] Key type id_resolver registered [ 2.637214] Key type id_legacy registered [ 2.637434] nfs4filelayout_init: NFSv4 File Layout Driver Registering... [ 2.637455] nfs4flexfilelayout_init: NFSv4 Flexfile Layout Driver Registering... [ 2.637507] jffs2: version 2.2. (NAND) (SUMMARY) �© 2001-2006 Red Hat, Inc. [ 2.638632] fuse: init (API version 7.32) [ 2.731429] xor: automatically using best checksumming function neon [ 2.731464] Key type asymmetric registered [ 2.731476] Asymmetric key parser 'x509' registered [ 2.731599] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 243) [ 2.736028] io scheduler mq-deadline registered [ 3.044563] ti-sysc: probe of 44e31000.target-module failed with error -16 [ 3.091633] ti-sysc: probe of 48040000.target-module failed with error -16 [ 3.209073] omap-mailbox 480c8000.mailbox: omap mailbox rev 0x400 [ 3.335630] debugfs: Directory '49000000.dma' with parent 'dmaengine' already present! [ 3.335681] edma 49000000.dma: TI EDMA DMA engine driver [ 3.365675] pinctrl-single 44e10800.pinmux: 142 pins, size 568 [ 3.381229] Serial: 8250/16550 driver, 6 ports, IRQ sharing disabled [ 3.385977] 44e09000.serial: ttyS0 at MMIO 0x44e09000 (irq = 20, base_baud = 3000000) is a 8250 [ 4.222699] printk: console [ttyS0] enabled [ 4.231288] omap_rng 48310000.rng: Random Number Generator ver. 20 [ 4.237897] random: crng init done [ 4.349052] loop: module loaded [ 4.362846] mdio_bus 4a101000.mdio: mii_bus 4a101000.mdio couldn't get reset GPIO [ 4.371403] cpsw 4a100000.ethernet: initialized cpsw ale version 1.4 [ 4.377957] cpsw 4a100000.ethernet: ALE Table size 1024 [ 4.383379] cpsw 4a100000.ethernet: cpts: overflow check period 1250 (jiffies) [ 4.390789] cpsw 4a100000.ethernet: Detected MACID = ab:cd:ef:gh:ij:kl [ 4.400513] usbcore: registered new interface driver smsc95xx [ 4.408159] am335x-phy-driver 47401300.usb-phy: supply vcc not found, using dummy regulator [ 4.417045] am335x-phy-driver 47401300.usb-phy: dummy supplies not allowed for exclusive requests [ 4.433928] am335x-phy-driver 47401b00.usb-phy: supply vcc not found, using dummy regulator [ 4.442773] am335x-phy-driver 47401b00.usb-phy: dummy supplies not allowed for exclusive requests [ 4.458533] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver [ 4.465372] ehci-platform: EHCI generic platform driver [ 4.471184] ehci-omap: OMAP-EHCI Host Controller driver [ 4.487583] musb-hdrc musb-hdrc.1: MUSB HDRC host driver [ 4.493193] musb-hdrc musb-hdrc.1: new USB bus registered, assigned bus number 1 [ 4.501085] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 5.10 [ 4.509424] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1 [ 4.516701] usb usb1: Product: MUSB HDRC host driver [ 4.521706] usb usb1: Manufacturer: Linux 5.10.168 musb-hcd [ 4.527321] usb usb1: SerialNumber: musb-hdrc.1 [ 4.532763] hub 1-0:1.0: USB hub found [ 4.536706] hub 1-0:1.0: 1 port detected [ 4.550749] omap_rtc 44e3e000.rtc: registered as rtc0 [ 4.556199] omap_rtc 44e3e000.rtc: setting system clock to 2000-01-01T00:00:00 UTC (946684800) [ 4.566612] i2c /dev entries driver [ 4.573973] omap_wdt: OMAP Watchdog Timer Rev 0x01: initial timeout 60 sec [ 4.581718] softdog: initialized. soft_noboot=0 soft_margin=60 sec soft_panic=0 (nowayout=0) [ 4.590241] softdog: soft_reboot_cmd=<not set> soft_active_on_boot=0 [ 4.599329] cpuidle: enable-method property 'ti,am3352' found operations [ 4.607497] sdhci: Secure Digital Host Controller Interface driver [ 4.613790] sdhci: Copyright(c) Pierre Ossman [ 4.618189] sdhci-pltfm: SDHCI platform and OF driver helper [ 4.625890] sdhci-omap 481d8000.mmc: supply vqmmc not found, using dummy regulator [ 4.634865] ledtrig-cpu: registered to indicate activity on CPUs [ 4.643172] omap-aes 53500000.aes: OMAP AES hw accel rev: 3.2 [ 4.649550] omap-aes 53500000.aes: will run requests pump with realtime priority [ 4.661225] omap-sham 53100000.sham: hw accel on OMAP rev 4.3 [ 4.667480] omap-sham 53100000.sham: will run requests pump with realtime priority [ 4.679815] hid: raw HID events driver (C) Jiri Kosina [ 4.686299] usbcore: registered new interface driver usbhid [ 4.692149] mmc1: SDHCI controller on 481d8000.mmc [481d8000.mmc] using External DMA [ 4.700180] usbhid: USB HID core driver [ 4.705082] remoteproc remoteproc0: wkup_m3 is available [ 4.717936] NET: Registered protocol family 10 [ 4.732297] Segment Routing with IPv6 [ 4.736404] mip6: Mobile IPv6 [ 4.739638] NET: Registered protocol family 17 [ 4.748761] Key type dns_resolver registered [ 4.753229] mpls_gso: MPLS GSO support [ 4.757358] ThumbEE CPU extension supported. [ 4.761774] Registering SWP/SWPB emulation handler [ 4.766682] omap_voltage_late_init: Voltage driver support not added [ 4.774324] registered taskstats version 1 [ 4.778539] Loading compiled-in X.509 certificates [ 4.783532] zswap: loaded using pool lzo/zbud [ 4.793350] Key type .fscrypt registered [ 4.793430] mmc1: new high speed MMC card at address 0001 [ 4.802874] Key type fscrypt-provisioning registered [ 4.815774] Btrfs loaded, crc32c=crc32c-generic [ 4.821147] mmcblk1: mmc1:0001 M62704 3.56 GiB [ 4.825933] AppArmor: AppArmor sha1 policy hashing enabled [ 4.832186] mmcblk1boot0: mmc1:0001 M62704 partition 1 2.00 MiB [ 4.845663] mmcblk1boot1: mmc1:0001 M62704 partition 2 2.00 MiB [ 4.857405] mmcblk1rpmb: mmc1:0001 M62704 partition 3 512 KiB, chardev (240:0) [ 4.874169] OMAP GPIO hardware version 0.1 [ 4.880757] mmcblk1: p1 [ 4.911885] tps65217-pmic: Failed to locate of_node [id: -1] [ 4.929199] tps65217-bl: Failed to locate of_node [id: -1] [ 4.937909] tps6521x_pwrbutton tps65217-pwrbutton: DMA mask not set [ 4.945291] input: tps65217_pwr_but as /devices/platform/ocp/44c00000.interconnect/44c00000.interconnect:segment@200000/44e0b000 [ 4.963872] tps65217 0-0024: TPS65217 ID 0xe version 1.2 [ 4.970852] at24 0-0050: 32768 byte 24c256 EEPROM, writable, 1 bytes/write [ 4.978978] omap_i2c 44e0b000.i2c: bus 0 rev0.11 at 400 kHz [ 4.988215] at24 2-0054: supply vcc not found, using dummy regulator [ 5.024645] at24 2-0055: supply vcc not found, using dummy regulator [ 5.060555] at24 2-0056: supply vcc not found, using dummy regulator [ 5.096519] at24 2-0057: supply vcc not found, using dummy regulator [ 5.131118] omap_i2c 4819c000.i2c: bus 2 rev0.11 at 100 kHz [ 5.184900] davinci_mdio 4a101000.mdio: davinci mdio revision 1.6, bus freq 1000000 [ 5.194957] davinci_mdio 4a101000.mdio: phy[0]: device 4a101000.mdio:00, driver SMSC LAN8710/LAN8720 [ 5.210846] omap_gpio 44e07000.gpio: Could not set line 6 debounce to 200000 microseconds (-22) [ 5.222342] sdhci-omap 48060000.mmc: Got CD GPIO [ 5.227508] sdhci-omap 48060000.mmc: supply vqmmc not found, using dummy regulator [ 5.265342] mmc0: SDHCI controller on 48060000.mmc [48060000.mmc] using External DMA [ 5.334014] mmc0: new high speed SDHC card at address aaaa [ 5.345307] mmcblk0: mmc0:aaaa SC32G 29.7 GiB [ 5.352232] tda998x 0-0070: found TDA19988 [ 5.360903] mmcblk0: p1 p2 [ 5.366687] tilcdc 4830e000.lcdc: bound 0-0070 (ops 0xc0faa1b8) [ 5.374245] [drm] Initialized tilcdc 1.0.0 20121205 for 4830e000.lcdc on minor 0 [ 5.382531] tilcdc 4830e000.lcdc: [drm] Cannot find any crtc or sizes [ 5.390663] of_cfs_init [ 5.393734] tilcdc 4830e000.lcdc: [drm] Cannot find any crtc or sizes [ 5.400382] of_cfs_init: OK [ 5.405603] cpsw 4a100000.ethernet: initializing cpsw version 1.12 (0) [ 5.478560] SMSC LAN8710/LAN8720 4a101000.mdio:00: attached PHY driver [SMSC LAN8710/LAN8720] (mii_bus:phy_addr=4a101000.mdio:0) [ 10.601620] cpsw 4a100000.ethernet eth0: Link is Up - 100Mbps/Full - flow control off [ 10.609631] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready [ 10.629081] IP-Config: Complete: [ 10.632346] device=eth0, hwaddr= ab:cd:ef:gh:ij:kl, ipaddr=192.168.42.3, mask=255.255.255.0, gw=192.168.42.1 [ 10.642832] host=192.168.42.3, domain=, nis-domain=(none) [ 10.648781] bootserver=192.168.42.2, rootserver=192.168.42.2, rootpath= [ 10.650048] Waiting 5 sec before mounting root device... [ 15.876439] VFS: Mounted root (nfs filesystem) on device 0:19. [ 15.883199] devtmpfs: error mounting -2 [ 15.889024] Freeing unused kernel memory: 1024K [ 15.897661] Run /sbin/init as init process [ 15.907969] Not activating Mandatory Access Control as /sbin/tomoyo-init does not exist. ~ # |
Referências
Para mais informações, visite os links:
https://takeofftechnical.com/network-boot-embedded-linux/
https://embarcados.com.br/compilando-o-android-para-beaglebone-black/
https://elinux.org/Building_BBB_Kernel
https://elinux.org/Panda_How_to_MLO_%26_u-boot
https://www.freecodecamp.org/news/setting-a-static-ip-in-ubuntu-linux-ip-address-tutorial/
Muito bom artigo!