在Imx8m mini 上通过TFTP实现NFS启动

为方便调试和下载代码可以使用u-boot通过TFTP来下载代码和网络启动,以下描述如何实现通过TFTP来实现网络文件系统的启动

  1. 主机的TFTP服务的设置(Trivial File Transfer Protocol)主机为ubuntu系统或对应的虚拟机。

如果已经安装就请忽略

$ sudo apt-get install tftpd-hpa

(注意:在各种论坛中都有很多示例,这些示例如何自动启动TFTP服务,但似乎并非所有示例在所有Linux发行版上都成功!以下内容可能对您有用。)

通过向/etc/rc.local添加命令来自动启动tftpd-hpa服务。

$ vi /etc/rc.local

在 exit0 行之前,添加如下命令,然后单击“保存并退出”。

$ service tftpd-hpa start

现在,要从命令行控制TFTP服务,请使用:

$ service tftpd-hpa restart

若要从命令行检查TFTP服务的状态,请使用:

$ service tftpd-hpa status


  1. 设置TFTP的目录

创建一个目录,里面包含kernel image和 device tree blob文件

$ mkdir  /tftpboot

拷贝kernel image和 device tree blob文件到此目录下

$ cp fsl-imx8mm-evk.dtb /tftpboot

$ cp image /tftpboot

或者直接将TFTP的目录设置为我们的编译部署目录:

Yocto {YOCTO_BUILD_DIR}/tmp/deploy/images/{TARGET}/

 

因tftpd-hpa服务在/ tftpboot下查找请求的文件

而默认的tftpd-hpa服务的目录可能随发行版/发行版而有所不同,但要在配置文件:/ etc / default / tfptd-hpa中指定。 我们必须更改指定的目录,即上述所创建的目录 /tftpboot

编辑default tftp directory

$ vi /etc/default/tftpd-hpa

在里面添加

TFTP_DIRECTORY=” /tftpboot”

或者

TFTP_DIRECTORY=” {YOCTO_BUILD_DIR}/tmp/deploy/images/{TARGET}/”

然后重启 TFTP service

$ service tftpd-hpa restart

 

以上TFTP server安装完毕,

或者百度搜索,按tftpd xinetd的方法安装也可以。

 

  1. NFS的设置

在主机上安装 NFS server

$ sudo apt-get install nfs-kernel-server

启动NFS service

$ service nfs-kernel-server restart

在命令行中检查NFS service 启动状态

$ service nfs-kernel-server status


  1. 设置NFS的目录

必须创建一个目录包含rootfs (root file system)

$ mkdir -p /tftpboot/rootfs_imx8mm

然后拷贝rootfs 到此目录下

$ cp -R {YOCTO_BUILD_DIR}/tmp/work/{TARGET}-poky-linux-gnueabi/{IMAGE}/1.0-r0/rootfs/* /tftpboot/rootfs_imx8mm

或者使用yocto项目目录的默认目录

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

  1. 更新 NFS Export File

要正确访问主机指定的NFS filesystem 的目录,NFS server要求必须正确配置/etc/exports

$ vi /etc/exports

在里面添加

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

    如我的板子:

/tftpboot/rootfs_imx8mm/ 10.86.* (rw,sync,no_root_squash,no_subtree_check)

或者

/{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)

 

然后,重新启动 NFS service.

$ service nfs-kernel-server restart

  1. 目标板子的设置

设置板子的网络IP和一些uboot环境变量值。

板子上电后,敲回车键进入u-boot环境设置,设置如下参数

U-Boot > setenv serverip 10.86.133.200  //设置主机服务器的IP地址,在主机上用ifconfig查看

设置主机上存放rootfs的路径:

U-Boot > setenv nfsroot /tftpboot/rootfs_imx8mm

其他一些设置:

U-Boot > setenv image Image

U-Boot > setenv fdt_file fsl-imx8mm-evk.dtb

U-Boot >setenv rootfsinfo 'setenv bootargs ${bootargs} console=${console},${baudrate} ${smp} root=/dev/nfs ip=dhcp nfsroot=${serverip}:/tftpboot/rootfs_imx8mm,v3,tcp'

U-Boot > setenv bootcmd_net 'run rootfsinfo; dhcp ${image}; dhcp ${fdt_addr} ${fdt_file}; booti ${loadaddr} - ${fdt_addr}'

U-Boot > setenv bootcmd 'run bootcmd_net'

 

像其他的一些环境变量,uboot中默认已经有了,就不重复了。

loadaddr = 0x40480000

fdt_addr = 0x43000000

 

最后,保存环境变量,然后复位。

U-Boot >saveenv

U-Boot >reset

 

如下为所有环境变量:

 

u-boot=> printenv

baudrate=115200

boot_fdt=try

bootargs=console=ttymxc1,115200 earlycon=ec_imx6q,0x30890000,115200,115200 root=/dev/nfs ip=dhcp nfsroot=10.86.133.200:/tftpboot/rootfs_imx8mm,v3,tcp console=ttymxc1,115200 earlycon=ec_imx6q,0x30890000,115200,115200 root=/dev/nfs ip=dhcp nfsroot=10.86.133.200:/tftpboot/rootfs_imx8mm,v3,tcp

bootcmd=echo Booting from net(NFS) ...; run bootcmd_net

bootcmd_mfg=run mfgtool_args;if iminfo ${initrd_addr}; then if test ${tee} = yes; then bootm ${tee_addr} ${initrd_addr} ${fdt_addr}; else booti ${loadaddr} ${initrd_addr} ${fdt_addr}; fi; else echo "Run fastboot ..."; fastboot 0; fi;

bootcmd_net=run rootfsinfo; dhcp ${image}; dhcp ${fdt_addr} ${fdt_file}; booti ${loadaddr} - ${fdt_addr}

bootdelay=2

bootfile=fsl-imx8mm-evk.dtb

bootscript=echo Running bootscript from mmc ...; source

console=ttymxc1,115200 earlycon=ec_imx6q,0x30890000,115200

emmc_dev=1

ethact=ethernet@30be0000

ethaddr=00:04:9f:05:fa:a3

ethprime=FEC

fastboot_dev=mmc0

fdt_addr=0x43000000

fdt_file=fsl-imx8mm-evk.dtb

fdt_high=0xffffffffffffffff

fdtcontroladdr=bc908500

fileaddr=43000000

filesize=a8d3

image=Image

initrd_addr=0x43800000

initrd_high=0xffffffffffffffff

ipaddr=10.86.133.10

jh_clk=

jh_mmcboot=mw 0x303d0518 0xff; setenv fdt_file fsl-imx8mm-evk-root.dtb;setenv jh_clk clk_ignore_unused; if run loadimage; then run mmcboot; else run jh_netboot; fi;

jh_netboot=mw 0x303d0518 0xff; setenv fdt_file fsl-imx8mm-evk-root.dtb; setenv jh_clk clk_ignore_unused; run netboot;

kboot=booti

loadaddr=0x40480000

loadbootscript=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};

loadfdt=fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_file}

loadimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image}

mfgtool_args=setenv bootargs console=${console},${baudrate} rdinit=/linuxrc clk_ignore_unused

mmcargs=setenv bootargs ${jh_clk} console=${console} root=${mmcroot}

mmcautodetect=yes

mmcboot=echo Booting from mmc ...; run mmcargs; if test ${boot_fdt} = yes || test ${boot_fdt} = try; then if run loadfdt; then booti ${loadaddr} - ${fdt_addr}; else echo WARN: Cannot load the DT; fi; else echo wait for boot; fi;

mmcdev=0

mmcpart=1

mmcroot=/dev/mmcblk1p2 rootwait rw

netargs=setenv bootargs ${jh_clk} console=${console} root=/dev/nfs ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp


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} ${loadaddr} ${image}; if test ${boot_fdt} = yes || test ${boot_fdt} = try; then if ${get_cmd} ${fdt_addr} ${fdt_file}; then booti ${loadaddr} - ${fdt_addr}; else echo WARN: Cannot load the DT; fi; else booti; fi;

netmask=255.255.255.0

rootfsinfo=setenv bootargs ${bootargs} console=${console},${baudrate} ${smp} root=/dev/nfs ip=dhcp nfsroot=${serverip}:/tftpboot/rootfs_imx8mm,v3,tcp

script=boot.scr

sd_dev=0

serverip=10.86.133.200

soc_type=imx8mm

Environment size: 2973/4092 bytes

 

 

然后执行网络启动,结果如下:

 

u-boot=> run bootcmd_net

BOOTP broadcast 1

DHCP client bound to address 10.86.133.10 (15 ms)

Using ethernet@30be0000 device

TFTP from server 10.86.133.200; our IP address is 10.86.133.10

Filename 'Image'.

Load address: 0x40480000

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

         3.3 MiB/s

done

Bytes transferred = 23542272 (1673a00 hex)

BOOTP broadcast 1

DHCP client bound to address 10.86.133.10 (7 ms)

Using ethernet@30be0000 device

TFTP from server 10.86.133.200; our IP address is 10.86.133.10

Filename 'fsl-imx8mm-evk.dtb'.

Load address: 0x43000000

Loading: #########

         2.9 MiB/s

done

Bytes transferred = 43219 (a8d3 hex)

## Flattened Device Tree blob at 43000000

   Booting using the fdt blob at 0x43000000

   Using Device Tree in place at 0000000043000000, end 000000004300d8d2

 

Starting kernel ...

 

[    0.000000] Booting Linux on physical CPU 0x0

[    0.000000] Linux version 4.14.98-05983-g5d6cbea (sac-m@ubuntu01) (gcc version 7.3.0 (GCC)) #1 SMP PREEMPT Wed Sep 18 15:08:08 CST 2019

[    0.000000] Boot CPU: AArch64 Processor [410fd034]

[    0.000000] Machine model: FSL i.MX8MM EVK board

 

挂载成功的关键log 如下:

 

[   59.032872] IP-Config: Got DHCP answer from 10.86.133.254, my address is 10.86.133.10

[   59.040714] IP-Config: Complete:

[   59.043959]      device=eth0, hwaddr=00:04:9f:05:fa:a3, ipaddr=10.86.133.10, mask=255.255.255.0, gw=10.86.133.251

[   59.054236]      host=10.86.133.10, domain=, nis-domain=(none)

[   59.060078]      bootserver=0.0.0.0, rootserver=10.86.133.200, rootpath=     nameserver0=10.86.175.240, nameserver1=10.86.175.239

[   59.087842] ALSA device list:

[   59.090841]   #0: wm8524-audio

[   59.093896]   #1: imx-spdif

[   59.096759]   #2: imx-audio-micfil

[   59.123407] VFS: Mounted root (nfs filesystem) readonly on device 0:16.

[   59.131572] devtmpfs: mounted

[   59.134889] Freeing unused kernel memory: 1280K

[   59.664582] systemd[1]: System time before build time, advancing clock.

[   59.734250] systemd[1]: systemd 237 running in system mode. (+PAM -AUDIT -SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP -LIBCRYPTSETUP -GCRYPT -GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID -ELFUTILS +KMOD -IDN2 -IDN -PCRE2 default-hierarchy=hybrid)

[   59.755959] systemd[1]: Detected architecture arm64.

 

Welcome to NXP i.MX Release Distro 4.14-sumo (sumo)!

 

[   59.790920] systemd[1]: Set hostname to .

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论