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.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 |
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 |
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 |
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) Ex: /imx-boot/imx6q-sabre/nfs 192.168.*.*(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 |
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 |
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=dhcp 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 ... |
We can publish this document on community.nxp.com public portal, which can help others to utilize this.
Hi Karina,
Help me to publish this document in https://community.nxp.com/community/imx if you found this document helpful and suitable.
Let me know if there is any modification required.