如何通过符号链接进行绑定挂载?

如何通过符号链接进行绑定挂载?

我有一个符号链接:

/test

指向一个目录:

/source

我想执行绑定挂载以将 /new 挂载到 /test 上

mount -o bind /new /test

但是这会将 /new 绑定到 /source 上(/test 指向 /source - 显示来自 /new 的文件,但不是我想要的)。如何停止按照符号链接挂载并将其挂载到 /test。

答案1

由于 /test 不是真实目录,因此此方法无效。
取消链接,将其创建为真实目录,然后执行绑定挂载。

答案2

可以使用新的 Linux 内核挂载 API 通过符号链接创建绑定挂载。以下是示例:

unshare -m
mount -t tmpfs tmpfs /tmp
cd /tmp
echo TEST1 > test1
echo TEST2 > test2
ln -s test1 symlink1
ln -s 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,源代码https://github.com/Snorch/linux-helpers/blob/master/bindmount-v2.c

我不知道有任何尝试将其添加到安装实用程序。

仅支持 v5.12+ 内核。AT_SYMLINK_NOFOLLOW 是在符号链接之上创建绑定挂载的关键部分。如果您删除 mount_setattr 相关的块(这对您的情况可能并不重要),您可以在 v5.2+ 内核上执行相同操作。

注意:符号链接不能与目录绑定安装。

相关内容