上一部分已经配置好了网络环境,我们要修改环境变量以保证开发板可以正常启动,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 0 | mmc 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