我有自定义的 initramfs 应该启动 busybox shell。 cpio 存档包含bin/
带有busybox
和 的目录init
。
busybox
是静态链接的二进制文件:
bin/busybox: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, for GNU/Linux 3.2.0, stripped
init
是带有以下代码的 shell 脚本:
#!/bin/busybox sh
export PATH=/bin
/bin/busybox --install -s /bin
sh
我使用以下命令制作图像:
find | cpio -ovHnewc > ../initrd.img
当我运行它时,我遇到内核恐慌:
# qemu-system-x86_64 -m 512M -enable-kvm -kernel /boot/vmlinuz -initrd ../initrd.img -append 'debug console=ttyS0 init=/bin/init' -nographic
… (booting)
[ 2.175321] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
initramfs 映像中有什么问题?对于空的 initramfs,我也遇到同样的错误。我的发行版中的 initramfs 正在运行。
答案1
我认为您的初始化脚本对于启动来说可能太小了。内核与 /proc 和 /sys 一起工作,因此它应该包括:
mount -t proc none /proc
mount -t sysfs none /sys
答案2
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
您收到此消息是因为它找不到 init 脚本。 (如果没有 init,它会尝试继续,然后由于缺少 rootfs 而失败)。
-append 'debug console=ttyS0 init=/bin/init'
应该是/init
,不是/bin/init
。或者,您可以指定初始化文件系统rdinit=
根据参数初始化管理指南/内核参数.txt。
测试是否的一种方法初始化文件系统完全加载,就是传递rdinit=/bin/busybox
,那么它应该死亡并显示以下消息:
CPU: 0 PID: 1 Comm: busybox ...
[... lots of stuff ...]
Attempted to kill init!
Attempted to kill init!
仅当首先存在 init 进程时您才会收到该消息,因此您知道它已加载并执行并取得了一定程度的成功。否则,如果 init 根本不存在,它将返回到您当前已经收到的消息。
另外,如果您不想在 initrd 本身内处理模块加载,则内核本身必须支持 initramfs ( CONFIG_BLK_DEV_INITRD=y
) 以及可执行脚本 ( ) 以及内置驱动程序而不是模块。CONFIG_BINFMT_SCRIPT=y
所以内核配置在这里也很重要。
我不确定您是否已经从该页面访问,但是Gentoo Wiki 有一个自定义 Initramfs 指南。这也展示了如何获得基本/dev
/proc
/sys
环境。