How to use root NFS file system

From RidgeRun Developer Wiki

Background

When you are developing applications, it is convenient to rebuild and deploy the application without having to update NAND flash or the SD card file system image. This can be done using a technology called NFS root file system.

Target refers to the hardware with the Soc. Host refers to the Linux desktop machine.


[Setting Up A NFS Service] explains how to configure your Linux desktop machine to support being an NFS server.

Set target IP address

You can either use DHCP or a fixed IP address. Run

make -C $DEVDIR config

and in the Generic SDK configuration menu select or unselect Use DHCP and set fixed IP address parameters as necessary.

NFS root configuration

You File System Configuration need to tell the SDK to build the kernel command line specifying the NFS root file system path. Run

make -C $DEVDIR config

and in the File System Configuration menu set the File system image target to NFS root file system.

Rebuild image

Now you can rebuild the target image and install to the target hardware.

cd $DEVDIR
make cmdline
make
make install

Verifying proper configuration

bspconfig file contents

The following configuration items should be set in your bspconfig file.

DHCP

CONFIG_BSP_NET_ETH0_USE_DHCP=y
CONFIG_IP_PNP_DHCP=y
CONFIG_BSP_NET_HAS_ETH0=y

CONFIG_FS_TARGET_NFSROOT=y
CONFIG_FEATURE_MOUNT_NFS=y
CONFIG_NFS_FS=y
CONFIG_NFS_V3=y
CONFIG_ROOT_NFS=y
CONFIG_NFS_COMMON=y

Fixed IP

CONFIG_BSP_NET_HAS_NET=y
CONFIG_BSP_NET_ETH0_IPADDR="1.111.0.77"
CONFIG_BSP_NET_ETH0_GATEWAY_IPADDR="10.111.0.1"
CONFIG_BSP_NET_ETH0_NETMASK="255.255.255.0"
CONFIG_BSP_NET_HAS_ETH0=y

CONFIG_FS_TARGET_NFSROOT=y
CONFIG_FEATURE_MOUNT_NFS=y
CONFIG_NFS_FS=y
CONFIG_NFS_V3=y
CONFIG_ROOT_NFS=y
CONFIG_NFS_COMMON=y

In addition, the target file system file /etc/network/interfaces should contain something similar to:

auto eth0
iface eth0 inet static
        address 10.111.0.176
        netmask 255.255.255.0
	gateway 10.111.0.1
	post-up /sbin/route add -net 10.111.0.0/24 dev $IFACE

Kernel command line

You can view the Linux kernel command line that will be passed by uboot to the kernel on boot. Run

cat $DEVDIR/images/cmdline 

You will get a kernel command that includes the root being set to /dev/nfs, nfsroot being set to your Linux desktop with the path set to your development directory fs/fs target directory.

If you have selected fixed IP, it will contain something similar to

root=/dev/nfs nfsroot=10.111.0.4:/local/home/tfischer/work/devdir/fs/fs rw ip=1.111.0.77:::255.255.255.0::eth0  

If you selected DHCP, it will contain something similar to

root=/dev/nfs nfsroot=10.111.0.4:/local/home/tfischer/work/devdir/fs/fs rw ip=dhcp

In both examples above, everything in the kernel command line not related to root NFS was stripped out.

Regular NFS mount

You can also do a regular NFS mount after your device has booted. You are not limited to only doing a root NFS mount.

HOST_IP=10.111.0.4
HOST_NFS_SHARE_DIR=/local/home/tfischer/work/sdk

mkdir /tmp/nfs
mount -t nfs -n -o nolock,rsize=1024,wsize=1024 $HOST_IP:$HOST_NFS_SHARE_DIR /tmp/nfs