RK3568系统启动失败:从Kernel panic到VFS根文件系统挂载的深度排查与修复

张开发
2026/4/13 22:10:29 15 分钟阅读

分享文章

RK3568系统启动失败:从Kernel panic到VFS根文件系统挂载的深度排查与修复
1. 问题现象与初步分析最近在调试RK3568平台时遇到一个典型问题使用独立分区镜像方式烧录系统时一切正常但通过官方打包工具生成update.img后系统启动时出现Kernel panic提示VFS: Unable to mount root fs on unknown-block(179,6)。这个问题困扰了我两天最终发现是initramfs配置与bootargs参数共同导致的。从错误日志中可以清晰看到几个关键信息内核尝试通过PARTUUID614e0000-0000挂载根文件系统失败系统列出了所有可用分区其中mmcblk0p6的PARTUUID正是614e0000-0000-4b53-8000-1d28000054a9内核配置中启用了initramfsCONFIG_INITRAMFS_SOURCE这种情况在嵌入式Linux开发中很常见特别是当使用不同方式打包系统镜像时。独立分区烧录和update.img打包的主要区别在于前者直接按原始分区布局写入后者可能重新组织分区结构或修改分区标识。2. 根文件系统挂载机制详解要理解这个问题我们需要先搞清楚Linux启动时如何找到根文件系统。内核通过以下步骤完成根文件系统挂载解析bootargs中的root参数如rootPARTUUIDxxx根据参数类型PARTUUID、设备节点等查找对应块设备尝试挂载该设备为根文件系统如果挂载失败会尝试其他备用设备或进入紧急shell在RK3568平台上常见的root参数指定方式有设备节点root/dev/mmcblk0p6PARTUUIDrootPARTUUID614e0000-0000-4b53-8000-1d28000054a9LABELrootLABELrootfs使用PARTUUID比直接使用设备节点更可靠因为设备节点可能因插入顺序变化而改变而PARTUUID是分区表的固有属性。3. initramfs的影响与配置initramfs初始RAM文件系统是一个临时的根文件系统在内核启动过程中被加载到内存中。它通常包含一些必要的驱动和工具用于挂载真正的根文件系统。但在我们的案例中initramfs反而成了问题的根源。通过内核配置CONFIG_INITRAMFS_SOURCE指定的initramfs会编译进内核镜像。当内核启动时首先尝试使用内置的initramfs作为根文件系统如果initramfs执行成功并退出才会继续挂载实际的根文件系统如果initramfs配置有问题可能导致根文件系统挂载流程被中断在我们的场景中initramfs配置与实际的根文件系统存在冲突导致内核无法正确切换到MMC上的根文件系统。解决方法很简单在内核配置中取消CONFIG_INITRAMFS_SOURCE的设置。4. bootargs参数深度解析bootargs是传递给内核的启动参数它决定了内核的许多行为特别是根文件系统的挂载方式。原始配置中存在两个关键问题PARTUUID不完整# 原始配置不完整 rootPARTUUID614e0000-0000 # 正确配置完整PARTUUID rootPARTUUID614e0000-0000-4b53-8000-1d28000054a9参数顺序不合理# 更好的参数顺序 earlyconuart8250,mmio32,0xfe660000 consolettyFIQ0 rw rootwait rootPARTUUIDxxx在设备树中修改bootargs的方法chosen { bootargs earlyconuart8250,mmio32,0xfe660000 consolettyFIQ0 rootPARTUUID614e0000-0000-4b53-8000-1d28000054a9 rw rootwait; };5. 完整解决方案与验证步骤经过多次测试我总结出解决此类问题的标准化流程检查内核配置# 确认initramfs配置 grep CONFIG_INITRAMFS_SOURCE .config # 确认文件系统驱动是否编译 grep CONFIG_EXT4_FS .config grep CONFIG_SQUASHFS .config验证分区信息# 在能启动的系统上查看分区信息 lsblk -o NAME,PARTUUID,MOUNTPOINT blkid修改bootargs# 通过uboot命令行临时修改并测试 setenv bootargs earlyconuart8250,mmio32,0xfe660000 consolettyFIQ0 rootPARTUUID614e0000-0000-4b53-8000-1d28000054a9 rw rootwait saveenv boot重新打包update.img# 确保打包工具使用正确的参数 ./rkImageMaker -pack update.img Image rootfs.img最终验证烧录后系统应能正常启动检查内核日志确认根文件系统挂载成功验证读写权限是否正常6. 经验总结与避坑指南在解决这个问题的过程中我总结了几个容易忽视的关键点PARTUUID的完整性很多文档示例中只展示了PARTUUID的前半部分但实际上需要完整的UUID才能正确匹配。initramfs的副作用当不需要initramfs时确保完全禁用它而不仅仅是清空CONFIG_INITRAMFS_SOURCE。打包工具的隐藏行为不同版本的RK打包工具可能对分区表处理方式不同建议记录工具版本号保留原始分区表备份比较打包前后的分区信息调试技巧在内核配置中启用CONFIG_DEBUG_BLOCK_EXT_DEVT增加init/bin/sh参数进入紧急shell使用udevadm info查看设备信息备选方案使用LABEL代替PARTUUID考虑使用initramfs但确保其正确配置在uboot阶段预先加载根文件系统驱动这个问题看似简单但涉及Linux启动流程的多个关键环节。通过系统化的分析和验证不仅能解决当前问题还能加深对嵌入式Linux启动机制的理解。

更多文章