![Linux 或 Unix 的“/”在启动过程中如何挂载?](https://linux22.com/image/103425/Linux%20%E6%88%96%20Unix%20%E7%9A%84%E2%80%9C%2F%E2%80%9D%E5%9C%A8%E5%90%AF%E5%8A%A8%E8%BF%87%E7%A8%8B%E4%B8%AD%E5%A6%82%E4%BD%95%E6%8C%82%E8%BD%BD%EF%BC%9F.png)
设备可以安装到某个路径。例如,“/dev/sda1”可以安装到“/home/user”。我不明白的是启动过程中“/”是如何安装的,以及安装到哪里。有人能帮忙解释一下吗?
答案1
在 Unix 系统启动期间,内核会执行一些在正常操作期间不会执行的操作。其中之一就是在目录上安装文件系统/
;这与普通的挂载操作有很大不同,因为挂载不是由mount
系统调用触发的,并且目标目录不是现有目录。另一件事是以 PID 1 执行程序,这与正常操作不同,因为这创建了一个没有复制现有流程。
在不同的 Unix 变体中,这种“神奇”的根目录挂载方式有很大不同。内核根据可以通过多种方式指定的配置参数来选择要挂载的设备:编译时配置、内核映像中的运行时配置、某些预定义内存位置中的运行时配置、命令行参数……了解它是如何进行的要在您的机器上运行,您需要查看您的 Unix 变体的文档,并了解您的机器是如何配置的。
为了了解其工作原理,这里概述了现代 Linux 内核的运行方式。这不是最简单的例子,因为 Linux 有着悠久的历史和多种多样的用例。
- Linux 可以从附加到路径的“特殊”文件系统启动
/
,该文件系统由存储在 RAM 中的文件组成。这个特殊的文件系统称为初始化文件系统;它是 rootfs 文件系统类型的一个实例。 initramfs 由引导加载程序通过依赖于体系结构的协议传递的内容填充,直接编译到由引导加载程序加载到内存中的内核映像中。 - 或者,Linux 可以将设备挂载到
/
该设备上,该设备是由内核中的初始化代码识别的受限(但较大)卷类型集的一部分。此类设备类型包括常见类型磁盘上常见类型分区上的任何文件系统(任何类似于 SCSI 的内容,包括 ATA、USB 等),以及 RAM 磁盘和 NFS 安装。 - 根据所采用的路径,初始根文件系统稍后可能会被隐藏或被另一个替换。影子是 initramfs 发生的情况,这就是大多数桌面和服务器系统的运行方式(另一方面,嵌入式系统通常具有硬编码的根文件系统)。更换是发生的事情初始化程序,这是一种特殊的 RAM 磁盘。 initramfs 或 initrd 的工作是加载提供在正常操作中使用的“真实”根文件系统的驱动程序。
答案2
这是来自bootup(7)
Ubuntu 机器上的手册:
系统启动涉及许多不同的组件。加电后,系统 BIOS 将立即执行最少的硬件初始化,并将控制权移交给存储在持久存储设备上的引导加载程序。然后,该引导加载程序将从磁盘(或网络)调用操作系统内核。在 Linux 情况下,该内核(可选)提取并执行初始 RAM 磁盘映像 (
initrd
),例如由 生成的dracut(8)
,它会查找根文件系统(可能用于systemd(1)
此目的)。找到并安装根文件系统后,会将initrd
控制权移交给存储在操作系统映像上的主机系统管理器(例如systemd(1)
),然后系统管理器负责探测所有剩余硬件,安装所有必需的文件系统并生成所有配置的服务。
您可能会发现这一点man boot
,阅读它并没有找到答案,但看到bootup(7)
手册底部的“另请参阅:”。
出于好奇,我查看了手册initrd
:
在第一个启动阶段,内核启动并从内容
/dev/initrd
(例如,由引导加载程序初始化的RAM磁盘)安装初始根文件系统。在第二阶段,从初始根设备的内容加载附加驱动程序或其他模块。加载附加模块后,将从不同的设备安装新的根文件系统(即普通根文件系统)。