![initramfs 如何挂载根文件系统?](https://linux22.com/image/162043/initramfs%20%E5%A6%82%E4%BD%95%E6%8C%82%E8%BD%BD%E6%A0%B9%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%EF%BC%9F.png)
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)。