ls
符号链接在、mv
、 等函数如何cp
对其进行操作方面存在限制,因为与 等 shell 启动命令不同cd
,这些函数没有有关用户如何相对于逻辑路径访问目录的信息(请参阅相关内容)邮政)。似乎使用该mount --bind
选项可以解决这个问题,提供增强的功能以及与 samba 和其他文件服务器的兼容性,因为安装的目录将有两个独立的物理路径,而不是一个链接。
我想使用该mount --bind
选项将所有符号链接替换为引用,但这意味着在 fstab 中安装超过 150 个点。是否存在由此可能引起的任何性能问题或我应该考虑的任何其他缺点?
答案1
对于mount --bind
,目录树存在于目录层次结构中的两个(或更多)位置。这可能会导致许多问题。备份和其他文件副本将选择所有副本。指定要复制文件系统变得很困难:最终将复制绑定安装的文件两次。使用find
、grep -r
、等搜索locate
将遍历所有副本,依此类推。
您不会通过绑定安装获得任何“增强的功能和兼容性”。它们看起来像任何其他目录,这在大多数情况下都是不可取的行为。例如,Samba 默认将符号链接公开为目录;使用绑定安装没有任何好处。另一方面,绑定挂载对于通过 NFS 公开目录层次结构非常有用。
绑定安装不会出现任何性能问题。您将遇到令人头痛的管理问题。绑定挂载有其用途,例如使目录树可从 chroot 访问,或公开挂载点隐藏的目录(这通常是目录结构正在重构时的暂时使用)。如果您没有需要,请不要使用它们。
只有 root 可以操作绑定安装。它们无法通过普通方式移动;他们锁定自己的位置和祖先目录。
一般来说,如果将符号链接传递给命令,则如果该命令对文件进行操作,则该命令将作用于链接本身;如果它对文件内容进行操作,则该命令将作用于链接的目标。这也适用于目录。这通常是正确的事情。某些命令具有以不同方式处理符号链接的选项,例如ls -L
, cp -d
, rsync -l
。无论您想做什么,符号链接比绑定安装更有可能是正确的工具。
答案2
此外@Gilles 写了什么早些时候,值得注意的是,一些公用事业可能将绑定安装的目录视为一个单独的文件系统。如果程序不能再假设相同的 inode 号引用同一个文件(如果它们位于不同的文件系统上,则不会),则这可能会对性能或功能产生影响,无法将移动优化为 link-at-目标然后取消链接源等
答案3
当您依赖可能并不总是到位的支持(例如外部磁盘)并且您希望确保原始目录结构就位(即使该支持)时,您还应该使用绑定安装而不是符号链接失败或被删除。
例如,如果我想将 /var/tmp 保留在 SD 卡中,我将使用绑定挂载,因为即使卡被移除,某些程序也会期望 /var/tmp 是一个有效的目录。
答案4
当涉及到文件绑定挂载时,它们的行为更接近于硬链接而不是符号链接。这可能会产生一些微妙的后果,例如:
# echo 1 > 1.txt
# touch 2.txt
# mount --bind 1.txt 2.txt
# cat 2.txt
1
# echo 1a > 1.txt
# cat 2.txt
1a
到目前为止一切顺利,但现在考虑有多少程序(编辑器、正确编写的脚本等)实际修改了文件:
# echo 1new > 1new.txt
# mv 1new.txt 1.txt
# cat 1.txt
1new
# cat 2.txt
1a
如果2.txt
是一个符号链接,1.txt
那么最后一个命令将有输出1new
,这正是人们所期望的。
这可能会导致一些微妙的问题:在 systemd 中我使用BindReadOnlyPaths=
使特定服务使用resolv.conf
与系统其他部分不同的文件,但结果却以奇怪且难以诊断的方式变得不稳定,因为resolvconf
会代替服务背后的源文件。