解释 “No working init found.” 启动挂起消息¶
- 作者:
Andreas Mohr <andi at lisas period de> Cristian Souza <cristianmsbr at gmail period com>
本文档提供了一些加载 init 程序失败的高级原因(大致按执行顺序列出)。
无法挂载根文件系统 (Unable to mount root FS):设置 “debug” 内核参数(在引导加载程序配置文件或 CONFIG_CMDLINE 中)以获取更详细的内核消息。
init 程序在根文件系统中不存在 (init binary doesn’t exist on rootfs):确保您拥有正确的根文件系统类型(并且
root=内核参数指向正确的磁盘分区),并且必需的驱动程序(如存储硬件,例如 SCSI 或 USB!)和文件系统(ext3, jffs2 等)是内置的(或者作为模块,由 initrd 预加载)。控制台设备损坏 (Broken console device):可能是
console= setup存在冲突 --> 导致初始控制台不可用。例如,某些串口控制台由于串口 IRQ 问题(例如缺少基于中断的配置)而不可靠。尝试使用不同的console= device或例如netconsole=。二进制文件存在但依赖项不可用 (Binary exists but dependencies not available):例如 init 程序所需的库依赖项(如
/lib/ld-linux.so.2)丢失或损坏。使用readelf -d <INIT>|grep NEEDED来找出需要哪些库。无法加载二进制文件 (Binary cannot be loaded):确保二进制文件的架构与您的硬件匹配。例如 i386 与 x86_64 不匹配,或者尝试在 ARM 硬件上加载 x86 程序。如果您尝试在此处加载非二进制文件(Shell 脚本?),则应确保脚本在 Shebang 首行(
#!/...)中指定了完全正常的解释器(包括其库依赖项)。在处理脚本之前,最好先测试一个简单的非脚本二进制文件,例如/bin/sh,并确认其成功执行。要了解更多信息,请添加代码到init/main.c以显示kernel_execve()的返回值。
每当您发现新的故障原因时,请扩展此说明(毕竟加载 init 程序是一个关键且艰难的转换步骤,需要尽可能无痛地完成),然后向 LKML 提交补丁。进一步的 TODO 事项
通过
struct array实现各种run_init_process()调用,该数组可以存储kernel_execve()的结果值,并在失败时通过遍历 所有 结果来记录它(非常重要的可用性修复)。尝试使实现本身在总体上更有帮助,例如通过在受影响的位置提供额外的错误消息。