我正在构建一个非常小的Linux系统,它仅由内核(v4.1-rc5)和一个填充有busybox(v1.23.2)的initramfs组成。它在大多数情况下都能正常工作,但是无论我使用的是嵌入式initramfs还是外部的initramfs,我都在/ init中观察到命令执行行为的差异。
/ init脚本是:
#!/bin/sh
dmesg -n 1
mount -t devtmpfs none /dev
mount -t sysfs none /sys
mount -t proc none /proc
echo "Welcome"
while true
do
setsid cttyhack /bin/sh
done
然后,我将内核.config中的CONFIG_INITRAMFS_SOURCE选项设置为包含initramfs所有文件夹的目录,或者运行
find . | cpio -H newc -o | gzip > ../rootfs.cpio.gz
建立它。
然后,无论是否设置CONFIG_INITRAMFS_SOURCE,编译内核时,最终都会遇到系统的两个变体:
嵌入了initramfs的bzImage
bzImage + rootfs.cpio.gz(外部initramfs)
当我现在开始使用 qemu
qemu-system-x86_64 -enable-kvm -kernel bzImage
要么
qemu-system-x86_64 -enable-kvm -kernel bzImage -initrd rootfs.cpio.gz
我在行为上有以下差异:
对于版本2(外部initramfs),一切正常,显示“ Welcome”,并且出现提示。但是,对于版本1(嵌入式initramfs),我得到警告
unable to open an initial console
没有显示“欢迎”,并且出现提示。
据我了解的过程,这两个版本的initramfs应该包含相同的文件,因为我是从同一文件夹中构建它的(或由内核构建的)。
我想知道是否有人可以为我提供这种行为的解释?
*更新*
正如mikeserv在评论中所说,内核默认情况下包含最少的嵌入式initramfs。当使用外部设备时,它仍然存在,但是如果您嵌入自己的设备,它将被覆盖。我发现与规范相反,它确实不是空的,但包含一个dev文件夹,一个根文件夹和/ dev / console设备。然后,在使用外部initramfs时会使用此设备,但是如果您嵌入自己的设备,则该设备将被覆盖。因此,mknod -m 622 initramfs_src/dev/console c 5 1
在嵌入自己的设备时,必须在initramfs源代码中包含/ dev / console设备。
非常感谢mikeserv,frostschutz和JdeBP帮助我解决了这个问题!
/dev/console
内置的权限设置为什么?我认为这可能与在两种情况下由谁负责打包有关。