我的理解是initrd/initramfs在RAM中建立了一个文件系统来帮助内核初始化。我有以下疑问;
(1) initrd/initramfs 是由 bootloader 设置的吗(例如:GRUB 2)?
(2) initrd/initramfs 设置是否发生在内核初始化页表之前?
(3) 这是暂时的吗?内核初始化成功后,这个文件系统会发生什么?
答案1
(1) 在initramfs中,通常内核和初始文件系统存在于同一个文件中。因此,如果引导加载程序必须知道内核文件在哪里,它也知道 initramfs 在哪里。反之亦然。如果initramfs是一个单独的文件,那么它必须被引导加载程序引用并作为参数传递给内核;
引导加载程序将控制权传递给内核,内核在初始化所需准备的所有内容结束时,提取 initramfs 并将控制权传递给 init(在 initramfs 内)。
(2) initramfs在内核准备好虚拟内存子系统后被提取;
(3) 通常,在 initramfs 完成其工作(即挂载系统的根文件系统)后,会采取一系列微妙的步骤“移动”到新挂载的根文件系统,并从 RAM 中删除 initramfs 的内容(明确地)通过运行“rm”);
我建议阅读以下内容: https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt
答案2
initrd 由用户空间程序设置并作为一个文件(按cpio
格式)复制到磁盘。引导加载程序在其配置中被告知该文件,将文件复制到 RAM(无需进一步设置)并告诉内核 RAM 地址。
内核设置其 RAM 磁盘并将 initrd 解压缩到其中。如果您想调用该设置...我不知道与创建页表的时间关系,但是当内核从需要页表的 initrd 启动用户态进程时,我想这已经发生了。
该 RAM 磁盘用作/
文件系统,直到挂载真正的根 FS 并且 PID 1 对其进行 chroot。
我不知道这个 RAM 磁盘(及其所有内容)是否会保留,直到从根 FS 中 chroot 关闭以卸载它。