当我对 进行一些更改/etc/fstab
时,我想到了先有鸡还是先有蛋的问题 - 如果/etc/fstab
包含挂载文件系统(包括根分区)的说明,那么操作系统首先如何读取该文件?
答案1
当引导加载程序调用内核时,它会向其传递一个名为 的参数root
。因此,一旦内核完成初始化,它将继续安装给定的根分区,/
然后调用/sbin/init
(除非已被其他参数覆盖)。
然后,该init
进程通过加载定义为在默认运行级别启动的所有服务来启动系统的其余部分。
根据您的配置和您使用的初始化系统,我提到的步骤之间可能还存在多个其他步骤。目前Linux上最流行的init系统是SysVInit(传统的)、Upstart和Systemd。您可以在此处找到有关启动过程的更多详细信息维基百科文章。
这是我的 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
fstab
如果要指定一些非默认安装选项,则需要输入。然而,现在有了systemd
,正确的内核设备和 fstypefstab
就不再需要了。您可以将根条目替换为以下内容:
#UUID=8f74237d-b689-4beb-9d1f-f60b426c9969 / ext4 rw,relatime,data=ordered 0 1
dummy / auto rw,relatime,data=ordered,debug 0 1
并且 systemd 仍然尊重挂载选项。
您可以使用任何错误的设备名称,例如/dev/sdz1
,但错误的 UUID 除外。如果 UUID 错误,则会在 boot: 处打印消息Failed to start Remount Root and Kernel File Systems
,但系统仍会启动。