系统相关
首页 > 系统相关> > linux – 嵌入式与外部initramfs执行init的区别?

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