ln -s
使用或之间有什么实际区别吗mount --bind
?
我想将一些文件夹移动到另一个分区,而不更改其守护进程设置,并且想知道我应该采取什么方法。
我更喜欢它,ln -s
因为它只需要最少的设置(无需/etc/fstab
修改),但也许有一个原因让它不常见?
答案1
当然可以。如果你执行,ln -s
你就会创建一个符号链接,这是一个索引节点指向某个文件系统对象,这就是为什么符号链接可以遍历文件系统而硬链接不能:硬链接没有自己的 inode。
如果你使用挂载文件系统--bind
,则会创建第二个挂载点对于设备或文件系统。
如果您将符号链接设想为重定向,那么将--bind
挂载的文件系统设想为创建另一个数据网关。
符号链接和绑定挂载是完全不同的另一回事。
对我来说,挂载--bind
似乎更可靠,并且可能比使用符号链接要快一些。另一方面,使用符号链接没有严重的缺点,因为性能影响很小(如果存在的话)。
编辑:我一直在考虑这个问题,性能损失可能比我最初想象的要大一些。如果你有一个读取大量不同文件的应用程序,那么打开的每个新文件都需要额外读取。一些研究这里表明我的假设是正确的,因此如果您在那里运行 IO 繁重的应用程序,请考虑--bind
在符号链接解决方案之上安装的选项。
它不常见的原因可能是符号链接在 中可见ls
,而绑定挂载仅在查看 /proc/mounts 或 /etc/mtab 时可见(如果不带参数执行 mount 命令,则 mount 命令会执行此操作)。除此之外,我认为没有任何问题。不过,如果有问题,我会很感兴趣。
添加:另一个问题是ln -s
,对于某些应用程序,当路径被取消引用时,如果它“期望”某些项目位于特定位置,则可能导致应用程序停止运行。
答案2
和绑定挂载之间的一个很大的区别ln -s
是,你可以使用绑定挂载来“修改”只读文件系统。例如,如果在 上挂载了一张 CD /mnt/application
,而你想/mnt/application/badconfigfile.conf
用正确的版本替换它,你可以这样做:
mount -o bind /path/to/correct/file.conf /mnt/application/badconfigfile.conf
由于您无法修改目标文件系统,因此不可能使用符号链接来影响相同的更改。
如果您通过 NFS(或某种集群文件系统)分发了一套通用软件,并且想要在一个系统上进行特定于主机的更改,那么这也可以发挥很好的作用。您只需在目标系统上使用绑定挂载即可根据需要覆盖文件或目录。
答案3
对我来说 ln -s 和 mount --bind 之间的实际区别#1:
vsftpd 不允许通过符号链接浏览目录,但在挂载时允许。
我不知道你使用的是什么守护进程,但它的行为可能类似。
答案4
有人可能会注意到,绑定到支架的结果本身就是一种绑定,后来又被反弹,原始绑定保持完好,假设所有东西都保持物理连接。
也就是说,如果将 A 绑定到 B,将 B 绑定到 C,然后将 D 绑定到 B,则 C 仍将绑定到 A。这可能是您想要的,也可能不是。如果希望 C 跟随 B,则使用相同的目标(即 )重新挂载mount -o remount B C
,或者改用--rbind
。没有--rebind
选择。