【系统移植】uboot 通过 NFS 加载根文件系统(二) —— 修改环境变量 bootcmd、bootargs

news2024/11/26 14:24:57

上一部分已经配置好了网络环境,我们要修改环境变量以保证开发板可以正常启动,uboot 环境变量中比较重要的环境变量就是 bootcmd bootargs


          目录

1、修改自启动命令 — bootcmd

2、修改自启动参数 —— bootargs

(1) root=/dev/nfs rw

(2) nfsroot

(3) ip=xxx::eth0:off

(4) console=ttymxc0,115200

3、修改NFS支持的版本(以 v2 版本为例)

4、可能会产生的错误 Kernel panic - not syncing: VFS: xxx


1、修改自启动命令 — bootcmd

自启动命令就是开发板一上电就会运行的命令,开发板一上电会先获取 uboot,然后uboot引导开发板读取 linux 镜像文件、设备树文件、根文件系统rootfs。因此,bootcmd 的作用其实就是在自启动环节告诉 uboot 去哪找到上述文件。

从SD卡加载内核镜像、设备树文件

=> set setenv \
> mmc dev 0; \
> fatload mmc 0:1 80800000 zImage; \
> fatload mmc 0:1 83000000; \
> bootz 80800000 - 83000000;
命令解析
mmc dev 0mmc dev表示切换设备,0 表示 SD卡,1 表示 EMMC
fatload mmc 0:1 80800000 zImage

- fatload 用于加载 vfat 文件系统的文件

- mmc 表示外部存储器(说明要从外部存储器加载)

- 0:1 表示SD卡上的第1分区(前者的 0 是设备编号,后者的 1 代表分区)

- 80800000:表示要加载到DDR的哪个位置

- zImage:表示要加载分区中的哪个文件(文件名必须和SD卡中保存的文件名一致)

fatload mmc 0:1 83000000 imx6null.dtb加载SD卡中第一分区的 imx6null.dtb 文件,保存到DDR的0x83000000位置
bootz 80800000 - 83000000

bootz 与 bootm:

        · bootz 表示运行 zImage 内核文件,

        · 表示运行 uImage 文件

原本的格式是“bootz  内核  根文件系统  设备树”,但是根文件系统以其他方式加载,所以使用“-” 填充

2、修改自启动参数 —— bootargs

一般写的是要传递给内核的参数。参考链接:bootargs 参数详解

=> setenv bootargs \
> root=/dev/nfs rw \
> nfsroot=169.254.162.189:/usr/local/nfsd/rootfs,v2,tcp \
> ip=169.254.162.163:169.254.162.189:169.254.162.1:255.255.0.0::eth0:off \
> console=ttymxc0,115200

(1) root=/dev/nfs rw

root 表示指定根文件系统的获取来源,nfs表示从nfs服务端获取, mmcblk0p2 表示从SD卡的第2分区获取。

rw 指定了操作网络文件系统的权限。

(2) nfsroot

root 既然已经指定了根文件系统的来源是 nfs,接下来就需要告诉内核,你的nfs服务端放在哪,以及nfs的工作目录是什么。基本格式为:

# 如果你的nfs服务端在虚拟机上,这里的IP地址指的是你虚拟机的IP地址
nfsroot=[IP地址]:[nfs工作目录]

注意事项一:如果你的nfs服务端在虚拟机上,你这里所写的nfs工作目录,必须要以指定格式添加到 /etc/exports 文件中,添加方式可以参考:nfs 环境搭建

注意事项二:除此之外,imx6ull 的uboot中默认是使用 NFS-V2 协议,你需要检查一下你的NFS服务端是否支持 v2 版本,查看命令如下:

 sudo cat /proc/fs/nfsd/versions

负数表示不支持,正数表示支持。-2 表示不支持 v2 版本, +3 表示支持 v3 版本。 如何修改请参考本文的第三部分《 修改NFS支持的版本 》。

注意事项三:我们可以看到最后有个 v2,tcp ,v2 表示指示NFS使用v2版本协议,​​tcp​​表示使用的是tcp协议,我们可以在虚拟机命令行输入 netstat -a | grep nfs ,从结果可以看出,实际上 nfs 既支持 tcp ,又支持 udp

(3) ip=xxx::eth0:off

这里是在给内核传递开发板和服务端的IP地址,以及指定要使用哪个网口。基本格式如下:

ip=[开发板IP]:[服务端IP]:[网关]:[子网掩码]::[网卡名称]:off

这里指定网卡名称的原因是,一个开发板上可能有多个网卡(网口),比如 imx6ull 上有两个网口,所以需要指定使用哪个网口来获取根文件系统。

(4) console=ttymxc0,115200

表示通过串口输出控制台信息,串口名为 ttymxc0,波特率为 115200

3、修改NFS支持的版本(以 v2 版本为例)

修改nfs 的默认配置文件 /etc/default/nfs-kernel-server

sudo vim /etc/default/nfs-kernel-server

依次修改图中提示的三个地方

重启 NFS 服务端

sudo /etc/init.d/nfs-kernel-server restart

查看 nfs 服务端支持的协议(版本)

4、可能会产生的错误 Kernel panic - not syncing: VFS: xxx

实际可能并不会这么一帆风顺,出现这种情况的原因可能有多个:

  • uboot 支持的NFS版本为 v2,然而你虚拟机上的NFS端不支持 v2
  • ip 末尾没有指定网卡名称,因为一个开发板上可能有多个网口,imx6ull 就有两个网口,所以实际需要指定使用哪个网口。 ip=xxx::eth0:off 表示指定 eth0 网口
  • 检查nfsroot 中的IP地址是否有误,工作目录是否添加到了 /etc/exports 文件中
[  103.266737] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)
[  103.275015] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)
[  117.173625] random: nonblocking pool is initialized

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Godot引擎 4.0 文档 - 循序渐进教程 - 创建你的第一个脚本

本文为Google Translate英译中结果,DrGraph在此基础上加了一些校正。英文原版页面: Creating your first script — Godot Engine (stable) documentation in English 创建你的第一个脚本 在本课中,您将编写您的第一个脚本,使用…

Datacom-HCIE 题库 02(10月26日更新)--含解析

单选题 1.[试题编号:189785] (单选题)如图所示,VTEP1上在BD20域内开启了ARP广播抑制功能,并且VTEP1通过 BGP EVPN路由学习到了PC2的ARP信息,则PC1发送的针对PC2的ARP请求,VIEP1在转发给VIEP2时…

设备采购信息管理系统

系列文章 任务14 设备采购信息管理系统 文章目录 系列文章一、实践目的与要求1、目的2、要求 二、课题任务三、总体设计1.存储结构及数据类型定义2.程序结构3.所实现的功能函数4、程序流程图 四、小组成员及分工五、 测试界面展示添加采购信息按编号查找采购信息按设备编号查找…

vue记录鼠标拖拽划过位置并将划过位置变色

首先 我们要做一个这样的基本组件 <template><div><!--循环遍历 List数组用当前下面当做key值然后定义了 onDragStart 鼠标拖动时触发定义 onDragEnd 拖动结束后触发定义 onDragOver 记录所有鼠标拖动经过的位置--><divclass"skeleton"v-f…

DAY 63 mysql的高级语句:存储过程

什么是存储过程 存储过程是一组为了完成特定功能的SQL语句集合。 存储过程在使用过程中是将常用或者复杂的工作预先使用SQL语句写好并用一个指定的名称存储起来&#xff0c;这个过程经编译和优化后存储在数据库服务器中。当需要使用该存储过程时&#xff0c;只需要调用它即可…

数据结构之堆详解

目录 1.什么是堆 堆的定义 结构体定义与函数接口 堆的初始化 堆的销毁 入堆 向上调整算法 大堆 出堆 向下调整算法 返回堆顶元素 判空 堆的应用 1.什么是堆 知道以上的存储方法&#xff0c;对于完全二叉树&#xff0c;有一个叫做堆的结构&#xff0c;堆本质就是一…

内核调试工具crash使用

内核调试工具crash使用 前言初识获取vmlinuxDwarf Error: wrong version in compilation unit header (is 5, should be 2, 3, or 4) 其他 前言 在编写内核驱动的过程中&#xff0c;时不时就导致内核崩溃&#xff0c;也没啥好的调试方法&#xff0c;要么dmesg打印内核日志&…

socket | 网络套接字、网络字节序、sockaddr结构

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

量化论文学习之《基于 CNN-LSTM 混合模型的股价 预测》

主要原理 CNN-LSTM 混合模型首先使用 CNN 来提取时间序列数据的特征&#xff0c;然 后将特征输入进 LSTM 模型中来进行下一交易日股票收盘价的预测。 数据处理 使用数据 作者发现加入volume,pctChg后效果变差&#xff0c;可能原因是加入了相关性较低的特征后造成了数据冗余…

Ubuntu挂载阿里云盘

目录 所需环境安装docker安装rclone获取阿里云盘token 获取docker镜像并运行获取本机IP信息总结rclone配置挂载网盘到本地文件夹开机启动 所需环境 安装docker 使用官方脚本进行全自动安装 curl -fsSL https://test.docker.com -o test-docker.shsudo sh test-docker.sh安装r…

Spring Boot 可执行 Jar 包运行原理

Spring Boot 有一个很方便的功能就是可以将应用打成可执行的 Jar。那么大家有没想过这个 Jar 是怎么运行起来的呢&#xff1f;本篇博客就来介绍下 Spring Boot 可执行 Jar 包的运行原理。 打可执行 Jar 包 将 Spring Boot 应用打成可执行 Ja r包很容易&#xff0c;只需要在 p…

数字信号处理基础(一):常用信号产生

目录 1. 写在前面2. 连续信号和离散信号2.1连续信号2.2 离散信号 3. 常用信号的产生3.1 单位脉冲序列3.2 单位阶跃序列3.3 指数函数3.4 正弦信号和余弦信号3.5 sinc函数3.6 矩形脉冲信号 4. 信号卷积5. 完整代码 1. 写在前面 为了更好的理解通信原理系列文章&#xff0c;在此补…

28 SQL——表子查询

create table dept(id int primary key auto_increment,name varchar(15))comment 部门;insert into dept(id, name) values (1,研发部),(2,市场部),(3,财务部),(4,销售部),(5,总经办),(6,人事部);create table staff (id int primary key auto_increment commentID,name …

使用Mathtype公式编辑器生成CSDN中的数学公式

使用Mathtype公式编辑器生成CSDN中的数学公式 在CSDN中输入数学公式&#xff0c;直接使用LaTeX编辑输入公式有一些难度&#xff0c;如果你熟悉Mathtype公式编辑器&#xff0c;那么在CSDN文档中输入数学公式也变的相对容易。 下面我们举例说明使用Mathtype转换输入CSDN的公式。…

Weex工具链的奥秘

在2017年1月12日 Weex Conf 2017上&#xff0c;来自阿里的卜道依据Weex开发中的痛点介绍了Weex的打包和插件机制&#xff0c;同样来自阿里的归影介绍了Weex的调试工具Devtools&#xff0c;共同揭秘了Weex的工具链。本文是卜道和归影关于Weex工具链实践的分享整理。 Weexpack与…

MyBatis各种类型查询数据的数据绑定

文章目录 1、前言2、查询一个实体类对象字段名和属性名无法映射处理方式一&#xff1a;起别名方式二&#xff1a;使用全局配置文件配置映射规则方式三&#xff1a;自定义resultmap 3、查询一个list集合4、查询单个数据5、查询一条数据为map集合6、 查询多条数据为map集合方式一…

Python中使用Scipy模块中root函数求解非线性方程的解法举例

Python中使用Scipy模块中root函数求解非线性方程的解法举例 Python中的SciPy模块功能强大&#xff0c;下面举例说明使用该模块求解非线性方程或非线性方程组。在求解时候&#xff0c;用到scipy.optimize模块中的root函数。 1.root函数的调用格式 调用它们的格式为 from scipy…

使用MinIO文件存储系统【完成视频断点续传】业务逻辑

目录 视频上传 接口一&#xff1a;检查该视频/媒资文件是否已经上传完成 接口二&#xff1a;检查视频分块是否已经在minio中已经存在 接口三&#xff1a;上传分块文件到minio中&#xff08;已经上传的分块会在接口二进行校验&#xff09; 接口四&#xff1a;合并上传的分块…

git生成密钥方法

1、密钥生成 打开Git Bash&#xff0c;查看ls ~/.ssh下是否有密钥文件id_rsa*&#xff0c;有的话可先进行备份。 然后用如下命令生成新密钥&#xff1a; ssh-keygen -t rsa -C "your_emailexample.com" 参数含义&#xff1a; -t 指定密钥类型&#xff0c;默认是 …

chatgpt赋能Python-pythonbif

Python Bif: 简介和使用指南 Python Bif是一种用于机器学习和数据科学的强大包。它提供了一些重要的功能&#xff0c;例如分类、集成和回归。这篇文章将向您介绍Python Bif的主要特性和如何使用它来完成各种数据科学任务。 什么是Python Bif&#xff1f; Python Bif是一个通…