23

我正在构建一个自定义 initramfs 映像,我将其作为 CPIO 存档构建到 Linux 内核 (3.2) 中。

我遇到的问题是,无论我尝试什么,内核似乎都没有尝试从 initramfs 运行。

我在 CPIO 存档中的文件:

cpio -it < initramfs.cpio
.
init
usr
usr/sbin
lib
lib/libcrypt.so.1
lib/libm.so
lib/libc.so.6
lib/libgcc_s.so
lib/libcrypt-2.12.2.so
lib/libgcc_s.so.1
lib/libm-2.12.2.so
lib/libc.so
lib/libc-2.12.2.so
lib/ld-linux.so.3
lib/ld-2.12.2.so
lib/libm.so.6
proc
sbin
mnt
mnt/root
root
etc
bin
bin/sh
bin/mknod
bin/mount
bin/busybox
sys
dev
4468 blocks

初始化非常简单,应该只初始化设备并生成一个 shell(现在):

#!/bin/sh

mount -t devtmpfs none /dev
mount -t proc none /proc
mount -t sysfs none /sys
/bin/busybox --install -s
exec /bin/sh

在内核 .config 我有:

CONFIG_INITRAMFS_SOURCE="../initramfs.cpio"
CONFIG_INITRAMFS_ROOT_UID=0
CONFIG_INITRAMFS_ROOT_GID=0
CONFIG_BLK_DEV_INITRD=y
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=1
CONFIG_BLK_DEV_RAM_SIZE=32768

内核构建和 uImage 大小取决于 initramfs 大小,所以我知道图像正在被打包。但是,当我启动时,我得到了这个输出:

console [netcon0] enabled
netconsole: network logging started
omap_rtc omap_rtc: setting system clock to 2000-01-02 00:48:38 UTC (946774118)
Warning: unable to open an initial console.
Freeing init memory: 1252K
mmc0: host does not support reading read-only switch. assuming write-enable.
mmc0: new high speed SDHC card at address e624
mmcblk0: mmc0:e624 SU08G 7.40 GiB
 mmcblk0: p1
Kernel panic - not syncing: Attempted to kill init!
[<c000d518>] (unwind_backtrace+0x0/0xe0) from [<c0315cf8>] (panic+0x58/0x188)
[<c0315cf8>] (panic+0x58/0x188) from [<c0021520>] (do_exit+0x98/0x6c0)
[<c0021520>] (do_exit+0x98/0x6c0) from [<c0021e88>] (do_group_exit+0xb0/0xdc)
[<c0021e88>] (do_group_exit+0xb0/0xdc) from [<c0021ec4>] (sys_exit_group+0x10/0x18)
[<c0021ec4>] (sys_exit_group+0x10/0x18) from [<c00093a0>] (ret_fast_syscall+0x0/0x2c)

从该输出来看,它看起来甚至没有尝试将 CPIO 存档提取为 initramfs。我希望看到这个 printk 输出,它存在于 linux 代码 init/initramfs.c 中:

printk(KERN_INFO "Trying to unpack rootfs image as initramfs...\n");

一旦启动完成(使用chroot),我就尝试了文件系统,它工作正常......所以我相信文件系统/库是理智的。

谁能给我一些关于我可能不正确的指示?提前感谢您的任何帮助!

4

1 回答 1

36

我想到了。如果其他人有这个问题,我会发布答案。

我错过了一个控制台设备,这条线是线索:

Warning: unable to open an initial console.

添加 printk 以便我更好地了解启动顺序后,我意识到控制台设备在运行 init 脚本之前已打开。因此,控制台设备必须直接在 initramfs 文件系统中,我们不能依赖 devtmpfs 挂载来创建它。

我认为当 init 脚本运行时,shell 试图打开控制台并失败,这就是内核输出的原因:

Kernel panic - not syncing: Attempted to kill init!

从内核构建机器上的 initramfs 的 /dev 目录中执行以下命令将生成所需的设备节点:

mknod -m 622 console c 5 1
mknod -m 622 tty0 c 4 0

在重新 CPIO 归档文件系统并重建内核之后,我终于在 initramfs 中有一个工作文件系统,内核将启动它。

于 2012-05-04T18:34:03.090 回答