Montando o rootfs via NFS pela interface USB
- por Sergio Prado
Acessar o sistema de arquivos via NFS facilita bastante o desenvolvimento de sistemas embarcados com Linux, já que evitamos a tediosa tarefa de atualizar o dispositivo de armazenamento (flash, cartão SD, etc) sempre que um novo rootfs for gerado.
E como o NFS é um protocolo de rede, dependemos de uma interface de rede para utilizar o NFS, certo? Errado!
Se você não tiver uma interface de rede, uma porta USB OTG pode resolver seu problema, através da configuração de um gadget de rede.
CONFIGURANDO O TARGET
Obs: o procedimento abaixo serve para qualquer placa, desde que tenha uma interface USB OTG funcional.
O primeiro passo é habilitar o driver do gadget de rede no menu de configuração do kernel em Device Drivers -> USB support -> USB Gadget Support:
<*> USB Gadget Drivers (Ethernet Gadget (with CDC Ethernet support)) ---> |
Recompile e atualize seu kernel.
Agora você precisa atualizar a linha de comandos do kernel, passando os parâmetros de conexão por NFS:
ip=192.168.0.2:192.168.0.1:192.168.0.1:255.255.255.0:hostname:usb0:off:8.8.8.8:8.8.8.8 root=/dev/nfs nfsroot=192.168.0.1:/home/sprado/rootfs/ |
A documentação sobre estes parâmetros está disponível no código-fonte do kernel em Documentation/filesystems/nfs/nfsroot.txt.
No meu exemplo, a máquina de desenvolvimento ficará o IP 192.168.0.1, o target com o IP 192.168.0.2, e o diretório do rootfs em /home/sprado/rootfs/. Mude estes parâmetros conforme a configuração da sua rede.
Fiz os testes na Beaglebone Black, e a linha de comandos do kernel ficou assim:
console=ttyO0,115200n8 ip=192.168.0.2:192.168.0.1:192.168.0.1:255.255.255.0:hostname:usb0:off:8.8.8.8:8.8.8.8 root=/dev/nfs nfsroot=192.168.0.1:/home/sprado/rootfs/ rw rootwait |
CONFIGURANDO O HOST
O último passo é configurar a sua máquina de desenvolvimento para setar o IP automaticamente quando o gadget de rede subir.
No Ubuntu, basta abrir o arquivo de configuração das interfaces:
$ sudo vim /etc/network/interfaces |
E adicionar as linhas abaixo:
auto usb0 iface usb0 inet static address 192.168.0.1 network 192.168.0.0 netmask 255.255.255.0 broadcast 192.168.0.255 gateway 192.168.0.1 |
No próximo boot do target, o rootfs será montado por NFS através da interface USB!
[ 2.441289] IP-Config: Complete: [ 2.444716] device=usb0, hwaddr=f6:1e:be:48:88:40, ipaddr=192.168.0.2, mask=255.255.255.0, gw=192.168.0.1 [ 2.455162] host=bbb, domain=, nis-domain=(none) [ 2.460478] bootserver=192.168.0.1, rootserver=192.168.0.1, rootpath= [ 2.467479] nameserver0=8.8.8.8, nameserver1=8.8.8.8 [ 2.473322] ALSA device list: [ 2.476448] #0: TI BeagleBone Black [ 2.485601] VFS: Mounted root (nfs filesystem) on device 0:12. [ 2.492137] devtmpfs: mounted [ 2.495520] Freeing init memory: 216K Starting logging: OK Initializing random number generator... done. Starting network... ip: RTNETLINK answers: File exists Welcome to Buildroot buildroot login: root # # mount rootfs on / type rootfs (rw) 192.168.0.1:/home/sprado/workspace/build/boards/bbb/rootfs/nfs/ on / type nfs (rw,relatime,vers=2,rsize=4096,wsize=4096,namlen=255,hard,nolock,proto=udp,timeo=10,retrans=3,sec=sys,mountaddr=192.168.0.1,mountvers=1,mountproto=udp,local_lock=all,addr=192.168.0.1) devtmpfs on /dev type devtmpfs (rw,relatime,size=255164k,nr_inodes=63791,mode=755) proc on /proc type proc (rw,relatime) devpts on /dev/pts type devpts (rw,relatime,gid=5,mode=620) tmpfs on /dev/shm type tmpfs (rw,relatime,mode=777) tmpfs on /tmp type tmpfs (rw,relatime) sysfs on /sys type sysfs (rw,relatime) # |
Um abraço,
Sergio Prado
Sem Comentários
Nenhum comentário até agora... é a sua chance de ser o primeiro a comentar!