使用 mount --bind 作为符号链接的替代品有什么缺点吗?

mrt*_*iyo 62 mount symlink

符号链接在诸如lsmv和 之类的函数上有限制,并且cp可以对它们进行操作,因为与诸如 之类的外壳启动命令不同cd,这些函数没有关于用户如何根据逻辑路径访问目录的信息(请参阅相关帖子)。使用该mount --bind选项似乎可以解决这个问题,提供增强的功能以及与 samba 和其他文件服务器的兼容性,因为挂载的目录将具有两个独立的物理路径,而不是链接。

我想使用该mount --bind选项用引用替换我的所有符号链接,但这意味着在 fstab 中安装超过 150 个点。是否有任何可能由此产生的性能问题或我应该考虑的任何其他缺点?

Gil*_*il' 67

使用mount --bind,目录树存在于目录层次结构中的两个(或更多)位置。这会导致许多问题。备份和其他文件副本将选择所有副本。指定要复制文件系统变得很困难:您最终将复制绑定安装的文件两次。使用findgrep -rlocate等进行搜索将遍历所有副本,依此类推。

您不会通过绑定安装获得任何“增强的功能和兼容性”。它们看起来像任何其他目录,这在大多数情况下是不可取的行为。例如,Samba 默认将符号链接公开为目录;使用绑定安装没有任何好处。另一方面,绑定挂载可用于通过 NFS 公开目录层次结构。

绑定安装不会有任何性能问题。您将面临管理方面的难题。绑定挂载有它们的用途,例如使目录树可从 chroot 访问,或暴露由挂载点隐藏的目录(这通常是在重构目录结构时的临时使用)。如果您没有需要,请不要使用它们。

只有 root 可以操作绑定安装。它们无法通过普通手段移动;他们锁定他们的位置和祖先目录。

一般而言,如果您将符号链接传递给命令,则该命令在对文件进行操作时作用于链接本身,如果对文件内容进行操作则作用于链接的目标。这也适用于目录。这通常是正确的。一些命令有选项来区别对待符号链接,例如ls -L, cp -d, rsync -l。无论你想做什么,符号链接更有可能是正确的工具,而不是绑定安装是正确的工具。

  • @mrtrujiyo 对于该要求,我认为在 chroot 中运行 samba 服务器并在该 chroot 中绑定挂载要导出的目录是有意义的。确保从备份等中排除 chroot 的根目录(使用此组织,您只需要排除一个顶级目录,因此维护起来并不麻烦)。 (2认同)
  • 随着容器使用的不断增长,`mount --bind` 正变得越来越“正确的工具”,因为符号链接可能指向容器边界之外。 (2认同)

use*_*ser 15

除了@Gilles之前写的内容之外,值得注意的是,某些实用程序可能会将绑定安装的目录视为单独的文件系统。如果程序不能再假设相同的 inode 编号引用相同的文件(如果它们位于不同的文件系统上,则不会),这可能会对性能或功能产生影响,移动不能作为链接进行优化 -目标然后取消链接源等。


小智 6

当您依赖可能并不总是到位的支持(例如外部磁盘)时,您还应该使用绑定安装而不是符号链接,并且您希望确保原始目录结构就位,即使支持失败或被删除。

例如,如果我想将 /var/tmp 保留在 sd 卡中,我将使用绑定安装,因为即使删除了卡,某些程序也会期望 /var/tmp 是有效目录。