我有一台 Synology NAS 机箱(运行 DSM 5.1),并且我已通过 NFS 导出目录。我正尝试将其安装到我的 Ubuntu 机箱上。
它大部分情况下运行良好,但我遇到了用户和组映射问题。在 Ubuntu 机器上,我的 uid 是 1000 (roger),gid 是 1000 (roger)。在 Synology 上,我的 uid 是 1026 (roger),组是 100 (用户)。
如果我使用 NFSv3,它会使用数字 uid/gid 值,这意味着 Synology 上的所有权混乱。
如果我仅从同一个 Ubuntu 机器使用同一个用户访问 NFS 挂载,那就没问题,但是我还使用 CIFS(SMB)从 Windows 机器访问目录,这意味着权限错误。
如果我使用 NFSv4 ( mount -o nfsvers=4
),并使用 Synology 上的默认设置,则从Ubuntu 框查看时roger.users
,Synology 上拥有的文件将显示为拥有roger.users
。这很好。
但是,当我touch
有一个文件时:
roger@ubuntu$ touch /mounts/diskstation/music/foo
它最终1000.1000
在 Synology 上归所有,并且nobody.4294967294
从 Ubuntu 框查看时显示为所有。
我在 Synology 论坛上找到的有关该主题的所有内容要么是 2011 年发布的,当时不支持 NFSv4,要么是人们问了同样的问题然后放弃了。
为了完整性,/etc/exports
有:
/volume1/music 10.0.0.0/24(rw,async,no_wdelay,root_squash,insecure_locks,sec=sys,anonuid=1025,anongid=100)
...我正在用以下命令将它安装在 Ubuntu 机器上:
mount -t nfs diskstation:/volume1/music /mounts/diskstation/music/ -o rw,nfsvers=4
sec=sys
我发现了一些可能存在问题的迹象:为什么 NFSv4 uid/gid 映射不适用于 AUTH_UNIX (AUTH_SYS),但是这没有解决方案。
有没有简单的方法可以解决这个问题?有没有更复杂的方法(咳嗽凯尔伯罗斯咳嗽) 有什么方法可以解决这个问题?
说真的,如果 Kerberos是答案是,我会接受,但我希望在浪费大量时间之前先知道答案。
更新:而Synology 文档讨论了各种 Kerberos 选项,但我在 UI 中找不到它们。发行说明状态“如果实施了 Kerberos 安全风格...”。我找到(但无法再找到)一个页面,暗示它可能不适用于某些型号。根据系统信息页面,我有一台 DS211。也许我运气不好?
答案1
为了使 NFSv4 ID 映射正常工作,客户端和服务器都必须运行ID Mapper 守护程序,并在 中idmapd
进行相同的配置。Domain
/etc/idmapd.conf
这样,您的 NFS 客户端就会像[email protected]
NFS 命令一样在线上发送其 ID 凭证,而您的 NFS 服务器 idmapper 会将其映射到roger
NFS 服务器上调用的用户。UID 和 GID 无关紧要,它们由 idmapper 映射到每个系统上。
但是,在我的 Synology 上,我不需要担心这一点。我的共享文件夹具有以下权限:
- 权限
- 本地用户
- 管理员 = 读/写
- 本地用户
- NFS 权限
- 壁球
- 将所有用户映射到管理员
- 壁球
这会导致anonuid=1024,anongid=100
(admin
用户和组)被添加到NAS 上的users
导出中。/etc/exports
我的 NFS 客户端(没有运行 ID 映射器)以我的用户身份(1000:1000
)发送我的 NFS 命令,并且因为该 UID 和 GID 在 NAS 上不存在,所以它将我的 UID 和 GID 转换为,1024:100
因此我被视为具有完全权限的管理员用户。
对于商业环境来说,这是非常不专业和不安全的 NFS 使用方式,但对于我在家里访问我的文件来说,这是滥用 NFS 行为,我可以接受。
另一种选择是使roger
NFS 客户端和 NAS 上的 UID 和 GID 相同,然后您可以使用没有 ID 映射的 NFSv4,或者您可以使用仅依赖 UID 和 GID 的 NFSv3。
答案2
我一直在努力解决同样的问题。我经历了在 Synology 上使用 Docker 设置 Kerberos 服务器的巨大痛苦,设置了 ID 映射,但我仍然不喜欢这种行为。Kerberos 过于复杂,难以在重启和自动挂载时继续工作。此外,新创建文件的默认 umask 为 0000,每个新文件都以 777 模式创建,无论我的本地 umask 是多少。
我的解决方案和 suprjami 的类似,但我更进一步:
- 使用 Synology 网页 UI 创建一个新用户,将其命名为
roger.remote
。对用户组执行相同操作,并将其命名为与用户名相同的名称。 - 在 Synology 上以 root 身份编辑 /etc/passwd 并将
roger.remote
UID 更改为 1000,将 GID 更改为 1000 - 编辑 /etc/group 并将组
roger.remote
也更改为 1000 - 在 Synology 网页用户界面中,将 squash 设置为“所有用户为管理员”并保存
- 再次以 root 身份编辑 /etc/exports 并将 UID/GID 更改为
anonuid=1000,anongid=1000
- 使用以下命令重新启动 NFS
/usr/syno/etc.defaults/rc.sysv/S83nfsd.sh restart
- 这也有点黑客行为——但是
chmod 777 /volume1
。我的主目录挂载后出现了许多奇怪的问题。KDE 无法启动,因为 glibcaccess()
函数会返回对挂载的 NFS 目录的拒绝访问。(但任何子目录都可以工作)Firefox 也遇到了类似的问题,由于访问检查,它拒绝将文件保存到挂载的目录中。即使权限正确,我也可以触摸/创建/写入挂载目录中的文件。将父 /volume1 目录更改为全球可写目录解决了这个愚蠢的问题,并欺骗客户端应用程序对其进行写入。 - 从共享中删除所有文件系统 ACL。通过大量随机实验,我发现这些 ACL 会导致所创建文件的模式掩码出现问题。我不是 ACL 大师,所以也许有更优雅的解决方案。以 Synology 上的 root 身份执行
synoacltool -del /volume1/myshare
。您应该会看到+
ls -l 输出中删除了符号。 - 将共享的所有权更改为新用户:
chown roger.remote:roger.remote /volume1/myshare
- 将模式更改为755:
chmod 755 /volume1/myshare
- 在客户端上安装卷,测试权限,它应该可以工作!确保也触摸文件并验证您的 bash umask 是否正确应用。
$ umask 0002 $ cd /mnt/myshare $ 触摸测试 $ ls -l 测试 -rw-rw-r-- 1 roger roger 0 10月21日 18:15 测试
在 Synology 上您应该会看到:
# ls -l /volume1/myshare/test -rw-rw-r-- 1 roger.remote roger.remote 0 10月21日 18:15 测试
享受!