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

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

我有不同的带有图片的磁盘

/media/drive1/pictures/
/media/drive2/pictures/
/media/drive3/pictures/
/media/drive4/pictures/
# ...

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

# 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

我已经和 Samba 成功地分享了一段时间了。

[global]
# ...
follow symlinks = yes

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

### /etc/exports
/media/share *(ro,async)

当我安装共享时,mount 1.2.3.4:/ foo符号链接尝试在本地主机上跟踪。

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

笔记:bind bind中的解决方案在这里/etc/fstab不起作用,因为每个子文件夹都/media/share/指向不同的位置/磁盘。

答案1

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

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

/media/drive1/pictures/
/media/drive2/pictures/
/media/drive3/pictures/
/media/drive4/pictures/
# ...

在脚本中将 ln 行更改为

 ln -s "$item" "$target"

读书

 ln -s "../${item#/media/}" "$target"

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

../drive1/pictures/...

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

### /etc/exports
/media *(ro,async)

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

mkdir -p foo; mount 1.2.3.4:/media foo

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

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

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

/media/drive1/pictures/same_name1
/media/drive2/pictures/same_name1

当前代码

if [ ! -d "$target" ]; then
    ln -s "$item" "$target"
    chown -h lsc:lsc "$target"
fi

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

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

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

答案2

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

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

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

参考

答案3

对,但是...

正如正确回答的可持续发展管理, 你不能解引用符号链接网络文件系统服务器,但正如正确指出的那样亚历杭德罗·伊斯基耶多,你可以使用绑定挂载完成这项工作:

  1. 确保安装您的VFATNTFS选项uid=XXX以匹配正确的用户(LSC)。

    mount -o uid=XXX,gid=YYY /dev/sdX1 /media/drive1
    
  2. 现在您可以更换您的for item in...循环如下:

    for item in /media/"drive1/pictures"/*
    do
        target="/media/share/pictures/$(basename "$item")"
        if [ ! -d "$target" ]; then
            mkdir "$target"
            mount --bind "$item" "$target"
        fi
    done
    

    当然,这必须完成特权!通过使用 sudo 或通过udev脚本...

  3. umount "$target"在卸载真实源 ( /media/driveX)之前,请注意卸载绑定 ( )不要忘记删除挂载点(rmdir "$target")。

    注意:你可以rmdir /media/share/pictures/*,然后会看到一些:

    rmdir: failed to remove '/media/share/pictures/drive1/': Device or resource busy
    

    这些是无害的,那么未使用的空目录将被删除。

答案4

它适用于 NFS 导出选项“nohide,crossmnt”

  1. /dev/sdc1 安装在 /shared 上
  2. /dev/sdd1 安装在 /shared/disk2 上
  3. /etc/exports 有挂载选项野秀交叉点
  4. 现在重新加载导出导出文件系统-ra

参考:https://linux.die.net/man/5/exports

相关内容