clw*_*clw 11 linux boot kernel initramfs
我正在构建一个非常小的 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
Run Code Online (Sandbox Code Playgroud)
然后我要么将内核 .config 中的 CONFIG_INITRAMFS_SOURCE 选项设置为包含 initramfs 的所有文件夹的目录,要么运行
find . | cpio -H newc -o | gzip > ../rootfs.cpio.gz
Run Code Online (Sandbox Code Playgroud)
来建造它。
当我编译内核时,无论是否设置了 CONFIG_INITRAMFS_SOURCE 集,我最终都会得到系统的两个变体:
嵌入了 initramfs 的 bzImage
bzImage + rootfs.cpio.gz(外部 initramfs)
当我现在开始使用 qemu
qemu-system-x86_64 -enable-kvm -kernel bzImage
Run Code Online (Sandbox Code Playgroud)
或者
qemu-system-x86_64 -enable-kvm -kernel bzImage -initrd rootfs.cpio.gz
Run Code Online (Sandbox Code Playgroud)
我得到以下行为差异:
使用版本 2(外部 initramfs)一切正常,显示“欢迎”,我收到提示。但是,使用版本 1(嵌入式 initramfs)我收到警告
unable to open an initial console
Run Code Online (Sandbox Code Playgroud)
没有显示“欢迎”,我得到了提示。
据我了解,这两个版本的 initramfs 应该包含相同的文件,因为我从相同的文件夹构建它(或让内核构建它)。
我想知道是否有人可以帮助我解释这种行为?
* 更新 *
正如 mikeserv 在评论中所说,内核默认包含一个最小的嵌入式 initramfs。这在使用外部时仍然存在,但如果您嵌入自己的,则会被覆盖。我发现与规范相反,这确实不是空的,而是包含一个 dev 文件夹,一个根文件夹和 /dev/console 设备。然后在使用外部 initramfs 时会使用此设备,但如果您嵌入自己的设备,则会被覆盖。因此,mknod -m 622 initramfs_src/dev/console c 5 1
在嵌入您自己的设备时,您必须在 initramfs 源中包含 /dev/console 设备。
非常感谢 mikeserv、frosschutz 和 JdeBP 帮助我解决这个问题!
它们真的一模一样吗?
您可以在 bzImage 中找到或从 bzImage 中提取内置的/usr/src/linux/usr/initramfs_data.cpio.gz
,如下所述: https: //wiki.gentoo.org/wiki/Custom_Initramfs#Salvaging
如果您使用内置的并将其用作外部的,它可以工作吗?
如果仍然不同,内核本身是否相同?(/proc/config.gz
两者比较)
应该有一些区别。我不知道内核关心 initramfs 来自哪里。我宁愿怀疑qemu
在传递参数时使用不同的设置-initrd
......
顺便说一句,对/init
我来说,你看起来就像是在产卵无限的贝壳。setsid
不是exec
。我错了吗?
归档时间: |
|
查看次数: |
2561 次 |
最近记录: |