这看上去像是一个先有鸡还是先有蛋的问题。
在根分区上的文件里面/etc/fstab
,我可以指定在挂载点挂载不同的分区吗/etc
,例如:
/dev/sda6 /etc defaults 0 0
这会引起什么问题吗?
假设我在新的上有一些合理的内容/etc
,包括相同的 fstab 和正确的 init 和 rc 目录。
稍微重新表述一下这个问题:启动操作的顺序是什么?在运行其余的 init.d 脚本之前,是否先检查是否安装驱动器
?/etc/fstab
答案1
这是一个糟糕的想法。你不应该也不能将它放在/etc
与 不同的分区上/
。内核/etc/fstab
在从 启动时会搜索和一堆其他配置文件/
。如果/etc
它位于不同的、未知的分区上,内核如何找到/etc/fstab
并挂载它?
答案2
听起来你在谈论 Debian。
这如果你使用传统的 init 系统,它会告诉你所有事情。具体来说:
“/sbin/init”程序作为第一个程序执行,并执行主引导过程。Debian 通常使用带有 sysv-rc 包的传统 sysvinit 方案。请参阅 init(8)、inittab(5) 和“/usr/share/doc/sysv-rc/README.runlevels.gz”了解确切说明。此主引导过程基本上经历以下内容。
Debian系统进入运行级别N(none)按照“/etc/inittab”的描述来初始化系统。
Debian系统进入运行级别S,在单用户模式下初始化系统,完成硬件初始化等。
Debian 系统进入指定的多用户运行级别之一(2 到 5)来启动系统服务。
每个运行级别发生的情况是,所有内容都/etc/rcX.d
按字母顺序执行,X
运行级别在哪里。
因此,如果您cd /etc/rcS.d
,您将看到一堆指向 的符号链接/etc/init.d
,这些符号链接以数字开头。数字用于确定顺序。以 开头的符号链接S
在进入运行级别时执行,以 开头的符号链接K
在退出运行级别时执行。运行级别“S”仅用于初始化,因此K
那里没有链接。
如果您修改或重命名任何内容,请谨慎行事。确保在进行启动过程之前测试您的脚本。
好的,现在要尝试实际回答这个问题,以上述信息作为必要的背景。
在 Debian 中,/etc/rc.S/S11mountall.sh
关键的“在 fstab 中挂载所有内容”发生在 。但是,fstab
被咨询以在 挂载根文件系统/etc/rc.S/S07checkroot.sh
。
如果您使用fstab
自动挂载新的/etc
,则/etc/rc.S/S12*
及更高级别的所有内容都将使用“覆盖”卷上的 。但是,您需要事先在根卷上 /etc
启用。/etc/fstab
需要咨询的其他事项/etc
包括/etc/hostname
,可能还有一些与相关的内容udev
(这非常重要)。您需要查看所有来自/etc/rc.S/S11*
和下面的脚本才能确切了解。如果您真的想要/etc
在从外部分区安装之前完全没有,那么您正在考虑修改这些脚本。它可能不会像切换顺序那样简单/etc/rc.S/S12mountall.sh
,例如,但您可以添加一个新脚本,以便更早地从外部分区 /etc/rc.S/S00mountall.sh
引入。/etc
您可以使用 Linuxmount --bind
命令将根卷的原始文件挂载到/etc
某处(例如),以便在对或之前查阅过的其他文件/etc_from_rootfs
进行更改时将其复制过来。 fstab
/etc/rc.S/S12mountall.sh
Linux 内核不像 Windows 那样在启动前和启动过程中使用注册表并要求注册表的存在。内核本身在没有 的情况下可以正常启动(但在 99% 的情况下都不太好用)/etc
,但这取决于之后调用的用户空间程序(以 开头init
),然后查看/etc
,以准备好一个合适的用户环境。
听起来很复杂?确实如此,所以听听 @MattDMo 的意见可能是明智之举。