![如何从符号链接绑定挂载](https://linux22.com/image/117469/%E5%A6%82%E4%BD%95%E4%BB%8E%E7%AC%A6%E5%8F%B7%E9%93%BE%E6%8E%A5%E7%BB%91%E5%AE%9A%E6%8C%82%E8%BD%BD.png)
这类似于如何通过符号链接进行绑定安装?
但这里的问题是如何从符号链接进行 mount --bind ?
我有 /linux-4.13.0 和一个指向它的符号链接 linux: /linux -> /linux-4.13.0
不,我喜欢执行 mount --bind /linux /current ,但这实际上挂载了目标 /linux-4.13.0 而不是符号链接。这意味着稍后更改符号链接不会再对安装产生任何影响。有什么办法可以改变这种情况吗?
答案1
不幸的是,由于坐骑的基本原理,你想要的东西无法实现。
调用“mount A B”获取目录“A”并将其附加到内核目录层次结构中以代替“B”。在常见情况下,“A”是包含文件系统的块设备,该 FS 的根目录附加在“B”处。绑定挂载只需简单地获取“A”目录即可。 (移动坐骑本质上与绑定坐骑相同,它们只是另外将“A”从其原始位置分离。)
因此,无论您提供的“A”和“B”路径如何,首先都会通过遍历所有符号链接和相关组件来解析以获得两个实际目录。内核根本就不再具有原始路径了。 (这也是为什么某些系统使用文件 - /etc/mtab - 来记住调用的“mount”命令到底是什么。)
当将非目录(如常规文件)安装到另一个非目录时,所有这些也适用。您只是不能将目录挂载到非目录上,反之亦然。
答案2
使用 Linux v5.12+ 内核,可以使用新的挂载 API 从符号链接创建绑定挂载。这是一个例子:
$ unshare --mount
$ mount --types tmpfs tmpfs /tmp
$ cd /tmp
$ echo TEST1 > test1
$ echo TEST2 > test2
$ ln --symbolic test1 symlink1
$ ln --symbolic test2 symlink2
$ cat symlink1
TEST1
$ cat symlink2
TEST2
$ bindmount-v2 symlink1 symlink2
Mounting symlink1 into symlink2
$ cat symlink2
TEST1
$ cat /proc/self/mountinfo | grep symlink
2221 2323 0:120 /symlink1 /tmp/symlink2 rw,relatime - tmpfs tmpfs rw,inode64
这使用简单的C程序bindmount-v2
。我不知道有任何尝试将其添加到标准安装实用程序中。
添加AT_SYMLINK_NOFOLLOW
是从符号链接创建绑定挂载的关键部分。
笔记:
- 这与我给出的答案几乎相同关于服务器故障因为它适合 Bindmount 的“通过符号链接”和“来自符号链接”情况。
- 符号链接无法绑定安装到目录或从目录绑定安装。