findmnt如何列出绑定安装?


11

许多人一直在说Linux不保留有关绑定安装的信息,因此无法获取它们及其来源的列表。这里有些例子:

  • 这里的评论之一

    IIRC不会在任何地方保存此信息:之后mount --bind,两个副本是等效的,没有一个副本比另一个副本更“原始”。毕竟,如果您已经卸载了,可能就没有原稿了/mnt

  • 这个网站上的答案

    因此,记住什么挂载是绑定挂载的唯一方法是保留在中的挂载命令的日志/etc/mtab。绑定安装操作由bind mount选项指示(这将导致忽略文件系统类型)。但是mount没有选择仅列出通过一组特定的选项集安装的文件系统的选项。

  • 来自Debian错误报告

    这是故意的。两个安装点在所有方面都完全相等,因此内核不会保留任何标志来区分它们。

上面是胡说八道。该工具findmnt能够列出绑定安装的源路径(以device[source-path];形式;我也试图使其列出源路径,而不列出设备)。如果Linux内核要维护绑定安装,那么该信息必须存储在某个地方,否则它就不知道/home绑定到了/users。那么这些数据在哪里呢?它是否存储在RAM中的某些模糊区域中?是否findmnt在看/proc什么地方?


findmnt您运行的是哪个版本,并且提供了哪些选择?煤矿不打印出来一样,并查看源代码,它看起来是使用_PATH_PROC_MOUNTINFO它看起来是/proc/self/mountinfo不具有在它这个信息无论是。
布拉奇利

好吧,我想/proc/self/mountinfo最近才进行了重组。我当时在我的RHEL6机器上,之前没有路径信息,但是我的RHEL7机器上有,并且如您的链接中所述Wheezy也有。
布拉奇利

这不是废话:对于较旧的内核确实如此,但是较新的内核确实可以跟踪信息。
吉尔斯(Gillles)“所以-别再邪恶了”

@Gilles如果不跟踪一个目录在另一个目录上挂载的信息,绑定挂载如何持久化?
Melab

@Melab实际上,如果您不跟踪绑定挂载,则绑定挂载更容易持久。当/dev/A挂载/B并执行操作时mount --bind /B /C,较早的内核只会记住/B → /dev/A/C → /dev/A,而他们不会记住/B和之间的任何关系/C。因此,卸载/B自然不会对产生影响/C。较新的内核记住这/C是的绑定安装/B,但是以某种方式(/C如果/B已卸载)不会阻止其继续工作,我不知道具体如何。
吉尔斯(Gillles)“所以-别再邪恶了”

Answers:


12

您误会了一些;因为绑定有效地将访问从一条路径重定向到另一条路径,所以两个安装点在权限,标志等方面是相等的。但是它们仍然是不同的

如果您看一下,/proc/self/mountinfo将会看到此过程的挂载世界的内核视图(命名空间使事情变得更加复杂;不仅是挂载表的一个视图)。

man 5 proc将说明该文件的格式,但是您可以看到树的层次结构以及绑定安装在哪里具有其“父级”。这是findmnt解析的文件。


9

Linux不保留有关哪个安装是绑定安装的信息。它确实保留有关所有安装(包括绑定安装)的信息

这与硬链接非常相​​似。将链接挂载到文件系统,例如将文件名链接到inode。唯一的区别是,挂载也具有按挂载点标志,并且可以引用目标文件系统的子目录而不是文件系统根目录。

创建硬链接时,文件系统不会保存哪个文件名是原始文件名,哪个文件是硬链接。两者都简单地引用同一个inode。如果取消链接原始文件,则与使用第二个文件名直接创建文件时的情况几乎没有区别。

返回绑定安装:内核保留一个表,该表包含文件系统(由major:minor数字对标识),安装点,相对于文件系统根的路径以及一些标志。您可以通过查看访问此列表/proc/self/mountinfo。(如@ stephen-harris所述,当涉及名称空间时,它会变得更加复杂)。findmnt解析此列表。

如果您的主目录/dev/sda1以major:minor 为根,8: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与主要:次要8: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(对于实际文件系统,它与设备major:minor相同;对于虚拟文件系统,如tmpfs,它是[0:counter ]),是相对于绑定到安装点的文件系统根目录的路径(通常是/正常挂载,对于绑定挂载可以是任何东西)和挂载点。
有关其余各列的含义,请参见Linux内核文档

findmnt调用相对于文件系统根目录“ FSROOT”的源路径。您可以使用findmnt -o TARGET,FSROOT它。如果您想要绝对的源路径,则可能需要/proc/self/mountinfo自己解析并合并有关同一文件系统的安装信息。

有关更多信息,请参见我对“仅列出绑定安装”的回答


如果/proc/self/mountinfo可以包含这样的行2 1 8:1 /a /b rw - ext4 /dev/sda1 rw,errors=remount-ro,那么Linux无疑保留一些有关绑定安装的信息。
Melab

不,看我的第二个例子。它保留有关安装了哪个文件系统以及安装了相对于文件系统根目录的路径的信息。因此,对于mount --bind /home/melab /mnt所得到的行可能看起来像以下任何根据其中的/home/home/melab是一个挂载点:3 1 8:1 /home/melab /mnt rw - ext4 /dev/sda1 rw3 1 8:2 /melab /mnt rw - ext4 /dev/sda2 rw3 1 8:3 / /mnt rw - ext4 /dev/sda3 rw
cg909

确实,/与第四栏中的内容不同通常表示绑定安装。但这也可能是Btrfs子卷。
cg909

/dev/sda3应该被安装在/home/melab
Melab

是。在我的例子我用/dev/sda1//dev/sda2作为/home/dev/sda3作为/home/melab
cg909
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.