无论您做什么,都拥有initramfs
。没有它就无计可施-它是强加于您的唯一文件系统。从kernel.org:
什么是rootfs?
Rootfs
是的特殊实例ramfs
(或tmpfs
,如果启用的话),该
实例始终存在于2.6系统中。 您无法rootfs
以无法杀死init进程的相同原因卸载。与其使用特殊的代码来检查和处理一个空列表,不如让内核仅确保某些列表不会为空,它变得更小,更简单。
大多数系统只是挂载另一个文件系统rootfs
而忽略它。一个空的ramfs实例占用的空间很小。
如果启用了* CONFIG_TMPFS *,默认情况下rootfs
将使用tmpfs
代替ramfs
。要强制ramfs
,请添加"rootfstype=ramfs"
到内核命令行。
什么是initramfs?
所有2.6 Linux内核都包含gzip压缩"cpio"
格式的归档文件,该文件在内核启动时被提取到rootfs
其中。 提取后,内核检查是否rootfs
包含文件"init"
,如果包含,则将其作为 PID 1执行。 如果找到该文件,则该init
过程负责使系统其余部分正常运行,包括查找和安装实际的根设备(如果有的话)。 如果在将嵌入式归档文件提取到其中之后rootfs
不包含init
程序cpio
,则内核将陷入较旧的代码中,以查找并挂载根分区,然后执行其中的一些变体/sbin/init
。
所有这一切都与旧的initrd在以下方面有所不同:
旧的initrd始终是一个单独的文件,而initramfs归档文件已链接到linux内核映像中。 (目录linux-* / usr用于在构建过程中生成此归档文件。)
旧的initrd文件是gzip压缩的文件系统映像(采用ext2等某种文件格式,需要在内核中内置驱动程序),而新的initramfs归档文件是gcp压缩的cpio归档文件(仅比tar更简单,请参见cpio(1))。和文档/early-userspace/buffer-format.txt)。内核的cpio提取代码不仅很小,而且是__init文本和数据,可以在引导过程中将其丢弃。
由旧的initrd(称为/ initrd,而不是/ init)运行的程序进行了一些设置,然后返回内核,而initramfs的init程序预计不会返回内核。(如果/ init需要交出控制权,则可以使用新的根设备来超载/并执行另一个init程序。请参见下面的switch_root实用程序。)
切换另一个根设备时,initrd将枢轴化root,然后卸载虚拟磁盘。但是initramfs是rootfs:您不能pivot_root rootfs,也不能将其卸载。 而是从rootfs中删除所有内容以释放空间(找到-xdev / -exec rm'{}'';'),用新的根目录(cd / newmount; mount --move ./; chroot。)覆盖rootfs,将stdin / stdout / stderr附加到新的/ dev / console并执行新的init。
由于这是一个非常棘手的过程(需要删除命令才能运行它们),因此klibc软件包引入了一个帮助程序(utils / run_init.c)为您完成所有这些操作。大多数其他软件包(例如busybox)已将此命令命名为“ switch_root”。
填充initramfs:
2.6内核构建过程始终会创建gzip cpio格式的initramfs存档,并将其链接到生成的内核二进制文件中。 默认情况下,此存档为空(在x86上消耗134个字节)。
可以使用配置选项CONFIG_INITRAMFS_SOURCE(在menuconfig中的常规设置中,并且位于usr / Kconfig中)来指定initramfs归档文件的源,该文件将自动合并到生成的二进制文件中。此选项可以指向现有的gzip压缩cpio归档文件,包含要归档文件的目录或文本文件规范,例如以下示例:
dir /dev 755 0 0
nod /dev/console 644 0 0 c 5 1
nod /dev/loop0 644 0 0 b 7 0
dir /bin 755 1000 1000
slink /bin/sh busybox 777 0 0
file /bin/busybox initramfs/busybox 755 0 0
dir /proc 755 0 0
dir /sys 755 0 0
dir /mnt 755 0 0
file /init initramfs/init.sh 755 0 0
运行“ usr / gen_init_cpio”(在内核构建后)以获取记录上述文件格式的用法消息。
配置文件的一个优点是不需要root访问权限即可设置权限或在新档案中创建设备节点。(请注意,这两个示例“文件”条目期望在linux-2.6。*目录下名为“ initramfs”的目录中找到名为“ init.sh”和“ busybox”的文件。有关信息,请参见Documentation / early-userspace / README。更多细节。)
内核不依赖外部cpio工具。如果您指定目录而不是配置文件,则内核的构建基础结构会从该目录创建一个配置文件(usr / Makefile调用scripts / gen_initramfs_list.sh),然后继续使用该配置文件打包该目录(将其输入usr / gen_init_cpio,它是从usr / gen_init_cpio.c创建的)。内核的构建时cpio创建代码是完全独立的,内核的启动时提取程序也是(显然)独立的。