initramfs 如何挂载根文件系统?

initramfs 如何挂载根文件系统?

iniramfs 就像一个小型操作系统,它挂载根文件系统并将控制权移交给 systemd。那么,initramfs 内部是如何工作的呢? linux下有没有执行挂载root的脚本?

答案1

提取并安装 initrd/initramfs(仅历史差异)后,运行的是脚本 /init。大多数情况下,它仅在 initramfs 中的模块的帮助下安装真正的根。

然后它必须将根目录旋转/切换到新分区,这只有在 pid 1 时才可能实现。

这是一个最小的 /init 脚本:

mkdir /newroot
mount /dev/sda2 /newroot
mount --move /sys /newroot
mount --move /dev /newroot
mount --move /proc /newroot

switch_root /newroot /bin/bash

(或 /sbin/init 用于正常延续)

问题是,如果没有内置必要的模块,内核就无法挂载 /dev/sda2。将模块放在 sda2 上并没有帮助:鸡蛋和母鸡问题。

因此,内核获得一个 cpio 存档,其中包含包含模块和脚本的根文件系统。内核简单地移交给/init并完成它自己的启动。


gentoo 链接的开头是:

initramfs 是一个根文件系统嵌入到内核中...

那应该是什么意思呢?


这是一个最小的内核命令行:

vmlinuz root=/dev/sdaX

告诉引导加载程序加载内核“vmlinuz”并告诉内核挂载/dev/sdaX。

和这个:

vmlinuz initrd=initramfs.img root=/dev/sdaX

使引导加载程序还加载一个 initrd,内核将找到该 initrd 并将其挂载为 root,并告诉(默认)/init 脚本旋转/切换到 /dev/sdaX(然后运行默认的 /sbin/init)。

相关内容