什么是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归档文件是gzip压缩的cpio归档文件(仅比tar更简单,请参见cpio(1))。和文档/early-userspace/buffer-format.txt)。内核的cpio提取代码不仅很小,而且是__init文本和数据,可以在引导过程中将其丢弃。
由旧的initrd(称为/ initrd,而不是/ init)运行的程序进行了一些设置,然后返回内核,而initramfs的init程序预计不会返回内核。(如果/ init需要交出控制权,则可以使用新的根设备来超载/并执行另一个init程序。请参见下面的switch_root实用程序。)
切换另一个根设备时,initrd将使用pivot_root,然后卸载ramdisk。但是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选项CONFIG_INITRAMFS_SOURCE(位于和位于中的常规设置中)可用于指定存档的源,该源
将自动合并到生成的二进制文件中。 此选项可以指向* 现有 gzip压缩的*归档文件,包含要归档文件的目录或文本文件规范,例如以下示例:menuconfig,
usr/Kconfig
initramfs
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
是不需要访问权限即可设置权限或在新档案中创建设备节点。
(请注意,这两个示例“文件”条目期望在-2.6。*目录下的名为“ ” 的目录中找到名为“ init.sh
”和“ busybox
”的文件。有关更多详细信息,请参见Documentation / early-userspace / README。)initramfs
linux
内核并不能依赖于外部cpio
工具。如果您指定目录而不是配置文件,则内核的构建基础结构会从该目录(usr/Makefile
称为scripts/gen_initramfs_list.sh
)创建一个配置文件,然后继续使用配置文件将该目录打包(通过将其提供给usr/gen_init_cpio
从创建的usr/gen_init_cpio.c
)。 内核的构建时cpio
创建代码是完全独立的,而内核的引导时提取程序也是(显然)独立的。