Linux 如何在挂载期间隐藏文件?

Linux 如何在挂载期间隐藏文件?

在 Linux 中,所有文件都有一个文件路径,由 dentry 和 inode 链表示。挂载文件系统时,其挂载点由文件路径指定,挂载点处的原始文件将无法访问。卸载文件系统时,原始文件将再次变为可访问。因此,在挂载时,原始文件的 dentry 必须发生一些变化。我想象每个文件路径处都有一组 dentry,挂载和卸载会堆叠和取消堆叠 dentry,但我在代码中没有看到这方面的证据。

就 dentry、vfsmount 等结构而言,Linux 如何在挂载期间隐藏原始文件?

答案1

我想我明白了这是怎么回事。关键是要明白 mount 会影响路径遍历,而不是已经打开的文件。

在挂载之前,打开文件 /tmp/a 会导致路径遍历和结构文件。路径遍历从根 vfsmount 的 / dentry 开始,继续到 /tmp dentry,然后到 /tmp/a dentry,结构文件的路径指向根 vfsmount 和 /tmp/a dentry,其 inode 指向文件的内容。

在 /tmp/a 上挂载文件系统时,系统会在挂载点哈希表中注册 (root vfsmount, /tmp/a dentry) 对,通过设置标志将 /tmp/a dentry 更新为挂载点,并添加新的 vfsmount 作为 root vfsmount 的子项。新的 vfsmount 指向两个 dentry:通过其 mountpoint 成员指向 /tmp/a dentry,通过其 root 成员指向其自己的 / dentry。

挂载后,打开 /tmp/a 会导致路径遍历和文件结构,就像以前一样。但现在,当路径遍历到达 /tmp/a 目录时,它会检测挂载标志,在哈希表中查找已挂载文件系统的 vfsmount 并“跳转”到其 / 目录。结构文件的路径指向已挂载的 vfsmount 及其 / 目录,而此目录的 inode 指向文件的内容。

在挂载之前打开的 struct file 上的文件操作(例如读取和写入)会继续工作,就像什么都没发生一样,因为 struct file 有一个指向根 vfsmount 的 /tmp/a dentry 的指针,并且 dentry 的 inode 未被挂载更改。但是任何通过 /tmp/a 的新路径遍历都会跳转到另一个 vfsmount 的另一个 dentry,因此原始的 /tmp/a dentry 将不会返回,因此它会被隐藏,直到卸载。

我意识到的一件事是,路径遍历由 vfsmount/dentry 对链表示,而路径由特定的 vfsmount/dentry 对表示。

相关内容