工控網(wǎng)首頁(yè)
>

應(yīng)用設(shè)計(jì)

>

NXP iMX8MM 通過(guò) TFTP和 NFS 啟動(dòng)示例

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ù)器沖突。

NXP iMX8MM 通過(guò) TFTP和 NFS 啟動(dòng)示例1236.png 

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/Verdin-iMX8MM_Reference-Minimal-Image-upstream-Tezi_6.4.0-devel-202309+build.14/

$ 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/Verdin-iMX8MM_Reference-Minimal-Image-upstream-Tezi_6.4.0-devel-202309+build.14/

$ 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/application-development/how-to-setup-networking-for-embedded-linux-application-development/ 

https://developer.toradex.cn/linux-bsp/os-development/boot/boot-from-a-tftpnfs-server/

 

審核編輯(
王靜
)
投訴建議

提交

查看更多評(píng)論
其他資訊

查看更多

Verdin AM62 LVGL 移植

基于 NXP iMX8MM 測(cè)試 Secure Boot 功能

隆重推出 Aquila - 新一代 Toradex 計(jì)算機(jī)模塊

Verdin iMX8MP 調(diào)試串口更改

NXP iMX8MM Cortex-M4 核心 GPT Capture 測(cè)試