内置于定制Linux内核中的initramfs没有运行

我正在构build一个自定义的initramfs映像,将其作为一个CPIO存档构build到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 

内核构build和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)文件系统,它工作正常…所以我相信文件系统/库是理智的。

任何人都可以给我一些指针,我可能有什么不正确的? 在此先感谢您的帮助!

Solutions Collecting From Web of "内置于定制Linux内核中的initramfs没有运行"

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

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

 Warning: unable to open an initial console. 

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

我认为当初始化脚本运行的shell试图打开控制台失败,这就是为什么内核输出:

 coreel 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中有一个工作文件系统,内核将启动。