Inicializando a BeagleBone Black por interface de rede

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:

  1. 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;
  2. 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;
  3. U-boot: é o bootloader terciário e seu papel é carregar e executar o kernel Linux;
  4. Linux: após inicialização do kernel o sistema de arquivos raiz (root file system) estará disponível para uso;

Figura 1 – Processo de inicialização da BeagleBone Black.

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).

Figura 2 – Processo de inicialização da BeagleBone Black usando interface de rede.

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:

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:

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):

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:

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: 

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: 

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:

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:

usuario@local:~/U-boot$ make CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

Finalmente rode o comando de compilação:

usuario@local:~/U-boot$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8

Note que foi usado o argumento opcional -j81, 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:

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:

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.

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):

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):

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:

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:

rootfs/
├── bin/
├── sbin/
├── usr/
└── linuxrc

Com isso pronto, na necessidade de compilar módulos do kernel, estes podem ser diretamente instalados no caminho correto: 

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:

  1. 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;
  2. 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;
  3. 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:

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:

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): 

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):

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:

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:

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):

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:

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:

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:

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):

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:

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:

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):

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):

# /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:

usuario@local:~# ifdown eth0
usuario@local:~# ifup eth0

TFTP

Para configurar o TFTP, instale o servidor TFTP tftpd-hpa na máquina local:

usuario@local:~# apt install tftpd-hpa

Confira se o servidor TFTP está rodando corretamente:

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):

# /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:

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:

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:

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):

# /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:

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:

# /etc/default/nfs-kernel-server
 
RPCNFSDARGS="-H 192.168.42.2"

Reinicie o servidor para que as mudanças tenham efeito:

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.

# 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:

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: 

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:

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:

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://www.beagleboard.org/

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/

https://sebinsebastian.hashnode.dev/creating-a-bootable-sd-card-for-beaglebone-black-using-fdisk-command-line

https://linuxhint.com/install_tftp_server_ubuntu/

https://linuxhint.com/lad-nfs-server-and-nfs-client/

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Comentários:
Notificações
Notificar
1 Comentário
recentes
antigos mais votados
Inline Feedbacks
View all comments
Bruno Dias
Bruno Dias
25/10/2023 10:49

Muito bom artigo!

Home » Linux Embarcado » Inicializando a BeagleBone Black por interface de rede

EM DESTAQUE

WEBINARS

VEJA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste: