在挂载root之前如何访问/ etc / fstab?


21

当我/etc/fstab遇到这个鸡与蛋的问题时,我正在对进行一些更改-如果/etc/fstab包含安装文件系统(包括根分区)的说明,那么操作系统如何首先读取该文件?

Answers:


18

引导加载程序调用内核时,会向其传递名为的参数root。因此,一旦内核完成初始化,它将继续通过将给定的根分区安装到/然后调用来继续/sbin/init(除非已被其他参数覆盖)。

然后,该init过程通过加载定义为在默认运行级别中启动的所有服务来启动系统的其余部分。

根据您的配置和所使用的init系统,我提到的步骤之间可能还有其他多个步骤。当前,Linux上最流行的初始化系统是SysVInit(传统系统),Upstart和Systemd。您可以在此Wikipedia文章中找到有关启动过程的更多详细信息。

这是我的Grub配置的简化示例。回答您问题的重要部分在倒数第二行,其中有一个root=/dev/sda3

menuentry 'Gentoo GNU/Linux' --class gentoo --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-40864544-2d0f-471a-ab67-edd7e4754dae' {
    set root='hd0,msdos1'
    echo    'Loading Linux 3.12.6-gentoo-c2 ...'
    linux   /kernel-3.12.6-gentoo-c2 root=/dev/sda3 ro  
}

在许多配置中,内核/以只读模式挂载,所有其他选项均设置为默认值。在其中,/etc/fstab您可以指定文件系统参数,一旦init重新挂载该文件系统参数即可。


2
根分区最初是由内核以只读方式安装的。一个init则安装过程中的东西/etc/fstab根据参数存在,这通常意味着重新安装根分区读写。
goldilocks 2014年

1
也可以使用硬编码例程编译内核,该例程在活动分区上寻找尚未安装的特殊文件。FreeBSD加载程序就是这样。
Kondybas 2014年

Linux上的@Kondybas LILO也经过硬编码,以某些固定的块号加载内核
phuclv

3

fstab如果要指定一些非默认的安装选项,则需要输入。但是,如今使用systemdfstab没有必要使用正确的内核设备和fstype了。您可以将root条目替换为以下内容:

#UUID=8f74237d-b689-4beb-9d1f-f60b426c9969 /            ext4        rw,relatime,data=ordered    0 1
dummy /             auto        rw,relatime,data=ordered,debug  0 1

并且mount选项仍然被systemd接受。

您可以使用任何错误的设备名称,例如/dev/sdz1,但错误的UUID除外。如果UUID错误,则消息将在boot:处打印Failed to start Remount Root and Kernel File Systems,但系统仍会引导。

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.