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` 密钥类型),则 ID 映射器将向旧版 `rpc.idmap` 守护进程请求 ID 映射。此结果将存储在自定义的 NFS ID 映射缓存中。

配置

需要修改文件 `/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、用户和组查找。

有关 `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`,否则返回非零值。