この質問はすでに何度も尋ねられたようですが、他の回答はどういうわけか私には当てはまりませんでした。
基本的に私は新しいNFSv4サーバーをセットアップしただけで、サーバーとクライアント間でUIDとGIDが一致しないという典型的な問題に直面しています。ただし、私のシナリオでは、/ etc/passwdと/ etc/groupを同期することはできません。両方のマシンで同じユーザーがいることに注意してください( この質問 とは対照的です)。
したがって、私はidmapを調査していました:一部のソースによると、NFSv4はユーザー名を送信するようであり(UID/GIDを送信するNFSv3の動作とは対照的)、idmapの役割はこれらのユーザー名をサーバーのUID/GIDに変換することです。
ただし、これは私の場合には機能しないようです(以下のセットアップの詳細)。これは非常に標準的(かなり多くの場合、リポジトリからNFSのみをインストールする)と考えています。
何か不足していますか? LDAPまたはKerberosを設定せずにこれを機能させる方法はありますか?
サーバーのセットアップ
サーバーはUbuntu 16.04
インストール済み、2人のユーザー。
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
と2人のユーザー。ただし、ユーザー名は同じですが、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
実験
この答え と同様の質問によれば、id-mappingはサーバー上で次のようにアクティブ化する必要があります(エラーに注意してください)。
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は、Kerberosとセキュリティフレーバーを使用していないときのように、UIDとGIDを変換しません。しかし、あなたが説明したとおりに機能します。その理由は、NFSv4がAUTH_SYS
セキュリティ。より詳細な説明は here にあります。