Booting a customised NFS system
It is possible to boot LowRISC in the absence of an SD-Card. This is useful if a large number of files are shared with a Host PC. However there are many variables to be considered which would be inconvenient to hardwire into the binary builds.
We will use the boot selection switches to choose a customised boot option. Prepare a file as follows:
mount -t proc none /proc
udhcpc -s /usr/share/udhcpc/default.script
rdate -s 132.163.97.4 # This should be replaced by a local server
echo Mounting NFS root
mount.nfs -o nolock 128.232.65.94:/local/scratch/debian-riscv64 /nfs # This should be updated appropriately
echo Mounting proc
mkdir -p /nfs/proc
mount -t proc none /nfs/proc
echo Mounting sysfs
mkdir -p /nfs/sys
mount -t sysfs none /nfs/sys
echo Mounting devtmpfs
mkdir -p /nfs/dev
mount -t devtmpfs udev /nfs/dev
mkdir -p /nfs/dev/pts
echo Mounting devpts
mount -t devpts devpts /nfs/dev/pts
echo Mounting tmpfs
mkdir -p /nfs/tmp
mount -t tmpfs tmpfs /nfs/tmp
mkdir -p /run
mount -t tmpfs tmpfs /run
umount /proc
echo Executing switch_root for nfs
exec switch_root /nfs /sbin/init
This file should be saved as 5022.sh on the DOS partition of the SD-Card. The FPGA board switches should be set to match this value (in hex). Referring to the table in Build the Linux Kernel, it is clear that this means SD-boot, Custom-root, MAC ending in 5.
If it is desired to boot the NFS Client kernel over the Ethernet (a common use case), the file should be called 5024.sh, corresponding to DHCP boot, Custom-root, MAC ending in 5.
Once the settings are working, it may be hardwired into an eventual rebuild of the kernel inside debian-riscv64/work/busyboxinit.sh (option 1). This option would then not require the SD-Card and it could be reinitialised with a different O/S or any other action requiring full unrestricted access to the card.
On your PC-workstation/server, create a suitable NFSroot mount point (replace the IP address of your FPGA board as necessary):
sudo mkdir -p /local/scratch/debian-riscv64
sudo vi /etc/xinetd.d/time
#Change the first occurence of "disable=yes" to "disable=no". This enables the time service.
sudo /etc/init.d/xinetd restart
sudo /etc/init.d/nfs-kernel-server stop
sudo vi /etc/exports
#Add the following to the end of the file.
/local/scratch/debian-riscv64 192.168.0.51(rw,sync,no_subtree_check,no_root_squash)
cd /local/scratch/debian-riscv64
sudo tar xJf $TOP/rootfs.tar.xz
#Restart the NFS server
sudo /etc/init.d/nfs-kernel-server start
The dangerous option no_root_squash which allows the NFS client to run as root on the server, may be mitigated by the confinement of the mount to a loopback mount which we can easily set up (not shown, refer to the ethernet-v0.5 release for a suitable example). If access to host files is desired this may be done by copying on the host, or with a second mount point without no_root_squash inside the server’s filing system
Turbo super-user
It is certainly inconvenient requiring slow card operations during normal use. The use of a turbo super-user on the workstation
sudo chroot /local/scratch/debian-riscv64
will rapidly allow the NFSroot to be customised for any possible application. For example if ocaml is to be installed, it can be done in a chroot on the PC, and it will immediately be available on the LowRISC without having to reboot or swap any cards.
This is in essence the best of both worlds, the security of knowing that the software runs on the FPGA, at the same time the convenience and speed of installing on the PC.