未检测到自定义 initramfs

未检测到自定义 initramfs

我有自定义的 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环境。

相关内容