正点原子开发板:从NFS挂载到根文件系统打包错误复盘
·
MX6ULL开发板Linux启动问题全解决:从NFS挂载到根文件系统打包错误复盘
在基于MX6ULL(RINIWEN EVK,类似正点原子架构)开发板的Linux调试过程中,我先后遇到了NFS挂载失败、本地启动Kernel panic等问题,最终定位到根文件系统打包路径错误是核心根源。本文完整复盘排查过程与解决方法,帮助同类型开发板用户避坑。
一、问题排查历程:从NFS到本地启动的层层突破
1. 初始问题:NFS挂载根文件系统失败
现象
开发板启动时触发Kernel panic,关键日志:
VFS: Unable to mount root fs via NFS, trying floppy.
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)
排查与解决
- 原因:NFS服务器默认启用V4协议,而开发板内核优先支持V3,版本不兼容。
- 解决:在U-Boot的
bootargs中为NFS指定版本vers=3,配置命令:setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.3.127:/home/wheeltec-client/linux/nfs/rootfs,proto=tcp,vers=3 rw ip=192.168.3.128::192.168.3.1:255.255.255.0::eth0:off' saveenv boot - 结果:NFS启动成功,证明内核、网络配置无问题,问题缩小到本地根文件系统。
2. 新问题:本地(eMMC/SD)启动Kernel panic
现象
根分区(mmcblk1p2)已成功挂载,但仍报“找不到init进程”:
VFS: Mounted root (ext3 filesystem) on device 179:2.
Kernel panic - not syncing: No working init found. Try passing init= option to kernel.
排查过程
-
第一次尝试:添加
init=参数
参考NFS根目录有linuxrc(嵌入式常用init入口),在U-Boot的bootargs中加init=/linuxrc:setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw init=/linuxrc' saveenv boot但报错“
Requested init /linuxrc failed (error -2)”(文件不存在)。 -
第二次排查:本地根文件系统结构
将本地存储(eMMC/SD)挂载到PC,发现根目录下没有linuxrc、/sbin/init等关键文件,反而多了一个rootfs文件夹——原来根文件系统打包时路径错了!

3. 最终根源:根文件系统打包路径错误
错误操作
打包根文件系统时,未进入rootfs文件夹内部,直接在上级目录执行打包命令:
# 错误命令:当前目录是/home/wheeltec-client/linux/nfs/,而非rootfs内部
tar -vcjf rootfs.tar.bz2 *
- 后果:生成的
rootfs.tar.bz2包含rootfs文件夹本身(而非里面的bin/etc/linuxrc等内容),烧录后本地根分区的目录结构变成/rootfs/bin//rootfs/linuxrc,内核在/目录下找不到init文件,自然启动失败。
正确操作
必须进入rootfs文件夹内部,打包所有子文件(不含rootfs文件夹本身):
# 正确步骤
cd /home/wheeltec-client/linux/nfs/rootfs # 进入根文件系统目录
tar -vcjf ../rootfs.tar.bz2 * # 打包内部所有文件,输出到上级目录
- 验证:打包后解压,应直接看到
bin/etc/linuxrc等文件,而非嵌套的rootfs文件夹。
4. 最终验证:本地启动成功
将正确打包的根文件系统烧录到mmcblk1p2,重新执行本地启动配置:
# U-Boot命令
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw init=/linuxrc'
saveenv
boot
- 成功标志:内核加载后进入命令行界面,显示
/ #或root@mx6ull:~#。

二、关键错误原因总结(避坑指南)
| 错误类型 | 具体原因 | 解决方法 |
|---|---|---|
| NFS挂载失败 | NFS服务器V4与内核V3不兼容 | bootargs中加vers=3(nfsroot=...proto=tcp,vers=3) |
| U-Boot配置失效 | bootcmd未调用mmcargs,导致init=参数不生效 |
直接在bootargs中添加init=/linuxrc,或修改bootcmd包含run mmcargs |
| 本地启动找不到init | 根文件系统打包时未进入文件夹,导致目录结构嵌套 | 进入rootfs内部,用tar -vcjf ../xxx.tar.bz2 *打包 |
| init执行失败 | 根文件系统缺少linuxrc/init,或权限不足 |
从NFS根目录复制完整文件,确保linuxrc有可执行权限(chmod +x linuxrc) |
三、最终可用配置(NFS+本地启动)
为方便后续开发切换启动方式,整理两种模式的最终U-Boot配置:
| 启动方式 | U-Boot完整配置命令 | 适用场景 |
|---|---|---|
| NFS启动(调试用) | 1. setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.3.127:/home/wheeltec-client/linux/nfs/rootfs,proto=tcp,vers=3 rw ip=192.168.3.128::192.168.3.1:255.255.255.0::eth0:off' 2. saveenv 3. boot |
开发调试(无需反复烧录根文件系统,修改服务器文件即可生效) |
| 本地启动(部署用) | 1. setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw init=/linuxrc' 2. saveenv 3. boot |
最终部署(不依赖网络,启动速度快) |
四、总结:嵌入式Linux启动问题的核心思路
- 先通NFS,再查本地:NFS启动成功可排除内核、设备树、网络的问题,缩小排查范围到本地存储/根文件系统。
- 关注目录结构:根文件系统的
/目录下必须有init/linuxrc,打包时避免路径嵌套(最容易踩的坑)。 - U-Boot参数必验证:修改
bootargs后用printenv bootargs确认,确保root=(根分区)、init=(init路径)正确。
通过以上步骤,可高效解决MX6ULL开发板的Linux启动问题,避免在基础配置上浪费时间。
更多推荐

所有评论(0)