NXP iMX8MM 通過(guò) TFTP和 NFS 啟動(dòng)示例
1). 簡(jiǎn)介
嵌入式 Linux 設(shè)備開(kāi)發(fā)調(diào)試時(shí)候?yàn)榱朔奖悴渴鸶鞣N配置和修改常用的一種方法就是通過(guò)網(wǎng)絡(luò)啟動(dòng),具體就是將 Linux Kernel(以及 Device tree/Device Tree overlays) 從開(kāi)發(fā)主機(jī)的 TFTP 服務(wù)加載, Linux rootfs 通過(guò)開(kāi)發(fā)主機(jī)的 NFS 服務(wù)加載,這樣開(kāi)發(fā)過(guò)程中的功能配置或者文件修改就能直接在開(kāi)發(fā)主機(jī)上面完成,而無(wú)需先復(fù)制到設(shè)備端再部署。本文就基于 NXP iMX8MM ARM嵌入式平臺(tái)演示 TFTP/NFS 啟動(dòng)的簡(jiǎn)單示例。
本文所演示的平臺(tái)來(lái)自于Toradex Verdin iMX8MM 嵌入式平臺(tái),基于 NXP iMX8M Mini 系列 ARM 處理器,核心為 Cortex-A53 。
2). 硬件準(zhǔn)備
a). Verdin iMX8MM ARM 核心版配合 Dahlia Carrier Board 載板,并連接調(diào)試串口以便測(cè)試。
b). Verdin iMX8MM 核心版 Boot ROM 啟動(dòng)選項(xiàng)已經(jīng) fuse ,因此 Bootloader (U-Boot) 必須要從模塊 eMMC啟動(dòng),所以先參考這里說(shuō)明更新當(dāng)前最新的 Toradex Ycoto Linux Reference Multimedia Image V6.4 到核心板 eMMC。
c). Verdin iMX8MM 設(shè)備平臺(tái)網(wǎng)口和開(kāi)發(fā)主機(jī)單獨(dú)用于開(kāi)發(fā)的網(wǎng)口直連,如下圖所示。由于需要在開(kāi)發(fā)主機(jī)配置 DHCP 服務(wù),因此不建議將設(shè)備和開(kāi)發(fā)主機(jī)直接連接到工作網(wǎng)絡(luò),以免多個(gè) DHCP 服務(wù)器沖突。
d). 從這里下載 Toradex Ycoto Linux Reference Multimedia Image Quartely 6.4.0 版本到開(kāi)發(fā)主機(jī)并解壓,以便后續(xù)部署。
---------------------------------------
$ 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
總計(jì) 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). 開(kāi)發(fā)主機(jī)部署 DHCP/TFTP/NSF 服務(wù)
a). 本文示例以 Ubuntu 22.04 64bit 環(huán)境為例,其他環(huán)境可以參考這里或者其對(duì)應(yīng)發(fā)行版本的相關(guān)說(shuō)明。
b). 配置 DHCP 服務(wù)
./ 安裝 DHCP Server
---------------------------------------
$ sudo apt-get install isc-dhcp-server
---------------------------------------
./ 如下修改 /etc/dhcp/dhcpd.conf 配置文件
---------------------------------------
--- a/etc/dhcp/dhcpd.conf 2023-12-21 11:31:13.460674880 +0800
+++ b/etc/dhcp/dhcpd.conf 2023-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";
---------------------------------------
// 配置文件中,開(kāi)發(fā)主機(jī)上面和設(shè)備連接的網(wǎng)口名為 “enx000ec6cbab91”,需要根據(jù)你的實(shí)際網(wǎng)口名對(duì)應(yīng)修改。
// 由于 Verdin iMX8MM U-Boot 環(huán)境變量中默認(rèn)如下配置 IP Address 信息,因此這里將開(kāi)發(fā)主機(jī)網(wǎng)口 IP Address 直接配置為 192.168.10.1,否則就需要對(duì)應(yīng)修改設(shè)備 U-Boot 環(huán)境變量定義。
---------------------------------------
Verdin iMX8MM # print serverip
serverip=192.168.10.1
Verdin iMX8MM # print ipaddr
ipaddr=192.168.10.2
---------------------------------------
// “host eval” 部分配置用于后續(xù) NFS 啟動(dòng),其中 “hardware ethernet” 是你實(shí)際使用的 Verdin iMX8MM 網(wǎng)口的 MAC 地址。這里配置是對(duì)應(yīng) NFSv3 協(xié)議,如果是 NFSv4 可以參考這里配置,但是需要注意 DHCP 服務(wù)配置這里和下面 NFS 服務(wù)配置協(xié)議版本必須對(duì)應(yīng)。
./啟動(dòng) DHCP 服務(wù),然后可以讓 Verdin iMX8MM 模塊通過(guò) eMMC 正常啟動(dòng)后,查看網(wǎng)口 eth0 是否正常通過(guò)上面設(shè)置的 DHCP 服務(wù)器獲取到 192.168.10.2 IP Address 來(lái)驗(yàn)證 DHCP 服務(wù)。
---------------------------------------
$ sudo service isc-dhcp-server start
---------------------------------------
c). 配置 TFTP 服務(wù)
./ 安裝 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"
---------------------------------------
./復(fù)制 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/
總計(jì) 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
---------------------------------------
./啟動(dòng) TFTP 服務(wù),然后可以通過(guò)另外一臺(tái) Linux 主機(jī)通過(guò)安裝 TFTP 客戶端來(lái)測(cè)試下 TFTP 服務(wù)是否正確配置成功。
---------------------------------------
$ sudo service tftpd-hpa start
---------------------------------------
d). 配置 NFS 服務(wù)
./ 安裝 NFS Server
---------------------------------------
$ sudo apt-get install nfs-kernel-server
---------------------------------------
./ NFSv3 配置文件,對(duì)應(yīng)上面 DHCP host eval配置;如果是 NFSv4 配置,可以參考這里。
---------------------------------------
#/etc/exports
/srv/nfs/rootfs 192.168.10.2(no_root_squash,no_subtree_check,rw)
---------------------------------------
./創(chuàng)建 NFS 文件目錄,然后復(fù)制 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/
總計(jì) 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 默認(rèn)使用 connman 來(lái)管理網(wǎng)絡(luò),而在 NFS rootfs 加載過(guò)程中如果啟動(dòng) connman,會(huì)導(dǎo)致網(wǎng)口重置,使得 NFS 服務(wù)中斷無(wú)法啟動(dòng)成功,因此需要如下修改 rootfs 以規(guī)避這個(gè)問(wèn)題。
---------------------------------------
--- a/lib/systemd/system/connman.service 2023-12-21 17:35:38.874742678 +0800
+++ b/lib/systemd/system/connman.service 2023-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
---------------------------------------
./啟動(dòng) NFS 服務(wù)
---------------------------------------
$ sudo service nfs-kernel-server restart
---------------------------------------
./ 在 Verdin iMX8MM Ycoto Linux 上面可以通過(guò)下面命令測(cè)試 NFS 服務(wù)是否配置成功
---------------------------------------
root@verdin-imx8mm-07276322:~# mount -t nfs -o vers=3 192.168.10.1:/srv/nfs/rootfs
---------------------------------------
4). Verdin iMX8MM 設(shè)備通過(guò) TFTP/NFS 啟動(dòng)
a). Verdin iMX8MM 調(diào)試串口進(jìn)入 U-Boot 命令行,執(zhí)行下面命令即可完成 TFTP/NFS 啟動(dòng)
---------------------------------------
Verdin iMX8MM # run bootcmd_dhcp
---------------------
5). 總結(jié)
本文基于NXP iMX8MM嵌入式平臺(tái)演示了 TFTP/NFS 啟動(dòng)示例。
參考文檔
https://developer.toradex.cn/linux-bsp/os-development/boot/boot-from-a-tftpnfs-server/
提交
Verdin AM62 LVGL 移植
基于 NXP iMX8MM 測(cè)試 Secure Boot 功能
隆重推出 Aquila - 新一代 Toradex 計(jì)算機(jī)模塊
Verdin iMX8MP 調(diào)試串口更改
NXP iMX8MM Cortex-M4 核心 GPT Capture 測(cè)試