linux – 嵌入式与外部initramfs执行init的区别?
作者:互联网
我正在构建一个非常小的Linux系统,它只包含内核(v4.1-rc5)和一个填充了busybox(v1.23.2)的initramfs.它在大多数情况下工作正常,但我观察到/ init中命令执行行为的差异,无论我是使用嵌入式initramfs还是外部initramfs.
/ 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)一切正常,显示“欢迎”,我得到一个提示.然而,对于版本1(嵌入式initramfs),我收到警告
unable to open an initial console
“欢迎”未显示,我收到提示.
据我所知,这两个版本的initramfs应该包含相同的文件,因为我是从同一个文件夹构建它(或者让内核构建它).
我想知道是否有人可以帮我解释这种行为?
*更新*
正如mikeserv在评论中所说,内核默认包含一个最小的嵌入式initramfs.使用外部设备时仍然存在,但如果嵌入自己的设备,则会被覆盖.我发现与规范相反,这确实不是空的,但包含一个dev文件夹,一个根文件夹和/ dev / console设备.然后在使用外部initramfs时使用此设备,但如果嵌入自己的initramfs则会被覆盖.所以你必须在你的initramfs源mknod -m 622 initramfs_src / dev / console c 5 1中包含/ dev / console设备.
非常感谢mikeserv,frostschutz和JdeBP帮助我解决这个问题!
解决方法:
它们真的相同吗?
您可以在/usr/src/linux/usr/initramfs_data.cpio.gz中找到内置的,或者从bzImage中提取它,如下所述:https://wiki.gentoo.org/wiki/Custom_Initramfs#Salvaging
如果您使用内置的那个并将其用作外部的,它是否有效?
如果它仍然不同,内核本身是否相同? (两者都比较/proc/config.gz)
应该有一些区别.我不知道内核关心initramfs的来源.我很快就怀疑qemu在传递-initrd参数时使用了不同的设置……
在旁注中,你的/ init看起来像是它给我带来了无限的炮弹. setsid不是exec.我错了吗?
标签:linux,kernel,boot,initramfs 来源: https://codeday.me/bug/20190809/1631230.html