我有一台 Mac OS X 文件服务器,通过 SMB/CIFS 和 AFP 提供服务。该服务器是通过黄金三角方法的域客户端,但这会导致用户的 UID 非常大。这对于我当前的设置来说没问题,但我还想让 NFS 正常工作。显然我需要进行一些 UID 映射,但我不确定如何进行。有什么建议吗?
答案1
在大多数 NFSv3 实现中,特别是内核级服务器,除了一些有限的映射(如 root 到 nobody)外,这是不可能的。在 NFS v4 中,您有 rpc.idmapd,它在服务器上执行 NFSv4 ID <-> UID 映射,并允许您获得更大的灵活性。
如果您不能使用 NFSv4,那么处理 NFSv3 的推荐方法是让您的用户来自目录服务(如 LDAP)或其他通用数据库。通常,守护进程等的所有系统用户都来自,/etc/passwd
而所有人类用户都来自外部源。这将确保 UID 全面一致,并且无需进行任何类型的映射。
答案2
好吧,经过进一步研究,我发现 nfs-user-server 可以让你进行这种映射。这有点令人沮丧,因为我想使用 NFS 而不是 CIFS 的主要原因是速度。nfs-user-server 在用户空间中运行,因此它不如 nfs-kernel-server 快。这似乎不是最佳解决方案。
答案3
我想补充一点,NFSv4 的 UID 映射方法存在一个主要的陷阱(参见 Kamil 的评论):它不适用于AUTH_SYS
/AUTH_UNIX
身份验证,如果不同的计算机没有使用 LDAP 或 Kerberos 或其他共享访问控制系统,就会出现这种情况。
问题就在这里:NFSv4 将在网络上描述文件所有权时使用文本(即非数字)ID,这正是您想要的,但 RPC 层仍然使用数字 UID 和 GID 值。简单的AUTH_SYS
身份验证会转回 RPC,然后您又陷入困境。以下是这种情况的示例(tshark 捕获客户端->服务器数据包,在服务器端捕获):
Frame 26 (306 bytes on wire, 306 bytes captured)
...
Remote Procedure Call, Type:Call XID:0x2790a46d
...
Credentials
Flavor: AUTH_UNIX (1)
Length: 48
Stamp: 0x00419c55
Machine Name: localhost.localdomain
length: 21
contents: localhost.localdomain
fill bytes: opaque data
UID: 500
GID: 500
Auxiliary GIDs
GID: 500
Verifier
Flavor: AUTH_NULL (0)
Length: 0
Network File System
...
答案4
我还没有在 OSX 上配置它,但你要找的是 idmapd。在 OSX 机器上,守护进程实际上称为 rpc.idmapd。(注意:不是 imapd。)