绑定安装和 df 输出

atr*_*eyu 6 mount disk-usage fstab bind

我有一个分区/dev/sdb1,它安装在/data。在 /etc/fstab 我有:

/dev/sdb1           /data           ext4  defaults  1 2
Run Code Online (Sandbox Code Playgroud)

挂载该分区后,我将进行以下绑定挂载:

/data/backups/f17/opt   /opt            none  rw,bind   0 0
/data/backups/f17/home  /home           none  rw,bind   0 0
/data/var/www/html      /var/www/html/  none  rw,bind   0 0
Run Code Online (Sandbox Code Playgroud)

所有的安装都做得很好。

问题是,当我运行时df,我获得的与 sdb1 相关的唯一条目指向“/opt”,而不是“/data”。

例如:

/dev/sdb1   240233144 196081648 31925236 86% /opt
Run Code Online (Sandbox Code Playgroud)

我期望/想要df显示原始安装点,即/data,而不是/opt。或者至少,显示与 sdb1 相关的所有挂载点。如果我umount是 /opt 绑定挂载点,那么很df高兴地显示 /data (即使其他两个绑定挂载仍然被挂载,奇怪的是)。

如果我在终端中执行挂载命令,则行为没有区别(与让系统通过mount -a使用 /etc/fstab执行挂载命令相比)。

我知道我可以使用类似的东西findmnt --df来更好地了解所有已安装的文件系统,但我想使用df(并且我不想将 df 别名为其他任何东西)。

  • 软呢帽 21
  • 内核 3.19.3-200.fc21.x86_64
  • df (GNU coreutils) 8.22
  • 从 util-linux 2.25.2 挂载

谢谢。

更新
(添加更多信息)

该文件/proc/mounts显示了所有四个挂载点:

/dev/sdb1 /data ext4 rw,relatime,data=ordered 0 0
/dev/sdb1 /var/www/html ext4 rw,relatime,data=ordered 0 0
/dev/sdb1 /home ext4 rw,relatime,data=ordered 0 0
/dev/sdb1 /opt ext4 rw,relatime,data=ordered 0 0
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 7

绑定安装相当于原始安装。没有一个标记为原件,一个标记为副本。绑定挂载在这方面就像硬链接,而不是符号链接。

由于 GNU coreutils 8.21(如果我正确阅读了变更日志),df努力只报告每个文件系统一次。旧版本的每个非忽略挂载点包含一个条目,因此绑定挂载会导致多个条目。df显示每个文件系统的最新挂载点,只要它可以确定。在您的情况下,df报告/opt,而不是/data,因为/opt是最后添加的。

传递选项-a以获取最近的 coreutils 以报告每个文件系统的所有条目。如果您不传递路径参数,这也会导致列出通常会被忽略的文件系统。如果您确实传递了路径参数,我认为df除了最新的挂载点外,永远不会报告任何内容。

如果您不想为df其他内容设置别名,您要么必须替换df为自定义实现,要么必须忍受df报告与您想要的内容不同的内容。如果您需要最早的挂载点而不是最新的挂载点,明智的解决方案是df -a仅调用并保留您感兴趣的设备的第一个匹配项。