据我理解,initramfs 负责加载“真正的”根文件系统。
现在,我们在两个地方定义该根。首先我们在 中放入一个条目/etc/fstab
。其次,我们将设备放在内核启动命令上,例如root=/dev/sda1
。
initramfs 使用哪一个来确定根文件系统在哪里?如果它使用根内核参数,为什么我们有一个条目/etc/fstab
?第二个选项(读作/etc/fstab
)非常不合逻辑,因为该/etc/fstab
文件位于 initramfs 首先尝试挂载的根设备上。
非常令人困惑的东西。
答案1
正如您所说,initramfs 的目的是安装“真正的”根文件系统(它也可以做其他事情,但这是常见任务)。
如果没有 initramfs,内核通常会将分区挂载为只读,然后将控制权传递给/sbin/init
. initramfs 只是从内核接管此任务,通常当根文件系统不是普通分区(mdraid、lvm、加密等)时。
现在,除了 initramfs 上的背景之外,您还/etc/fstab
驻留在根文件系统上。因此,当 initramfs 启动时,根文件系统不存在,因此它无法访问 fstab(先有鸡还是先有蛋的问题)。
相反,我们必须将一个参数传递到内核启动参数中以供 initramfs 使用。通常这类似于root=/dev/sdX
.但是,它也可能会自动找出根设备的位置,因此根本没有参数。由于它只是软件(通常是脚本),因此它确实可以做任何它想做的事情来安装根设备。
现在,如前所述,内核会将真正的根挂载为只读。 initramfs 应该做到这一点。一旦 initramfs 完成,系统就会像根本没有 initramfs 一样继续引导并/sbin/init
启动。然后,此 init 启动所有正常的引导脚本,其中一个脚本的工作是读取/etc/fstab
、将 root 切换为读写以及挂载所有其他文件系统。
答案2
可能会,也可能不会。由于 Initramfs 可以通过多种方式构建(内核只是加载它并运行/init
它执行任何操作)。然而,使用参数更常见,因为它提供了更大的灵活性 - 即,如果某些内容发生变化,您只需编辑启动项即可继续工作。使用内置的硬编码根,这不一定是可能的。
不管怎样,fstab 条目可能仍然是必需的,因为它还决定其他事情,例如挂载选项(其中一些可以随时更改)和fsck
顺序。另外,即使它完全是多余的(如果 Initramfs 处理它,它也可以不处理),我仍然会将条目保留在那里,只是为了完整性。
答案3
您可以将 /etc/fstab 视为静态挂载,它只是执行此类任务的一种方法,但不是唯一的方法,事实上,运行命令 mount ,您会看到 fstab 中缺少很多文件系统。像 udev 和 udisk 这样的服务管理大部分“自动挂载”,忽略 /etc/fstab 文件...
因此,如果某些内容被安装或不经常安装,则与 /etc/fstab 无关。
initramfs 它只是在引导过程中使用的临时 rootfs,直到挂载“真正的”rootfs,那么为什么 initramfs 应该位于 /etc/fstab 上?