Этот вопрос, кажется, уже задавали много раз, но другие ответы почему-то не относились ко мне.
По сути, я только что установил новый сервер NFSv4 и столкнулся с классической проблемой, когда UID и GID не совпадают между сервером и клиентом. Однако синхронизация / etc / passwd и / etc / group в моем сценарии невозможна. Обратите внимание, что у меня одни и те же пользователи на обеих машинах (в отличие от этот вопрос).
Поэтому я изучал idmap: согласно некоторым источникам, кажется, что NFSv4 отправляет имена пользователей (в отличие от поведения NFSv3 для отправки UID / GID), и роль idmap будет заключаться в переводе этих имен пользователей в UID / GID сервера.
Однако в моем случае это, похоже, не работает (подробности настройки приведены ниже), что я считаю очень стандартным (в значительной степени установленным только NFS из репо).
Я что-то упускаю? Есть ли способ заставить это работать без настройки LDAP или Kerberos?
Настройка сервера
На сервере есть Ubuntu 16.04
установил и два пользователя.
user1@server:~$ id user1
uid=1000(user1) gid=1000(user1) groups=1000(user1),27(sudo)
user1@server:~$ id user2
uid=1001(user2) gid=1001(user2) groups=1001(user2)
NFS был установлен из репозитория и настроен для экспорта тестовой папки.
user1@server:~$ sudo apt-get install nfs-kernel-server
user1@server:~$ sudo cat /proc/fs/nfsd/versions
+2 +3 +4 +4.1 +4.2
user1@server:~$ ls -ld /srv/nfs/test/
drwxrwxrwx 2 nobody nogroup 4096 nov 2 17:34 /srv/nfs/test/
user1@server:~$ cat /etc/exports
"/srv/nfs/test" 192.168.x.x(rw,sync,no_subtree_check)
Поскольку у сервера и клиента разные имена хостов, я изменил значение «Домен» в конфигурационном файле idmapd. В остальном файл идентичен тому, который установлен менеджером пакетов. Обратите внимание, что содержимое этого файла идентично как на сервере, так и на клиенте.
user1@server:~$ cat /etc/idmapd.conf
[General]
Verbosity = 0
Pipefs-Directory = /run/rpc_pipefs
# set your own domain here, if id differs from FQDN minus hostname
Domain = mydomain
[Mapping]
Nobody-User = nobody
Nobody-Group = nogroup
Настройка клиента
У клиента также есть Ubuntu 16.04
и два пользователя с одинаковыми именами но разные UID / GID.
user1@client:~$ id user1
uid=1001(user1) gid=1002(user1) groups=1002(user1),27(sudo)
user1@client:~$ id user2
uid=1000(user2) gid=1000(user2) groups=1000(user2),27(sudo)
NFS был установлен из репо, и тестовый ресурс был смонтирован.
user1@client:~$ sudo apt-get install nfs-common
user1@client:~$ mkdir ./test
user1@client:~$ sudo mount -t nfs4 192.168.x.x:/srv/nfs/test ./test
Тестирование
Сначала я создаю файл на клиенте, и это нормально:
user1@client:~$ touch test/testfile
user1@client:~$ ls -l ./test
total 0
-rw-rw-r-- 1 user1 user1 0 nov 2 17:24 testfile
Но когда я просматриваю файл с сервера, я замечаю, что владелец не тот, а группа не существует.
user1@server:~$ ls -l /srv/nfs/test
total 0
-rw-rw-r-- 1 user2 1002 0 nov 2 17:24 testfile
Эксперименты
В соответствии с этот ответ Чтобы ответить на аналогичный вопрос, необходимо активировать отображение идентификаторов на сервере следующим образом (обратите внимание на ошибки):
user1@server:~$ sudo tee /sys/module/nfsd/parameters/nfs4_disable_idmapping <<< "N"
user1@server:~$ sudo nfsidmap -c
nfsidmap: 'id_resolver' keyring was not found.
user1@server:~$ sudo service rpcidmapd restart
Failed to restart rpcidmapd.service: Unit rpcidmapd.service not found.
user1@server:~$ sudo service nfs-kernel-server restart
На клиенте (обратите внимание на отсутствие ошибок):
user1@client:~$ sudo tee /sys/module/nfs/parameters/nfs4_disable_idmapping <<< "N"
user1@client:~$ sudo nfsidmap -c
Но результаты странные:
user1@client:~$ touch test/testfile
user1@client:~$ ls -l test
total 0
-rw-rw-r-- 1 user2 4294967294 0 nov 2 19:16 testfile
user1@server:~$ ls -l /srv/nfs/project/
total 0
-rw-rw-r-- 1 user2 1002 0 nov 2 19:16 prova
Другой ответ предлагает изменить конфигурацию idmapd следующим образом (содержимое одинаково на обеих машинах):
user1@server:~$ cat /etc/idmapd.conf
[General]
Verbosity = 0
Pipefs-Directory = /run/rpc_pipefs
# set your own domain here, if id differs from FQDN minus hostname
Domain = mydomain
[Translation]
Method=static
[Static]
user1@mydomain = user1
[Mapping]
Nobody-User = nobody
Nobody-Group = nogroup
Но это, похоже, не имеет никакого значения.
NFSv4 не будет преобразовывать идентификаторы UID и GID, как вы могли подумать, если не используете Kerberos и систему безопасности. Но он действует именно так, как вы описали. Причина в том, что NFSv4 будет использовать AUTH_SYS
безопасность. Более подробное описание можно найти Вот.