NXP iMX8MM 通过 TFTP和 NFS 启动示例

By Toradex秦海

1). 简介

嵌入式 Linux 设备开发调试时候为了方便部署各种配置和修改常用的一种方法就是通过网络启动,具体就是将 Linux Kernel(以及 Device tree/Device Tree overlays) 从开发主机的 TFTP 服务加载, Linux rootfs 通过开发主机的 NFS 服务加载,这样开发过程中的功能配置或者文件修改就能直接在开发主机上面完成,而无需先复制到设备端再部署。本文就基于 NXP iMX8MM ARM嵌入式平台演示 TFTP/NFS 启动的简单示例。

本文所演示的平台来自于Toradex Verdin iMX8MM 嵌入式平台,基于 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 Image V6.4 到核心板 eMMC。

c).  Verdin iMX8MM 设备平台网口和开发主机单独用于开发的网口直连,如下图所示。由于需要在开发主机配置 DHCP 服务,因此不建议将设备和开发主机直接连接到工作网络,以免多个 DHCP 服务器冲突。

NXP iMX8MM 通过 TFTP和 NFS 启动示例1236.png

d).  从这里下载 Toradex Ycoto Linux Reference Multimedia Image Quartely 6.4.0 版本到开发主机并解压,以便后续部署。

---------------------------------------

$ cd <work_dir>

$ 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.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";

---------------------------------------

// 配置文件中,开发主机上面和设备连接的网口名为 “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 <work_dir>/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/

总计 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 <work_dir>/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/

总计 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.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

---------------------------------------

./启动 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 <mount_dir>

---------------------------------------

4). Verdin iMX8MM 设备通过 TFTP/NFS 启动

a). Verdin iMX8MM 调试串口进入 U-Boot 命令行,执行下面命令即可完成 TFTP/NFS 启动

---------------------------------------

Verdin iMX8MM # run bootcmd_dhcp

---------------------

5). 总结

本文基于NXP iMX8MM嵌入式平台演示了 TFTP/NFS 启动示例。

参考文档

How to setup Networking for Embedded Linux Application Development | Toradex Developer Center 

Boot from a TFTP/NFS Server | Toradex Developer Center

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/222728.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

听GPT 讲Rust源代码--src/tools(18)

File: rust/src/tools/rust-analyzer/crates/ide-ssr/src/from_comment.rs 在Rust源代码中的from_comment.rs文件位于Rust分析器&#xff08;rust-analyzer&#xff09;工具的ide-ssr库中&#xff0c;它的作用是将注释转换为Rust代码。 具体来说&#xff0c;该文件实现了从注…

【即插即用篇】YOLOv8改进实战 | 引入 Involution(内卷),用于视觉识别的新一代神经网络!涨点神器!

YOLOv8专栏导航:点击此处跳转 前言 YOLOv8 是由 YOLOv5 的发布者 Ultralytics 发布的最新版本的 YOLO。它可用于对象检测、分割、分类任务以及大型数据集的学习,并且可以在包括 CPU 和 GPU 在内的各种硬件上执行。 YOLOv8是一种尖端的、最先进的 (SOTA) 模型,它建立在以前成…

Centos7在安装Graylog时新安装MongoDB报错端口不监听服务不启动无法运行启动失败

由于虚拟机服务器上需要安装Graylog需要安装MongoDB&#xff0c;尝试官网下载安装包&#xff0c;和yum安装均无法正常启动&#xff0c;折腾了好几天&#xff0c;重装了十几次&#xff0c;网上搜索了很多很多资料&#xff0c;均无法正常运行&#xff0c;百度上搜索各种文档&…

华为端口隔离简单使用方法同vlan下控制个别电脑不给互通

必须得用access接口&#xff0c;hybrid口不行 dhcp enable interface Vlanif1 ip address 192.168.1.1 255.255.255.0 dhcp select interface interface MEth0/0/1 interface GigabitEthernet0/0/1 port link-type access port-isolate enable group 1 interface GigabitEther…

Node.js-模块化(二)

1. 模块化的基本概念 1.1 什么是模块化 模块化是指解决一个复杂问题时&#xff0c;自顶向下逐层将系统拆分成若干模块的过程。对于整个系统来说&#xff0c;模块是可组合、分解和更换的单元。 1.2 编程领域中的模块化 编程领域中的模块化&#xff0c;就是遵守固定的规则&…

Python之Django项目的功能配置

1.创建Django项目 进入项目管理目录&#xff0c;比如&#xff1a;D盘 执行命令&#xff1a;diango-admin startproject demo1 创建项目 如果提示diango命令不存在&#xff0c;搜索diango-admin程序的位置&#xff0c;然后加入到环境变量path中。 进入项目&#xff0c;cd demo…

嵌入式开发网络配置——windows连热点,开发板和电脑网线直连

目录 电脑 WiFi 上网&#xff0c;开发板和电脑直连 使用场景 设置VMware虚拟机的网络配置 Ubuntu设置——版本18.04 ​编辑 windows设置 开发板设置 原因&#xff1a;虚拟机Linux移植可执行程序到开发板失败 最后发现虚拟机的Linuxping不通开发板 下面是我的解决方法 …

微软的word文档中内置背景音乐步骤(打开自动播放)

目录 一、前言 二、操作步骤 一、前言 有时候需要在word文档里面打开的时候就自动播放音乐或者音频&#xff0c;那么可以用微软的word来按照操作步骤去这样完成。 如果没有微软office的&#xff0c;可以下载这个是2021专业版的。因为office只能免费使用一段时间&#xff0c…

猜数字游戏 C语言xdoj490

问题描述 猜数字游戏是令游戏机随机产生一个 100 以内的正整数&#xff0c;用户输入一个数对其进行猜测&#xff0c;需要你编写程序自动对其与随机产生的被猜数进行比较&#xff0c;并提示大了&#xff08;“Too big”&#xff09;&#xff0c;还是小了&#xff08;“Too smal…

Java小案例-Sentinel的实现原理

前言 Sentinel是阿里开源的一款面向分布式、多语言异构化服务架构的流量治理组件。 主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 核心概念 要想理解一个新的技…

vue3引入使用高德地图,不显示地图问题

将全局引入的mockjs去除&#xff0c;就可以了。

Springboot+vue的装饰工程管理系统(有报告),Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的装饰工程管理系统&#xff08;有报告&#xff09;&#xff0c;Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的装饰工程管理系统&#xff0c;采用M&#xff08…

【uniapp】uniapp中本地存储sqlite数据库保姆级使用教程(附完整代码和注释)

数据库请求接口封装 uniapp中提供了plus.sqlite接口&#xff0c;在这里我们对常用的数据库请求操作进行了二次封装 这里的dbName、dbPath、recordsTable 可以根据你的需求自己命名 module.exports {/** * type {String} 数据库名称*/dbName: salary,/*** 数据库地址* type {…

.Net Core webapi RestFul 统一接口数据返回格式

在RestFul风格盛行的年代&#xff0c;大部分接口都需要一套统一的数据返回格式&#xff0c;那么我们怎么才能保证使用统一的json数据格式返回呢&#xff0c;下面给大家简单介绍一下&#xff1a; 假如我们需要接口统一返回一下数据格式&#xff1a; {"statusCode": …

任天堂,steam游戏机通过type-c给VR投屏与PD快速充电的方案 三type-c口投屏转接器

游戏手柄这个概念&#xff0c;最早要追溯到二十年前玩FC游戏的时候&#xff0c;那时候超级玛丽成为了许多人童年里难忘的回忆&#xff0c;虽然长大了才知道超级玛丽是翻译错误&#xff0c;应该是任天堂的超级马里奥&#xff0c;不过这并不影响大家对他的喜爱。 当时FC家用机手柄…

【Xcode】解决Unable to process request - PLA Update available

出现场景 IOS更新app时&#xff0c;使用Xcode上传新版本的包时&#xff0c;提示无法上传。 Unable to process request -PLA update available you currently dont have access to this membership resource. To resolve this issue ,agree to the latest program license a…

PHP数组定义和输出

数组就是一组数据的集合&#xff0c;把一系列数据组织起来&#xff0c;形成一个可操作的整体。 PHP中的数组与Java的数组不一样&#xff0c;需要有key&#xff08;键&#xff09;和value&#xff08;值&#xff09;&#xff0c;相当于Java中数组和键值对的结合。 数组的定义 …

7ADC模数转换器

一.模数转换原理 ADC模拟-数字转换器可以将引脚上连续变化的模拟电压转换成内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁。另外一种是DAC既是与前面相反&#xff0c;如PWM波&#xff0c;由于PWM电路简单且没有额外的功率损耗&#xff0c;更适用于惯性系统的…

基于博弈树的开源五子棋AI教程[4 静态棋盘评估]

引子 静态棋盘的评估是棋力的一个很重要的体现&#xff0c;一个优秀的基于博弈树搜索的AI往往有上千行工作量&#xff0c;本文没有做深入讨论&#xff0c;仅仅写了个引子用来抛砖引玉。 评估一般从两个角度入手&#xff0c;一个是子力&#xff0c;另一个是局势。 1 评估维度 …

R语言贝叶斯网络模型、INLA下的贝叶斯回归、R语言现代贝叶斯统计学方法、R语言混合效应(多水平/层次/嵌套)模型

目录 ㈠ 基于R语言的贝叶斯网络模型的实践技术应用 ㈡ R语言贝叶斯方法在生态环境领域中的高阶技术应用 ㈢ 基于R语言贝叶斯进阶:INLA下的贝叶斯回归、生存分析、随机游走、广义可加模型、极端数据的贝叶斯分析 ㈣ 基于R语言的现代贝叶斯统计学方法&#xff08;贝叶斯参数估…