Montando o rootfs via NFS pela interface USB

- por Sergio Prado

Categorias: Linux Tags: , ,

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!

Faça um Comentário

Navegue
Creative Commons Este trabalho de Sergio Prado é licenciado pelo
Creative Commons BY-NC-SA 3.0.