NXP iMX8MM 通过 TFTP和 NFS 启动示例
1).简介
嵌入式Linux设备开发调试时候为了方便部署各种配置和修改常用的一种方法就是通过网络启动,具体就是将Linux Kernel(以及Device tree/Device Tree overlays)从开发主机的TFTP服务加载,Linux rootfs通过开发主机的NFS服务加载,这样开发过程中的功能配置或者文件修改就能直接在开发主机上面完成,而无需先复制到设备端再部署。本文就基于NXP iMX8MM ARM嵌入式平台演示TFTP/NFS启动的简单示例。
本文所演示的平台来自于ToradexVerdiniMX8MM嵌入式平台,基于NXP iMX8M Mini系列ARM处理器,核心为Cortex-A53。
2).硬件准备
a).Verdin iMX8MM ARM核心版配合Dahlia Carrier Board载板,并连接调试串口以便测试。
b).Verdin iMX8MM核心版Boot ROM启动选项已经fuse,因此Bootloader (U-Boot)必须要从模块eMMC启动,所以先参考这里说明更新当前最新的Toradex Ycoto Linux Reference Multimedia ImageV6.4到核心板eMMC。
c).Verdin iMX8MM设备平台网口和开发主机单独用于开发的网口直连,如下图所示。由于需要在开发主机配置DHCP服务,因此不建议将设备和开发主机直接连接到工作网络,以免多个DHCP服务器冲突。
d).从这里下载Toradex Ycoto Linux Reference Multimedia Image Quartely 6.4.0版本到开发主机并解压,以便后续部署。
---------------------------------------
$ cd
$ tar xvf Verdin-iMX8MM_Reference-Minimal-Image-upstream-Tezi_6.4.0-devel-202309+build.14.tar
$ cd Verdin-iMX8MM_Reference-Minimal-Image-upstream-Tezi_6.4.0-devel-202309+build.14/
$ ls -al
总计51684
drwxrwxr-x 2 simon simon 4096 12月21 12:15 .
drwxr-xr-x 3 simon simon 4096 12月21 12:15 ..
-rw-r--r-- 1 simon simon 2016 9月2 00:37 image.json
-rw-r--r-- 1 simon simon 1291800 9月2 00:03 imx-boot
-rw-r--r-- 1 simon simon 69050 9月1 22:22 LA_OPT_NXP_SW.html
-rw-r--r-- 1 simon simon 378880 9月1 22:22 marketing.tar
-rw-r--r-- 1 simon simon 183 9月1 22:22 prepare.sh
-rw-r--r-- 1 simon simon 12981512 9月2 00:35 Reference-Minimal-Image-upstream-verdin-imx8mm.bootfs.tar.xz
-rw-r--r-- 1 simon simon 38155936 9月2 00:37 Reference-Minimal-Image-upstream-verdin-imx8mm.tar.xz
-rw-r--r-- 1 simon simon 2434 9月1 22:22 toradexlinux.png
-rw-r--r-- 1 simon simon 4117 9月1 23:47 u-boot-initial-env-sd
-rw-r--r-- 1 simon simon 18 9月1 22:22 wrapup.sh
---------------------------------------
3).开发主机部署DHCP/TFTP/NSF服务
a).本文示例以Ubuntu 22.04 64bit环境为例,其他环境可以参考这里或者其对应发行版本的相关说明。
b).配置DHCP服务
./安装DHCP Server
---------------------------------------
$ sudo apt-get install isc-dhcp-server
---------------------------------------
./如下修改/etc/dhcp/dhcpd.conf配置文件
---------------------------------------
---a/etc/dhcp/dhcpd.conf2023-12-21 11:31:13.460674880 +0800
+++b/etc/dhcp/dhcpd.conf2023-12-21 11:44:49.647593313 +0800
@@ -7,7 +7,7 @@
#
# option definitions common to all supported networks...
-option domain-name "example.org";
+option domain-name "verdin.net";
option domain-name-servers ns1.example.org, ns2.example.org;
default-lease-time 600;
@@ -25,7 +25,7 @@
# Use this to send dhcp log messages to a different log file (you also
# have to hack syslog.conf to complete the redirection).
-#log-facility local7;
+log-facility local7;
# No service will be given on this subnet, but declaring it helps the
# DHCP server to understand the network topology.
@@ -61,11 +61,33 @@
# max-lease-time 7200;
#}
+subnet 192.168.10.0 netmask 255.255.255.0 {
+ default-lease-time 86400;
+ max-lease-time 86400;
+ option broadcast-address 192.168.10.255;
+ option domain-name "verdin.net";
+ option domain-name-servers ns1.example.org;
+ option ip-forwarding off;
+ option routers 192.168.10.1;
+ option subnet-mask 255.255.255.0;
+ interface enx000ec6cbab91;
+ range 192.168.10.32 192.168.10.254;
+}
+
# Hosts which require special configuration options can be listed in
# host statements. If no address is specified, the address will be
# allocated dynamically (if possible), but the host-specific information
# will still come from the host declaration.
+host eval {
+ filename "Image";
+ fixed-address 192.168.10.2;
+ hardware ethernet 00:14:2d:6f:07:22;
+ next-server 192.168.10.1;
+ option host-name "verdin";
+ option root-path "192.168.10.1:/srv/nfs/rootfs,wsize=1024,rsize=1024,v3";
+}
+
#host passacaglia {
# hardware ethernet 0:0:c0:5d:bd:95;
# filename "vmunix.passacaglia";
---------------------------------------
//配置文件中,开发主机上面和设备连接的网口名为“enx000ec6cbab91”,需要根据你的实际网口名对应修改。
//由于Verdin iMX8MM U-Boot环境变量中默认如下配置IP Address信息,因此这里将开发主机网口IP Address直接配置为192.168.10.1,否则就需要对应修改设备U-Boot环境变量定义。
---------------------------------------
Verdin iMX8MM # print serverip
serverip=192.168.10.1
Verdin iMX8MM # print ipaddr
ipaddr=192.168.10.2
---------------------------------------
//“host eval”部分配置用于后续NFS启动,其中“hardware ethernet”是你实际使用的Verdin iMX8MM网口的MAC地址。这里配置是对应NFSv3协议,如果是NFSv4可以参考这里配置,但是需要注意DHCP服务配置这里和下面NFS服务配置协议版本必须对应。
./启动DHCP服务,然后可以让Verdin iMX8MM模块通过eMMC正常启动后,查看网口eth0是否正常通过上面设置的DHCP服务器获取到192.168.10.2 IP Address来验证DHCP服务。
---------------------------------------
$ sudo service isc-dhcp-server start
---------------------------------------
c).配置TFTP服务
./安装TFTP Server
---------------------------------------
$ sudo apt-get install tftpd-hpa
---------------------------------------
./配置文件/etc/default/tftpd-hpa可以不做修改
---------------------------------------
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure"
---------------------------------------
./复制Verdin iMX8MM Linux Kernel等Boot文件到TFTP目录
---------------------------------------
$ cd
$ sudo tar Jxf Reference-Minimal-Image-upstream-verdin-imx8mm.bootfs.tar.xz -C /srv/tftp/
$ ls -al /srv/tftp/
总计13312
drwxr-xr-x 3 root root 4096 9月2 00:35 .
drwxr-xr-x 4 root root 4096 12月21 12:32 ..
-rw-r--r-- 1 root root 6010 9月2 00:35 boot.scr
-rw-r--r-- 1 root root 13211895 9月2 00:35 Image.gz
-rw-r--r-- 1 root root 62002 9月2 00:35 imx8mm-verdin-nonwifi-dahlia.dtb
-rw-r--r-- 1 root root 62246 9月2 00:35 imx8mm-verdin-nonwifi-dev.dtb
-rw-r--r-- 1 root root 62000 9月2 00:35 imx8mm-verdin-nonwifi-yavia.dtb
-rw-r--r-- 1 root root 62206 9月2 00:35 imx8mm-verdin-wifi-dahlia.dtb
-rw-r--r-- 1 root root 62446 9月2 00:35 imx8mm-verdin-wifi-dev.dtb
-rw-r--r-- 1 root root 62200 9月2 00:35 imx8mm-verdin-wifi-yavia.dtb
drwxr-xr-x 2 root root 4096 9月2 00:35 overlays
-rw-r--r-- 1 root root 47 9月2 00:35 overlays.txt
---------------------------------------
./启动TFTP服务,然后可以通过另外一台Linux主机通过安装TFTP客户端来测试下TFTP服务是否正确配置成功。
---------------------------------------
$ sudo service tftpd-hpa start
---------------------------------------
d).配置NFS服务
./安装NFS Server
---------------------------------------
$ sudo apt-get install nfs-kernel-server
---------------------------------------
./ NFSv3配置文件,对应上面DHCP host eval配置;如果是NFSv4配置,可以参考这里。
---------------------------------------
#/etc/exports
/srv/nfs/rootfs 192.168.10.2(no_root_squash,no_subtree_check,rw)
---------------------------------------
./创建NFS文件目录,然后复制Verdin iMX8MM Linux rootfs文件到NFS目录
---------------------------------------
# create NFS folder
$ sudo mkdir -p/srv/nfs/rootfs
# copy Verdin iMX8MM rootfs to NFS folder
$ cd
$ sudo tar Jxf Reference-Minimal-Image-upstream-verdin-imx8mm.tar.xz -C /srv/nfs/rootfs
$ ls -al /srv/nfs/rootfs/
总计72
drwxr-xr-x 18 root root 4096 3月9 2018 .
drwxr-xr-x 3 root root 4096 12月21 12:32 ..
drwxr-xr-x 2 root root 4096 3月9 2018 bin
drwxr-xr-x 2 root root 4096 3月9 2018 boot
drwxr-xr-x 2 root root 4096 3月9 2018 dev
drwxr-xr-x 31 root root 4096 12月21 12:43 etc
drwxr-xr-x 3 root root 4096 3月9 2018 home
drwxr-xr-x 9 root root 4096 3月9 2018 lib
drwxr-xr-x 4 root root 4096 12月21 12:43 media
drwxr-xr-x 2 root root 4096 3月9 2018 mnt
dr-xr-xr-x 2 root root 4096 3月9 2018 proc
drwxr-xr-x 2 root root 4096 3月9 2018 run
drwxr-xr-x 2 root root 4096 3月9 2018 sbin
drwxr-xr-x 2 root root 4096 3月9 2018 srv
dr-xr-xr-x 2 root root 4096 3月9 2018 sys
drwxrwxrwt 2 root root 4096 3月9 2018 tmp
drwxr-xr-x 10 root root 4096 3月9 2018 usr
drwxr-xr-x 8 root root 4096 12月21 12:43 var
---------------------------------------
./由于Toradex Ycoto Linux默认使用connman来管理网络,而在NFS rootfs加载过程中如果启动connman,会导致网口重置,使得NFS服务中断无法启动成功,因此需要如下修改rootfs以规避这个问题。
---------------------------------------
---a/lib/systemd/system/connman.service2023-12-21 17:35:38.874742678 +0800
+++b/lib/systemd/system/connman.service2023-12-21 13:37:47.435149329 +0800
@@ -7,6 +7,7 @@
Before=network.target multi-user.target shutdown.target
Wants=network.target
Conflicts=systemd-resolved.service
+ConditionKernelCommandLine=!root=/dev/nfs
[Service]
Type=dbus
---------------------------------------
./启动NFS服务
---------------------------------------
$ sudo service nfs-kernel-server restart
---------------------------------------
./在Verdin iMX8MM Ycoto Linux上面可以通过下面命令测试NFS服务是否配置成功
---------------------------------------
root@verdin-imx8mm-07276322:~# mount -t nfs -o vers=3 192.168.10.1:/srv/nfs/rootfs
---------------------------------------
4).Verdin iMX8MM设备通过TFTP/NFS启动
a). Verdin iMX8MM调试串口进入U-Boot命令行,执行下面命令即可完成TFTP/NFS启动
---------------------------------------
Verdin iMX8MM # run bootcmd_dhcp
---------------------
5).总结
本文基于NXP iMX8MM嵌入式平台演示了TFTP/NFS启动示例。
参考文档
https://developer.toradex.cn/linux-bsp/os-development/boot/boot-from-a-tftpnfs-server/
提交
NXP iMX8M Plus Qt5 双屏显示
扩展外部eMMC存储
嵌入式Linux下运行 DotNet 应用简单示例
Toradex 宣布与 NXP 合作推出采用 NXP i.MX 95 处理器的 Titan 评估套件
NXP iMX8MM 修改 UART4至 Cortex-A53 核心