在 Linux 的启动过程中,我们有initrd
一个根文件系统,它在真正的根文件系统准备就绪之前就被挂载了。挂载的过程是什么?应该发生什么才能说文件系统已挂载?为什么我们说“根文件系统”而不是“文件系统”?
答案1
之所以说是“根文件系统”,是因为在启动时可以挂载许多其他文件系统。根文件/
系统类似于 Windows 上的 C 盘。当文件系统可以通过其挂载点供更高级别的系统功能访问时,文件系统即被挂载。
关于安装过程...我不知道您想要多技术性的答案,所以请不要因为这种过度简化而感到生气。我会这样向我的客户解释:插入闪存驱动器。
- 用户连接 USB 闪存盘
- 操作系统检测到“某物”连接到 USB 端口 X
- 操作系统探测端口并发现有一个闪存驱动器
- 操作系统为设备分配一个设备节点(假设
/dev/sdb
) - 操作系统探测
/dev/sdb
并在主分区上找到分区表 - 操作系统为分区分配一个设备节点(假设
/dev/sdb1
) - 操作系统探测
/dev/sdb1
并识别 FAT32 文件系统 - 操作系统将文件系统挂载
/dev/sdb1
到新的挂载点(如/media/pendrive/
) - 文件系统的内容可供系统访问,因此用户也可以访问
设备的内容(原始数据)只是一堆 0 和 1。安装设备时,系统会在这些 0 和 1 之上添加类似“读/写过滤器”的东西,将 0 和 1 转换为实际文件,反之亦然。
例如:当你将“Hello World”保存到文本文件中时/media/pendrive
,过滤器会根据文件系统的规则将其转换为一系列零和一,然后写入/dev/sdb1
。
答案2
*nix 系统需要文件系统位于/
,也称为根。对于 initrd,根是 initrd 内的虚拟文件系统。系统必须执行“pivot mount”,从而将实际文件系统挂载到根,并将 initrd 文件系统重新挂载到根下。
实际的挂载操作只是在内核中向 VFS 注册一个文件系统,这样它就知道在哪里查找特定目录中的文件。