Boot I.MX6q SABRE over the Network using TFTP and NFS

Document created by ANKIT PATEL on Apr 24, 2018Last modified by ANKIT PATEL on May 24, 2018
Version 2Show Document
  • View in full screen mode

Host TFTP and NFS Configuration

 

Now configure the Trivial File Transfer Protocol (TFTP) server and Networked File System (NFS) server. U-Boot will download the Linux kernel and dtb file using tftp and then the kernel will mount (via NFS) its root file system on the computer hard drive.

 

1. TFTP Setup

 

1.1.1 Prepare the TFTP Service

 

Get the required software if not already set up. On host for TFTP:

 

Install TFTP on Host
$ sudo apt-get install tftpd-hpa

 

(Note: There are a number of examples in various forums, etc, of how to automatically start the TFTP service - but not all are successful on all Linux distro's it seems! The following may work for you.)

 

Start the tftpd-hpa service automatically by adding a command to /etc/rc.local.
$ vi /etc/rc.local

 

 

Now, just before the exit 0 line edit below command then Save and Exit.
service tftpd-hpa start 

 

 

Now, To control the TFTP service from the command line use:
service tftpd-hpa restart 

 

 

To check the status of the TFTP service from the command line use:
service tftpd-hpa status

 

 

1.1.1 Setup the TFTP Directories

 

Now, we have to create the directory which will contain the kernel image and the device tree blob file.

mkdir -p /imx-boot/imx6q-sabre/tftp

 

 

Then, copy the kernel image and the device tree blob file in this directory.

$ cp {YOCTO_BUILD_DIR}/tmp/deploy/images/{TARGET}/zImage /imx-boot/imx6q-sabre/tftp

$ cp {YOCTO_BUILD_DIR}/tmp/deploy/images/{TARGET}/<dtb file> /imx-boot/imx6q-sabre/tftp

 

 

OR

 

we can use the default directory created by yocto {YOCTO_BUILD_DIR}/tmp/deploy/images/{TARGET}/



The tftpd-hpa service looks for requested files under /imx-boot/imx6q-sabre/tftp

The default tftpd-hpa directory may vary with distribution/release, but it is specified in the configuration file: /etc/default/tfptd-hpa. We have to change this default directory with our directory

 

Edit default tftp directory
$ vi /etc/default/tftpd-hpa

 

Now, change the directory defined as TFTP_DIRECTORY with your host system directory which contains kernel and device tree blob file.

 

Using created directory
TFTP_DIRECTORY=”/imx-boot/imx6q-sabre/tftp

 

OR

 

Using Yocto directory path
TFTP_DIRECTORY=”{YOCTO_BUILD_DIR}/tmp/deploy/images/{TARGET}

 

Restart the TFTP service if required
service tftpd-hpa restart

 

1.2 NFS Setup

 

1.2.1 Prepare the NFS Service

 

Get the required software if not already set up. On host for NFS:

 

Install NFS on Host
sudo apt-get install nfs-kernel-server

 

The NFS service starts automatically. To control NFS services :
service nfs-kernel-server restart

 

To check the status of the NFS service from the command line :
service nfs-kernel-server status

 

 

 

1.2.2 Setup the NFS Directories

 

Now, we have to create the directory which will contain the root file system.
mkdir -p /imx-boot/imx6q-sabre/nfs

 

Then, copy the rootfs in this directory.
cp -R {YOCTO_BUILD_DIR}/tmp/work/{TARGET}-poky-linux-gnueabi/{IMAGE}/1.0-r0/rootfs/* /imx-boot/imx6q-sabre/nfs

 

OR

 

we can use the default directory created by yocto.
{YOCTO_BUILD_DIR}/tmp/work/{TARGET}-poky-linux-gnueabi/{IMAGE}/1.0-r0/rootfs

 

1.2.3 Update NFS Export File

 

The NFS server requires /etc/exports to be configured correctly to access NFS filesystem directory to specific hosts.
$ vi /etc/exports

 

 

Then, edit below line into the opened file.

<”YOUR NFS DIRECTORY”> <YOUR BOARD IP>(rw,sync,no_root_squash,no_subtree_check)

 

Ex.

If you created custom directory for NFS then,

/imx-boot/imx6q-sabre/nfs <YOUR BOARD IP>(rw,sync,no_root_squash,no_subtree_check)

 

OR

 

/{YOCTO_BUILD_DIR}/tmp/work/{TARGET}-poky-linux-gnueabi/{IMAGE}/1.0-r0/rootfs <YOUR BOARD IP>(rw,sync,no_root_squash,no_subtree_check)

 

 

Now, we need to restart the NFS service.
service nfs-kernel-server restart

 

2 Target Setup

 

We need to set up the network IP address of our target.

 

Power On the board and hit a key to stop the U-Boot from continuing. Set the below parameters,

setenv serverip 192.168.0.206       //This must be your Host IP address

setenv ipaddr 192.168.1.102          // This must be your target IP address

setenv ip_dyn no

 

The path where the rootfs is placed in our host has to be indicated in the U-Boot,

Ex.

// if you choose default folder created by YOCTO

setenv nfsroot /{YOCTO_BUILD_DIR}/tmp/work/{TARGET}-poky-linux-gnueabi/{IMAGE}/1.0-r0/rootfs

 

OR

 

// if you create custom directory for NFS

setenv nfsroot /imx-boot/imx6q-sabre/nfs

 

 

Now, we have to set kernel image name and device tree blob file name in the u-boot,

setenv image < zImage name >

setenv fdt_file <dtb file name on host>

 

 

Now, set the bootargs for the kernel boot,
setenv netargs 'setenv bootargs console=${console},${baudrate} ${smp} root=/dev/nfs ip={ipaddr} nfsroot=${serverip}:${nfsroot},v3,tcp'

 

Use printenv command and check loadaddr and fdt_addr environment variables variables for I.MX6Q SABRE,

loadaddr=0x12000000

fdt_addr=0x18000000

 

Also, check netboot environment variable. It should be like below,
netboot=echo Booting from net ...; run netargs; if test ${ip_dyn} = yes; then setenv get_cmd dhcp; else setenv get_cmd tftp; fi; ${get_cmd} ${image}; if test ${boot_fdt} = yes || test ${boot_fdt} = try; then if ${get_cmd} ${fdt_addr} ${fdt_file}; then bootz ${loadaddr} - ${fdt_addr}; else if test ${boot_fdt} = try; then bootz; else echo WARN: Cannot load the DT; fi; fi; else bootz; fi;

 

Now, set environment variable bootcmd to boot every time from the network,
setenv bootcmd run netboot

 

Now finally save those variable in u-boot:
saveenv

 

Reset your board; it should now boot from the network:

U-Boot 2016.03-imx_v2016.03_4.1.15_2.0.0_ga+ga57b13b (Apr 17 2018 - 17:13:43 +0530)

 (..)

Net:   FEC [PRIME]

Normal Boot

Hit any key to stop autoboot:  0

 

Booting from net ...

Using FEC device

TFTP from server 192.168.0.206; our IP address is 192.168.3.101

Filename 'zImage'.

Load address: 0x12000000

Loading: #################################################################

        #################################################################

        #################################################################

        #################################################################

        #################################################################

        #################################################################

        ###########################################################

        2.1 MiB/s

done

Bytes transferred = 6578216 (646028 hex)

Using FEC device

TFTP from server 192.168.0.206; our IP address is 192.168.3.101

Filename 'imx6q-sabresd.dtb'.

Load address: 0x18000000

Loading: ####

        1.8 MiB/s

done

Bytes transferred = 45893 (b345 hex)

Kernel image @ 0x12000000 [ 0x000000 - 0x646028 ]

## Flattened Device Tree blob at 18000000

  Booting using the fdt blob at 0x18000000

  Using Device Tree in place at 18000000, end 1800e344

switch to ldo_bypass mode!

 

Starting kernel ...

Attachments

    Outcomes