NFS ID 映射器

ID 映射器由 NFS 用于将用户和组 ID 转换为名称,并将用户和组名称转换为 ID。此转换的一部分涉及执行用户空间上调用以请求信息。NFS 有两种方法可以获取此信息:调用 /sbin/request-key 或调用 rpc.idmap 守护进程。

NFS 将尝试首先调用 /sbin/request-key。如果成功,结果将使用通用 request-key 缓存进行缓存。仅当 /etc/request-key.conf 未配置 id_resolver 密钥类型时,此调用才会失败,如果要使用 request-key 方法,请参阅下面的“配置”部分。

如果对 /sbin/request-key 的调用失败(如果 /etc/request-key.conf 未配置 id_resolver 密钥类型),则 idmapper 将向传统的 rpc.idmap 守护进程请求 ID 映射。此结果将存储在自定义 NFS idmap 缓存中。

配置

需要修改文件 /etc/request-key.conf,以便 /sbin/request-key 可以定向上调用。应添加以下行

#OP   TYPE    DESCRIPTION     CALLOUT INFO    PROGRAM ARG1 ARG2 ARG3 ... #======       ======= =============== =============== =============================== create        id_resolver     *       *               /usr/sbin/nfs.idmap %k %d 600

这将把所有 id_resolver 请求定向到程序 /usr/sbin/nfs.idmap。最后一个参数 600 定义了密钥将在未来多少秒后过期。此参数对于 /usr/sbin/nfs.idmap 是可选的。如果未指定超时,则 nfs.idmap 将默认为 600 秒。

id 映射器用于密钥描述

  uid:  Find the UID for the given user
  gid:  Find the GID for the given group
 user:  Find the user  name for the given UID
group:  Find the group name for the given GID

您可以单独处理这些中的任何一个,而不是使用通用上调用程序。如果要为 uid 查找使用自己的程序,则应编辑 request-key.conf,使其看起来类似于以下内容

#OP   TYPE    DESCRIPTION     CALLOUT INFO    PROGRAM ARG1 ARG2 ARG3 ... #======       ======= =============== =============== =============================== create        id_resolver     uid:*   *               /some/other/program %k %d 600 create        id_resolver     *       *               /usr/sbin/nfs.idmap %k %d 600

请注意,新行添加在通用程序的行之上。request-key 将找到第一个匹配的行和相应的程序。在这种情况下,/some/other/program 将处理所有 uid 查找,/usr/sbin/nfs.idmap 将处理 gid、user 和组查找。

有关 request-key 函数的更多信息,请参见 密钥请求服务

nfs.idmap

nfs.idmap 设计为由 request-key 调用,不应“手动”运行。此程序接受两个参数,一个序列化的密钥和一个密钥描述。序列化的密钥首先转换为 key_serial_t,然后作为参数传递给 keyctl_instantiate(两者都是 keyutils.h 的一部分)。

实际的查找由 nfsidmap.h 中找到的函数执行。nfs.idmap 通过查看描述字符串的第一部分来确定要调用的正确函数。例如,uid 查找描述将显示为“uid:user@domain”。

如果密钥已实例化,则 nfs.idmap 将返回 0,否则返回非零值。