映射 NFS 的 UID

映射 NFS 的 UID

我有一台 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。)

相关内容