initramfs是否使用/ etc / fstab?


20

据我了解,initramfs负责加载“真实的”根文件系统。

现在,在两个地方定义了根。首先,我们在中输入一个条目/etc/fstab。其次,我们将设备放在内核引导命令上,例如root=/dev/sda1

initramfs使用哪一个来确定根文件系统在哪里?如果它使用root内核参数,为什么我们要在其中输入一个/etc/fstab?第二个选项(读取为/etc/fstab)非常不合逻辑,因为该/etc/fstab文件位于initramfs首先尝试安装的根设备上。

非常令人困惑的东西。

Answers:


14

如您所述,initramfs的目的是安装“真正的”根文件系统(它也可以做其他事情,但这是常见的任务)。

如果没有initramfs,内核通常会将分区挂载为只读,然后将控制权传递给/sbin/init。通常,当根文件系统不是普通分区(mdraid,lvm,加密等)时,initramfs将从内核接手此任务。

现在,除了initramfs的背景之外,您还/etc/fstab驻留在根文件系统上。因此,启动initramfs时,该根文件系统不存在,因此无法进入fstab(鸡肉和鸡蛋问题)。
取而代之的是,我们必须将参数传递到内核启动参数中,以供initramfs使用。通常这是类似的root=/dev/sdX。但是,它也可以做一些事情来自动确定您的根设备在哪里,因此根本没有任何参数。由于它只是软件(通常是脚本),因此它可以真正完成挂载根设备所需的任何操作。

现在,如前所述,内核会将真实根挂载为只读。initramfs应该完全做到这一点。完成initramfs之后,系统将完全像完全没有initramfs一样继续引导,然后/sbin/init启动。然后,此init启动所有正常的启动脚本,并且其中一个脚本的工作是读取/etc/fstab,将root切换为读写,并挂载所有其他文件系统。


那么,您是说真正的根文件系统中的/ sbin / init会再次使用/ etc / fstab中的选项重新挂载root吗?
艾哈迈德·格宁姆

3
是。通常通过简单的mount -o remount,rw /。它不会更改已安装的设备,但会更改安装的选项。从手册页:After this call mount reads fstab (or mtab) and merges these options with options from command line
Patrick

如果使用grub2命令行,如何将参数传递给内核引导参数?由于某些原因,我的系统没有显示grub菜单。
直觉

@intuited您应该提出一个新问题。评论不是要
Patrick

lsinitramfs /boot/initrd* | fgrep fstab奇怪的是,至少对于我来说,initramfs确实包含fstab文件。
youfu

2

可能会或可能不会。由于可以通过多种方式构造Initramfs(内核只是加载它并运行即可/init执行任何操作)。但是,使用参数更为常见,因为它可以提供更大的灵活性-即,如果更改了某些内容,则可以编辑启动项,然后一切都会继续进行。使用内置的硬编码根,这不一定是可能的。

无论哪种方式都可能需要fstab条目,因为它还会确定其他内容,例如安装选项(其中一些可以随时更改)和fsck顺序。同样,即使它完全是多余的(并且如果由Initramfs处理,它也可以不使用),但出于完整性考虑,我仍然将条目保留在其中。


1

您可以将/ etc / fstab视为静态挂载,这只是执行此类任务的一种方式,但不是唯一的,实际上,运行命令挂载,您会看到fstab中缺少许多文件系统。诸如udev和udisk之类的服务会忽略/ etc / fstab文件来管理许多“自动挂载” ...

因此,无论是否挂载某些东西,它都与/ etc / fstab无关。

initramfs只是在引导过程中使用的临时rootfs,直到安装了“ true” rootfs,那么为什么initramfs应该位于/ etc / fstab上?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.