
🎬 渡水无言 :个人主页渡水无言
❄专栏传送门 :linux专栏
⭐️流水不争先,争的是滔滔不绝
📚博主简介:第二十届中国研究生电子设计竞赛全国二等奖 |国家奖学金 | 省级三好学生
| 省级优秀毕业生获得者 | csdn新星杯TOP18 | 半导纵横专栏博主 | 211在读研究生
在这里主要分享自己学习的linux嵌入式领域知识;有分享错误或者不足的地方欢迎大佬指导,也欢迎各位大佬互相三连

目录
[二、TFTP 挂载内核、设备树](#二、TFTP 挂载内核、设备树)
[三、NFS 挂载文件系统](#三、NFS 挂载文件系统)
[4.2.1常见的 NFS 挂载失败原因(按优先级排序):](#4.2.1常见的 NFS 挂载失败原因(按优先级排序):)
[Ubuntu 的 NFS 共享目录配置错误(排除)](#Ubuntu 的 NFS 共享目录配置错误(排除))
[NFS 目录权限 / 所有者错误(排除)](#NFS 目录权限 / 所有者错误(排除))
[NFS 服务未重启,配置未生效(排除)](#NFS 服务未重启,配置未生效(排除))
[NFS 协议版本不兼容(问题所在)](#NFS 协议版本不兼容(问题所在))
前言
上几期博客我们完成了网络环境、TFTP环境、NFS环境的搭建,本期博客我们来完成TFTP挂载内核设备树,NFS挂载文件系统。
一、准备工作
1.1、网络环境
已经完成网络环境 ping 测试,完成 TFTP 和 NFS 环境搭建和验证。
1.2、内核文件准备
先准备好zImage 文件和 imx6ull-alientek-emmc.dtb 设备树文件,并拷贝到Ubuntu 的 tftp 工作目录下。
赋予这两个文件可读可写可执行权限。
sudo chmod 777 zImage imx6ull-alientek-emmc.dtb
最终tftp 工作目录如下:

1.3文件系统准备
在 nfs 共享目录下创建一个 rootfs 目录用于存放文件系统。
再将 busybox 文件系统拷贝到nfs 共享目录下rootfs 文件夹中。
如下图所示:

执行以下指令将文件系统包解压。
tar vxjf rootfs.tar.bz2
解压完的文件系统如下。

二、TFTP****挂载内核、设备树
这里将 uboot 烧录到 EMMC 中,进入 uboot 命令行,设置开发板的 IP 信息。
使用如下命令:
setenv ipaddr 192.168.10.50
setenv ethaddr 00:04:9f:04:d2:35
setenv gatewayip 192.168.10.1
setenv netmask 255.255.255.0
setenv serverip 192.168.10.100
saveenv
并测试下 uboot 是否能 ping 虚拟机
ping 192.168.10.100

注意,uboot 阶段,虚拟机 ping 开发板是没有反馈的,这里不用虚拟机去 ping 开发板。
设置环境变量 bootcmd 来挂载 tftp 目录下的内核、设备树文件到开发板内存中。
setenv bootcmd 'tftp 80800000 zImage;tftp 83000000 imx6ull-alientek-emmc.dtb;bootz 80800000 - 83000000'
saveenv
三、NFS****挂载文件系统
设置环境变量 bootargs 来挂载 nfs 共享目录下的 rootfs 文件系统到开发板内存中。
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs \
nfsroot=192.168.10.100:/home/duan/linux/nfs/rootfs,proto=tcp rw \
ip=192.168.10.50:192.168.10.100:192.168.10.1:255.255.255.0::eth0:off '
saveenv

注意:绿色标记为单个空格
四、正式进行挂载
4.1测试
环境变量已经设置好了,执行 boot 指令即可使用网络挂载出厂系统。


4.2挂载系统失败原因
从刚才的测试总发现TFTP 加载内核 / 设备树完全正常
内核已识别 NFS 启动参数
日志停在ALSA device list: No soundcards found.,没有后续的 NFS 挂载日志,本质原因是:
内核尝试挂载 NFS 根文件系统,但连接 Ubuntu 的 NFS 服务器时超时 / 被拒绝,内核一直在等待 NFS 响应,最终卡住(不会报错,只会静默等待)。
4.2.1常见的 NFS 挂载失败原因(按优先级排序):
Ubuntu 的 NFS 共享目录配置错误(排除)
-
/etc/exports文件中未正确添加/home/duan/linux/nfs/rootfs的共享规则,或规则权限不足; -
示例正确配置:
/home/duan/linux/nfs/rootfs *(rw,sync,no_root_squash,no_subtree_check)。
NFS 目录权限 / 所有者错误(排除)
-
rootfs目录的所有者不是 root,或权限不足(需至少 755); -
执行
ls -ld /home/duan/linux/nfs/rootfs,确保权限是drwxr-xr-x,所有者是root:root。
NFS 服务未重启,配置未生效(排除)
-
修改
/etc/exports或/etc/default/nfs-kernel-server后,未执行sudo systemctl restart nfs-kernel-server,配置不生效。
NFS 协议版本不兼容(问题所在)
- 开发板内核(4.1.15)较老,仅支持 NFSv2/NFSv3,但 Ubuntu 默认可能只开启 NFSv4,导致协议不匹配。
4.3解决方案
经过博主自己逐个测试,发现原因是 **NFS 协议版本不兼容,**开发板内核(4.1.15)比较老,Ubuntu 默认可能只开启 NFSv4,导致协议不匹配。
所以在 U-Boot 命令行补充 NFS 版本参数,强制用 NFSv3,代码如下:
# 清空原有bootargs,重新配置(重点加nfsvers=3)
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.10.100:/home/duan/linux/nfs/rootfs,proto=tcp,nfsvers=3 rw ip=192.168.10.50:192.168.10.100:192.168.10.1:255.255.255.0::eth0:off'
saveenv
boot # 重新启动
此时发现挂载系统成功,并可以进入文件系统。

总结
本期博客我们来完成TFTP挂载内核设备树,NFS挂载文件系统,并解决了NFS因为挂载失败的问题。