挂载点目录条目与文件系统中的普通目录条目有何不同

Min*_*Max 8 filesystems mount inode

我知道目录是一个包含行类型为“名称 = 节点编号”的文件。

当我请求像 /home/my_file.txt 这样的路径时,会发生以下步骤:

  1. 转到第 2 个 inode(根目录默认 inode)
  2. 获取 inode #2 指向的文件。
  3. 搜索此文件并找到“home”条目。获取其 inode 编号,例如 135。
  4. 获取 inode #135 指向的文件。
  5. 搜索此文件并找到“my_file.txt”条目。获取其 inode 编号,例如 245。
  6. 获取 inode #245 指向的文件。

问题:如果主目录是另一个文件系统的挂载点,驻留在另一个块设备上,这个过程有何不同?当系统理解时,这个目录是挂载点,它是如何做到的?这些信息存储在哪里 - 在 inode、目录文件或其他地方?

例如,显示 inode 编号的根目录列表的一部分:

ls -d1i /*/

inode # name
656641  /bin/
2       /boot/
530217  /cdrom/
2       /dev/
525313  /etc/
2       /home/
393985  /lib/
Run Code Online (Sandbox Code Playgroud)

在这里,主目录和引导目录是挂载点并驻留在自己的文件系统上。运行我的伪代码算法(上面写的)并停留在第 3 步 - 在这种情况下,home inode 号是 2,它位于另一个文件系统和另一个块设备中。

Gil*_*il' 9

你对这个过程的描述不太正确。

内核会跟踪哪些路径是挂载点。它的确切方式因内核而异,但通常信息是根据路径存储的。例如,内核会记住“/是这个文件系统,/media/cdrom是这个文件系统,/proc还是这个文件系统”等。通常,内核不是将路径字符串映射到表示已安装文件系统的数据结构的表,而是按目录存储表。与目录条目相关联的数据通常称为dentry. 根目录有一个 dentry,在每个目录中,内核记住的那个目录中的每个文件都有一个 dentry。dentry 包含一个指向 inode 结构的指针,而 inode 包含一个指向文件所在文件系统的文件系统数据结构的指针。在挂载点,关联的文件系统与父 dentry 的关联文件系统不同,并且有额外的元数据来跟踪挂载点。所以在典型的unix内核架构中,/除了包含根目录的inode的指针外,dentry for还包含一个指向根文件系统信息的指针;/proc(假设它是一个挂载点)的 dentry包含一个指向有关 proc 文件系统等信息的指针。 If/media/cdrom是一个挂载点但不是/media,内核会在 dentry 中记住/media它,因为它不允许忘记它:记住/media不仅仅是缓存性能的问题,还需要记住挂载点的存在/media/cdrom

对于 Linux,您可以在内核文档此站点和 Web 上的其他地方找到文档。布鲁斯·菲尔兹 (Bruce Fields ) 很好地介绍了该主题。

当内核被告知访问文件时,它一次处理一个以斜杠分隔的文件名,并每次查找该组件。如果它找到一个符号链接,它就会跟随它。如果找到挂载点,实际上不需要特殊处理:只是将 inode 附加到不同的目录。

该进程不使用 inode 编号,而是遵循pointers。inode 编号是一种为内核之外的给定文件系统上的每个文件提供唯一标识的方法:磁盘上和应用程序。有些文件系统没有唯一的 inode 编号;文件系统驱动程序通常会尝试组成一个,但这并不总是有效,尤其是对于网络文件系统(例如,如果服务器导出包含挂载点的目录树,则该挂载点上方和下方的一组 inode 之间可能存在重叠观点)。将名称映射到 inode 编号的行是典型的磁盘文件系统(如果它支持硬链接)的工作方式;不支持硬链接的文件系统并不真正需要 inode 编号的概念。

请注意,有关挂载点的信息仅存储在内存中。挂载文件系统时,这不会修改挂载文件系统的目录。该目录仅被挂载的文件系统的根目录隐藏。