Yocto Setup TFTP/NFS

From Variscite Wiki


VAR-SOM-AM62 - Yocto Setup TFTP/NFS

Running Yocto rootfs on Variscite board using TFTP & NFS

On the Host

Prepare the rootfs folder:

$ cd ~/var-ti-yocto
$ sudo mkdir rootfs
$ cd rootfs
$ sudo tar --zstd -xvf ../build/arago-tmp-default-glibc/deploy/images/am62x-var-som/var-default-image-am62x-var-som.tar.zst

Make sure the NFS server is installed:

$ sudo apt-get install nfs-kernel-server


Edit /etc/exports. E.g.

$ sudo nano /etc/exports

...and add the following line to it (replace <uname> with the actual username):

/home/<uname>/var-fslc-yocto/rootfs    *(rw,sync,no_root_squash,no_all_squash,no_subtree_check) 


Restart the NFS server:

$ sudo /etc/init.d/nfs-kernel-server restart

Make sure the TFTP server is installed:

# Ubuntu 24.04 and newer
$ sudo apt-get install xinetd tftpd-hpa tftp-hpa

# Ubuntu 22.04 and older
$ sudo apt-get install xinetd tftpd tftp

Configure tftpd-hpa for Ubuntu 24.04 and newer:

$ sudo nano /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure"

Configure tftpd for Ubuntu 22.04 and older:

$ ls /usr/sbin/in.tftpd
$ sudo nano /etc/xinetd.d/tftp
service tftp
{
	protocol = udp
	port = 69
	socket_type = dgram
	wait = yes
	user = nobody
	server = /usr/sbin/in.tftpd
	server_args = /tftpboot
	disable = no
}

and run:

$ sudo mkdir /tftpboot
$ sudo chmod -R 777 /tftpboot
$ sudo systemctl restart xinetd
$ sudo systemctl restart tftpd-hpa


$ cd ~/var-ti-yocto/build/
$ sudo cp arago-tmp-default-glibc/deploy/images/am62x-var-som/Image /tftpboot
$ for f in arago-tmp-default-glibc/deploy/images/am62x-var-som/*.dtb; do if [[ -L $f ]] && [[ $f != *am62x-var-som.dtb ]]; then sudo cp $f /tftpboot; fi done
$ sudo rename 's/Image-//' /tftpboot/Image-*.dtb



Make adjustments to the rootfs:

When using NetworkManager on the target, configure NetworkManager not to manage the interface used for the NFS boot by adding the following to /home/<uname>/var-fslc-yocto/rootfs/etc/NetworkManager/NetworkManager.conf:

[keyfile]
unmanaged-devices=interface-name:eth0

Enable DNS:

$ sudo ln -fs /proc/net/pnp /home/<uname>/var-fslc-yocto/rootfs/etc/resolv.conf

On the Target

Update the U-Boot enviroment by adding the following lines to the uEnv.txt file on the SD card/eMMC boot partition:

svrip=<HOST_IP_ADDRESS>  (replace <HOST_IP_ADDRESS> with the actual IP address of your host - run 'ifconfig' on the host to get it)
ipaddr=<TARGET_IP_ADDRESS> (replace <TARGET_IP_ADDRESS> with the IP address for the target)
image=Image

rootpath=/home/<uname>/var-fslc-yocto/rootfs
fdtfile=k3-am625-var-som-symphony.dtb

netargs=setenv bootargs console=${console} ${optargs} root=/dev/nfs nfsroot=${serverip}:${rootpath},nolock,v3 rw ip=${ipaddr}:::::eth0

netboot=tftp ${loadaddr} ${image}; tftp ${fdtaddr} ${fdtfile}; run netargs; booti ${loadaddr} - ${fdtaddr}

uenvcmd=setenv serverip ${svrip}; setenv ipaddr ${ipaddr}; run netboot

You are all set. Connect the target board to the same network as the host using an Ethernet cable, power cycle it and it should boot over NFS.