很多人一直说 Linux 不保留有关绑定安装的信息,因此无法获取它们及其来源的列表。这里有些例子:
从这里的评论之一:
IIRC 此信息不会保存在任何地方:在 后
mount --bind
,两个副本是等效的,没有一个比另一个更“原始”。毕竟,如果你已经卸载了,就不可能有原件了/mnt
。从这个网站上的答案:
因此,记住哪些挂载是绑定挂载的唯一方法是留在
/etc/mtab
.绑定安装操作由绑定安装选项指示(这会导致文件系统类型被忽略)。但是 mount 没有选项仅列出使用一组特定选项集安装的文件系统。-
这是故意的。两个挂载点在所有方面都完全相等,因此内核不会保留任何标志来区分它们。
以上虽然都是废话。该工具findmnt
能够列出绑定安装的源路径(以 的形式device[source-path]
;我也试图让它列出只是源路径而不是设备)。如果 Linux 内核要维护绑定挂载,则必须存储该信息某处,否则它无法知道/home
必然是/users
。那么这些数据在哪里呢?它是否存储在 RAM 中某个不起眼的区域?是否findmnt
在/proc
某处寻找?
答案1
你有点误解了;两个挂载点是平等的在权限、标志等方面,因为绑定有效地将访问从一个路径重定向到另一路径。但他们仍然清楚的。
如果你看一下,/proc/self/mountinfo
你会看到这个进程的挂载世界的内核视图(命名空间使事情变得更加复杂;不仅仅是一安装表视图)。
man 5 proc
将解释该文件的格式,但您可以看到树层次结构以及绑定安装有其“父级”的位置。这是解析的文件findmnt
。
答案2
Linux 不保留以下信息哪个挂载是绑定挂载。它确实保留了有关的信息所有安装座,包括绑定安装座。
它与硬链接非常相似。安装到文件系统的链接,就像文件名链接到索引节点一样。唯一的区别是挂载还具有每个挂载点标志,并且可能引用目标文件系统的子目录而不是文件系统根目录。
当您创建硬链接时,文件系统不会保存哪个文件名是原始文件名以及哪个文件名是硬链接。两者都只是引用同一个索引节点。如果取消链接原始文件,则情况与直接使用第二个文件名创建文件没有什么区别。
回到绑定挂载:内核保留一个表,其中包含文件系统(由主:次数字对标识)、挂载点、相对于文件系统根的路径和一些标志。您可以通过查看访问此列表/proc/self/mountinfo
。 (当涉及命名空间时,事情会变得更加复杂,正如 @stephen-harris 提到的)。findmnt
解析这个列表。
如果你的根是/dev/sda1
major:minor8:1
并且你运行mount --bind /a /b
/proc/self/mountinfo
将包含类似这样的行:
1 0 8:1 / / rw - ext4 /dev/sda1 rw,errors=remount-ro
2 1 8:1 /a /b rw - ext4 /dev/sda1 rw,errors=remount-ro
如果你使用的/home
是/dev/sda2
major:minor8:2
并且你运行mount --bind /home /users
它会看起来像这样:
1 0 8:1 / / rw - ext4 /dev/sda1 rw,errors=remount-ro
2 1 8:2 / /home rw - ext4 /dev/sda2 rw
3 1 8:2 / /users rw - ext4 /dev/sda2 rw
您的问题的相关列是第三、第四和第五列。这些是文件系统 ID(对于真实的文件系统 它与设备主要:次要相同;对于像 tmpfs 这样的虚拟文件系统,它是 [0:柜台])、相对于绑定到挂载点的文件系统根的路径(通常/对于普通挂载,对于绑定挂载可以是任何内容)和挂载点。
有关其余列的含义,请参阅Linux 内核文档。
findmnt
调用相对于文件系统根“FSROOT”的源路径。您可以使用findmnt -o TARGET,FSROOT
它来获取它。如果您想要绝对源路径,您可能需要/proc/self/mountinfo
自己解析并结合有关同一文件系统的安装信息。
欲了解更多信息,请参阅我对“仅列出绑定安装”的回答。