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

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

我知道目录是一个包含“名称=索引节点号”行的文件。

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

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

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

例如,我的根目录列表的一部分显示了索引节点号:

ls -d1i /*/

inode # name
656641  /bin/
2       /boot/
530217  /cdrom/
2       /dev/
525313  /etc/
2       /home/
393985  /lib/

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

答案1

您对过程的描述不太正确。

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

对于 Linux,您可以在以下位置找到文档:内核文档,在这个网站上以及网络上的其他地方。布鲁斯·菲尔兹对主题有很好的介绍。

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

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

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

答案2

我不确定这是否可以得到普遍回答,因为这是一个实施问题。当然,操作系统必须以某种方式知道给定的目录是挂载点,但操作系统编写者需要考虑如何完成此操作。我不了解 Linux、*BSD、Solaris 等的内部结构,也不敢假设它们之间有任何相似或差异。


作为猜测,我认为我们可以通过 {device, inode} 对唯一地标识一个 inode (st_devst_inostruct stat)。假设禁止目录的硬链接,目录 inode 也将有一个唯一的名称。

因此,一种方法是建立一个包含系统中所有挂载点的表,然后操作系统在行走路径时会检查每个目录。

如果系统有某种 inode 缓存(一种有用的优化),我们可以通过在在记忆中inode 结构来判断该 inode 是否是挂载点。

答案3

当文件系统安装在特定安装点时,操作系统从安装的文件系统中读取超级块并将其加载到内存中。超级块以及许多其他东西都包含有关该文件系统根的索引节点的信息。

上面的观点是正确的,操作系统数据结构保存了所有已挂载文件系统的记录,如果另一个文件系统已挂载在 /home/ 上,则将查询该文件系统的超级块以获取其根目录的 inode 号。

相关内容