Answers:
引导加载程序调用内核时,会向其传递名为的参数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重新挂载该文件系统参数即可。
fstab
如果要指定一些非默认的安装选项,则需要输入。但是,如今使用systemd
,fstab
没有必要使用正确的内核设备和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
,但系统仍会引导。
init
则安装过程中的东西/etc/fstab
根据参数存在,这通常意味着重新安装根分区读写。