使用mount --bind替代符号链接是否有任何缺点?


55

符号链接有像如何限制功能lsmv以及cp可以对它们进行操作,因为不像壳发起类似的命令cd,这些功能没有关于用户如何访问的目录相对于逻辑路径信息(请参阅相关的岗位)。似乎改用该mount --bind选项可以解决此问题,从而提供增强的功能和与samba和其他文件服务器的兼容性,因为装入的目录将具有两个独立的物理路径,而不是链接。

我想使用该mount --bind选项将所有符号链接替换为引用,但这意味着在fstab中安装了150个以上的点。我是否应该考虑此问题或任何其他缺陷而导致潜在的性能问题?


您是否考虑过使用硬链接
ire_and_curses 2012年

1
@ire_and_curses大多数基于Unix的系统都有充分的理由禁止硬链接(并且出于同样的原因,即使在可能的系统上,您也几乎不应该使用它们)。
伊莱亚·卡根

3
@ire_and_curses:为了澄清Eliah的声明,您不能创建指向目录的硬链接(尽管HFS +确实支持该目录)。创建硬链接的递归树不会使两个目录路径保持同步。
bahamat 2012年

Answers:


62

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

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

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

只有root可以操纵绑定安装。它们不能通过普通方式移动;他们锁定位置和祖先目录。

一般而言,如果将符号链接传递给命令,则该命令如果对文件进行操作,则对链接本身起作用;如果对文件内容进行操作,则对链接的目标起作用。这也适用于目录。这通常是正确的事情。有些命令选项,以区别对待的符号链接,例如ls -Lcp -drsync -l。无论您要做什么,符号链接都是正确的工具,而绑定安装是正确的工具。


谢谢。我想我没有考虑对备份,副本和文件搜索的影响。通过在smb.conf中添加“ follow symlinks = yes”,我能够使Samba遵循符号链接,但这确实损害了安全性,因为任何samba用户都可以在可写文件夹中执行“ ln -s / etc”并获得访问系统文件。我正在尝试找到解决方法。如果您知道其中之一,请告诉我。
mrtrujiyo 2012年

2
@mrtrujiyo对于该要求,我认为在chroot中运行samba服务器并在该chroot中绑定安装要导出的目录是有意义的。确保从备份中排除chroot的根,依此类推(对于该组织,您只需要排除一个顶级目录,因此它不会造成很多维护麻烦)。
吉尔斯(Gilles)'所以

14

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


谢谢。我想知道df和du之类的简单实用程序如何处理具有绑定安装的文件系统上的目录大小计算。
mrtrujiyo 2012年

1
df默认情况下,至少我系统上的GNU 甚至不考虑绑定安装的目录,但是如果明确要求,它将被视为同一文件系统的另一个安装。(如果您问我,这是具有df目的的工具的预期行为。)
CVn 2012年

6

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

例如,如果我要将/ var / tmp保留在sd卡中,我将使用绑定挂载,因为即使删除卡,某些程序仍希望/ var / tmp是有效目录。


1

我试过bind mount来解决在(以及and )是符号链接(跨文件系统:SSD到SATA)的系统上用pacman(archlinux,更多有关此内容)安装某些软件包的问题。/var/home/usr/local

起初看起来不错,但是,正如Gilles指出的那样locate,尽管有PRUNE_BIND_MOUNTS = "yes"一行,但始终为单个文件给出多个结果/etc/updatedb.conf

$ locate \*/findutils-4.4.2 | xargs ls -ldiog
33816600 drwxr-xr-x 12 4096 Dec  3 00:05 /SHARED/LOCALS/Manjaro/src/findutils-4.4.2
33816600 drwxr-xr-x 12 4096 Dec  3 00:05 /usr/local/src/findutils-4.4.2

进一步研究,我发现可以正确地修剪更复杂的绑定安装:

$ sudo mount --bind /SHARED/LOCALS/common/ /usr/local/common
$ findmnt | fgrep -n sdb
34:├─/SHARED/LOCALS                  /dev/sdb5           ext4           rw,relatime,data=ordered
35:│ └─/SHARED/LOCALS/Manjaro/common /dev/sdb5[/common]  ext4            rw,relatime,data=ordered
36:├─/usr/local                      /dev/sdb5[/Manjaro] ext4            rw,relatime,data=ordered
37:│ └─/usr/local/common             /dev/sdb5[/common]  ext4            rw,relatime,data=ordered
38:├─/SHARED/HOMES                   /dev/sdb4           ext4            rw,relatime,data=ordered
39:├─/home                           /dev/sdb4[/Manjaro] ext4            rw,relatime,data=ordered
40:├─/SHARED/VARS                    /dev/sdb3           ext4            rw,relatime,data=ordered
41:├─/var                            /dev/sdb3[/Manjaro] ext4            rw,relatime,data=ordered
42:└─/opt                            /dev/sdb5[/opt]     ext4            rw,relatime,data=ordered

$ sudo updatedb --debug-pruning 2>&1 >/dev/null | grep bind
prune_bind_mounts\000
Rebuilding bind_mount_paths:
Matching bind_mount_paths:
Skipping `/SHARED/LOCALS/Manjaro/common': bind mount
Skipping `/usr/local/common': bind mount

$ locate \*/mmedia
/SHARED/LOCALS/common/mmedia

没有PRUNE_BIND_MOUNT选项,我将得到3个结果:

$ sudo sed -i '1 s/yes/no/' /etc/updatedb.conf 
$ sudo updatedb --debug-pruning 2>&1 >/dev/null | grep bind
prune_bind_mounts\000
$ locate \*/mmedia
/SHARED/LOCALS/Manjaro/common/mmedia
/SHARED/LOCALS/common/mmedia
/usr/local/common/mmedia
$ sudo sed -i '1 s/no/yes/' /etc/updatedb.conf 

绑定安装的另一个问题:

当然,可以手动将绑定安装(mounpoint或目标)添加到 PRUNEPATHSin中/etc/updatedb.conf

另外,mountpoint各种stat命令或功能都可以在工具中使用,以改善文件系统的遍历,如本文所述

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.