如何在 NFS 中跟踪符号链接?

Luc*_*cas 8 nfs symlink

我有不同的带图片的磁盘

/media/drive1/pictures/
/media/drive2/pictures/
/media/drive3/pictures/
/media/drive4/pictures/
# ...
Run Code Online (Sandbox Code Playgroud)

我有一个文件夹,名为份额具有符号链接的每个每个子文件夹的图片每个驱动器的目录。我将每个子文件夹与这样的脚本合并:

# I do this for every drive
for item in "/media/drive1/pictures/"*
do
    target=/media/share/pictures/`basename "$item"`
    if [ ! -d "$target" ]; then
        ln -s "$item" "$target"
        chown -h lsc:lsc "$target"
    fi
done
Run Code Online (Sandbox Code Playgroud)

我已经成功地与 Samba 分享了这一点。

[global]
# ...
follow symlinks = yes
Run Code Online (Sandbox Code Playgroud)

由于这是一个纯粹的专用网络并且共享是只读的,因此安全性不是什么大问题。

### /etc/exports
/media/share *(ro,async)
Run Code Online (Sandbox Code Playgroud)

当我挂载我的共享时mount 1.2.3.4:/ foo,符号链接尝试在本地主机上遵循。

我的问题:如何共享挂载的主机上共享遵循符号链接的文件夹?

注:bind bind溶液/etc/fstab不会在这里工作,因为每一个子目录/media/share/点到不同的位置/盘。

小智 6

为什么不能使所有符号链接相对?这样就可以了。

假设在 NFS 服务器 (1.2.3.4) 上安装了以下设备(可能有不同的物理驱动器)

/media/drive1/pictures/
/media/drive2/pictures/
/media/drive3/pictures/
/media/drive4/pictures/
# ...
Run Code Online (Sandbox Code Playgroud)

在脚本中将 ln 行更改为

 ln -s "$item" "$target"
Run Code Online (Sandbox Code Playgroud)

读书

 ln -s "../${item#/media/}" "$target"
Run Code Online (Sandbox Code Playgroud)

这将以以下格式创建符号链接

../drive1/pictures/...
Run Code Online (Sandbox Code Playgroud)

既然您提到这是一个专用网络并且安全性不是问题,您可以将导出设置为

### /etc/exports
/media *(ro,async)
Run Code Online (Sandbox Code Playgroud)

然后在挂载 NFS 的客户端机器上

mkdir -p foo; mount 1.2.3.4:/media foo
Run Code Online (Sandbox Code Playgroud)

在 foo 中,您现在将看到 share、drive1、drive2、drive3、drive4,...

因此,实际上您已经在客户端上安装了整个媒体目录,并且符号链接是相对的,因此它们可以正常工作。所需的更改量非常小,${item#/media/}您的 bash 版本可能支持也可能不支持该语法,任何等效的命令都可以(您可以使用 sed 命令、awk 或任何您熟悉的命令来截断 /media/ )。

如果您有以下文件夹或文件,剩下的唯一问题是唯一的名称

/media/drive1/pictures/same_name1
/media/drive2/pictures/same_name1
Run Code Online (Sandbox Code Playgroud)

当前代码

if [ ! -d "$target" ]; then
    ln -s "$item" "$target"
    chown -h lsc:lsc "$target"
fi
Run Code Online (Sandbox Code Playgroud)

在遇到第一个目标后将跳过创建符号链接。因此,您可能有一些文件缺少符号链接,纯粹是因为该名称已在另一个驱动器中使用。

您需要修改符号链接名称以针对这些情况附加某种唯一标识符。

if [ -d "$target" ]; then
    #extract out the "drive1" part from $item and prepend it to target 
    target="$(echo item | sed -e 's!/media/\([^/]*\)/pictures.*!\1!g')_${target}"
fi

if [ ! -d "$target" ]; then
    ln -s "$item" "$target"
    chown -h lsc:lsc "$target"
fi
Run Code Online (Sandbox Code Playgroud)


slm*_*slm 5

此方法不适用于 NFS 挂载共享。符号链接仅包含指向共享它们的原始系统上的另一个文件或目录的路径。除非您小心地使链接相对或在远程系统上复制与共享创建者相同的目录结构,否则它们根本无法工作。

我想不出任何方法可以允许您通过 NFS 描述的目录结构,并为您提供您正在寻找的功能。

您可能想看看自动挂载的高级功能,特别是这个标题为:设置高级自动挂载地图选项的页面

参考