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

上一部分已经配置好了网络环境,我们要修改环境变量以保证开发板可以正常启动,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卡加载内核镜像、设备树文件

=> setenv bootcmd \
> 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 内核文件,

        · bootm 表示运行 uImage 文件

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

通过 TFTP 从网络加载内核镜像、设备树文件

首先需要在Ubuntu虚拟机上安装 tftp 服务器,安装步骤可参考:tftp 服务器搭建

=> setenv bootcmd \
> "tftpboot 80800000 zImage; \
> tftpboot 83000000 imx6ull-alientek-emmc.dtb; \
> bootz 80800000 - 83000000;"

tftpboot 命令表示从 TFTP 服务端的工作目录下加载文件

命令解析
tftpboot 80800000 zImage从TFTP 服务端的工作目录加载 zImage文件,保存到DDR 的 80800000 的位置
tftpboot 83000000 imx6ull-alientek-emmc.dtb从TFTP 服务端的工作目录加载 imx6ull-alientek-emmc.dtb 文件,保存到DDR 的 83000000 的位置
bootz 80800000 - 83000000

bootz 与 bootm:

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

        · bootm 表示运行 uImage 文件

原本的格式是“bootz  内核  根文件系统  设备树”,但是根文件系统从NFS服务端加载,所以使用“-” 填充

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

# 如果觉得每次敲IP地址有点烦,可以尝试下面这种
# => setenv bootargs \
# > root=/dev/nfs rw \
# > nfsroot=${serverip}:/usr/local/nfsd/rootfs,v2,tcp \
# > ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}::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
  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值