Я пытаюсь настроить клиент NFSv4 и не могу найти полезную документацию.
На странице руководства для nfsidmap (5) (меня интересует CentOS на стороне клиента, как это бывает) описывается конкретный инструмент, который настроен в idmapd.conf (5) и который обслуживает request-key
вызов из ядра. Хорошо.
RFC 7530 описывает базовый протокол, содержимое которого я могу просмотреть с помощью tcpdump
. Хорошо известно, что NFSv4 управляет uid / gid через строки. user@domain
а не числовой UID, и, таким образом, существует потребность в механизме, как на стороне клиента, так и на стороне сервера, для сопоставления этих имен с числами, в зависимости от обстоятельств, с двух сторон (можно запустить NFSv4 в режиме, который передает числовые идентификаторы обратно и далее, как строки, но похоже, что это не рекомендуемый режим). Хорошо.
Я пытаюсь найти что-нибудь посередине, что дает более подробную информацию о том, что происходит; я не могу найти ничего, что могло бы заполнить пробел между протоколом и краткой документацией о том, как настроить конкретный инструмент. Я пытаюсь что-то сделать слегка (очень немного) нестандартно - см. ниже - и я застрял.
Я обнаружил:
(Я все время натыкаюсь на довольно хорошую документацию по Oracle / Solaris idmapd
, но, к сожалению, это совсем другая реализация.)
Что я специально пытаюсь сделать, так это настроить несколько клиентов CentOS для монтирования NFSv4 серверов FreeBSD, где, что особенно важно, клиенты находятся в нескольких разных доменах DNS, что (это заняло у меня длинный в то время как для работы) означает, что я должен настроить «домен NFS» клиент / сервер иначе, чем по умолчанию (то есть сделать домен NFS таким же, как домен DNS). Настройка работает для клиентов в том же домене DNS, что и сервер, поэтому проблема с доменом NFS остается проблемой.
Очевидный ответ - установить Domain
в /etc/idmapd.conf
перезапустите nfs-idmapd
сервис, и ... нет, mount -tnfs server:/filesystem /mnt
работает, но ls /mnt
выдает ошибку ввода-вывода. Я вижу в журналах (с соответствующей подробностью idmapd)
nfsidmap[5659]: nss_getpwnam: name 'root@<dnsdomain>' domain '<nfsdomain>': resulting localname '(null)'
что означает ... что? Мне не хватает контекстной документации, которая позволила бы мне понять, что на самом деле здесь не так. Я также не могу найти никаких диагностических инструментов, которые дают полезные подсказки - у меня недостаточно контекста, чтобы полностью интерпретировать вывод nfsidmap -l
. Даже если бы я нашел комбинацию idmapd.conf
настройки и nfs4_disable_idmapping
который сделал то, что я хотел, мне по-прежнему было очень неудобно, что здесь было больше магии, чем я понимаю.
У nfs4 ipmapd есть два аспекта: первый, когда учетные данные используются для идентификации отправителя запроса, и второй, когда отображаются владелец файла и группа владельцев.
Давайте посмотрим на ваш ls /mnt
пример или лучше ls -l /mnt
, как обычно ls это псевдоним ls -l. Прежде всего, клиент отправляет запрос RPC с некоторыми учетными данными. В вашем случае, поскольку не было специальных вариантов монтирования, я могу предположить, что auth sys использовался. Таким образом, по проводу клиент отправит числовой местный uid и gids. В зависимости от идентификаторов пользователей на сервере, это может быть тот же пользователь или другой.
Теперь сервер получил запрос и отвечает списком каталогов с атрибутами файла, включая информацию о владельце и группе. В зависимости от реализации сервера сервер вернет либо числовую строку, либо принципала, например «500» или «пользователь @ домен». Сервер Linux вернет основную строку, если:
После получения ответа от сервера у клиента есть две возможности: если предоставлен строковый принципал, вызвать nfs4idmap или использовать (фактически показать) предоставленный числовой идентификатор.
Если все синхронизировано, вы должны увидеть стабильный результат.
$ id
uid=501(kofemann) gid=501(kofemann)
$ touch file
$ ls -l file
-rw-r--r-- 1 kofemann kofemann 0 Jun 13 22:03 file
$
С другой стороны, если сервер возвращает неправильный принципал, вы получите неожиданные результаты, например
$ id
uid=501(kofemann) gid=501(kofemann)
$ touch file
$ ls -l file
-rw-r--r-- 1 nobody nobody 0 Jun 13 22:08 file
$
Чтобы обеспечить согласованность сопоставления идентификаторов, клиент и сервер либо оба должны использовать числовую строку, либо оба должны быть настроены на использование одного и того же домена nfs. Заметь nfs домен это всего лишь логическое пространство имен нашей пользовательской базы. AFAIK, нет сервера или клиентов, которые могут поддерживать несколько доменов одновременно, но это только ограничение реализации.
Вся идея сопоставления идентификаторов имеет смысл, если вы думаете об этом с учетом Kerberos. Допустим, у вас есть клиентский хост, который не зависит от вашей пользовательской базы, например, ноутбук, и сервер, который имеет локальную базу пользователей или подключен к LDAP. Ваш uid на портативном компьютере может быть 501 и 1234 на сервере. Единственный общий идентификатор - это ваш принципал Kerberos пользователь @ DOMAIN. Клиент будет отображать его локально на 501 и сервер 1234.