initramfs 是否使用 /etc/fstab?

initramfs 是否使用 /etc/fstab?

据我理解,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 上?

相关内容