web-dev-qa-db-ja.com

RHEL-NFS4:rwとしてマウント/エクスポートされ、ユーザーの書き込み権限が拒否されました

RHEL 5.3サーバー(charlie)とRHEL 5.4クライアント(simcom1)の間にnfs4を構成しています。マシンは、「アルファ」と呼ばれるWindows Server 2008 ActiveDirectoryマシンによってKerberosを介してユーザーを認証するように構成されています。 Alphaは、ローカルネットワークのDNSおよびDHCPマシンとしても機能します。

ユーザーが初めてRHELマシンにログインすると、そのマシンに固有のuidが発行されることに気付きました。最初にログオンしたユーザーは10001を取得します。したがって、simcom1とcharlieの間のユーザーは異なるUIDを持っていることがわかります。ユーザーがnfs4マウント内から「ls-la」コマンドを実行すると、所有者列のユーザー名は「nobody」または少なくとも間違ったユーザー名を示すと思います-UIDはユーザーごとにマシン間で異なるためです、およびすべてのユーザーが各マシンにログインしているわけではありません。

ただし、simcom1は、nfs4を介してcharlieにあるファイルで実行された「ls-la」のユーザー名を正しく解決できます。最も厄介なのは、ユーザーがnfsマウントを越えてファイルに書き込めないことです。

サーバーcharlieには、rwとしてエクスポートされたルートディレクトリがあります。クライアントsimcom1は、エクスポートをrwとしてマウントします。私の構成を以下に示します。

私の質問は、ユーザーが既に読み取り/書き込みとしてマウントされているnfs4を介してファイルを書き込めるようにRHELマシンを構成するにはどうすればよいですか?

[root@charlie ~]# more /etc/exports
/ 10.100.0.0/16(rw,no_root_squash,fsid=0)

[root@charlie ~]#cat /etc/sysconfig/nfs
#
# Define which protocol versions mountd
# will advertise. The values are "no" or "yes"
# with yes being the default
#MOUNTD_NFS_V1="no"
#MOUNTD_NFS_V2="no"
#MOUNTD_NFS_V3="no"
#
#
# Path to remote quota server. See rquotad(8)
#RQUOTAD="/usr/sbin/rpc.rquotad"
# Port rquotad should listen on.
#RQUOTAD_PORT=875
# Optinal options passed to rquotad
#RPCRQUOTADOPTS=""
#
#
# TCP port rpc.lockd should listen on.
#LOCKD_TCPPORT=32803
# UDP port rpc.lockd should listen on.
#LOCKD_UDPPORT=32769
#
#
# Optional arguments passed to rpc.nfsd. See rpc.nfsd(8)
# Turn off v2 and v3 protocol support
#RPCNFSDARGS="-N 2 -N 3"
# Turn off v4 protocol support
#RPCNFSDARGS="-N 4"
# Number of nfs server processes to be started.
# The default is 8.
RPCNFSDCOUNT=8
# Stop the nfsd module from being pre-loaded
#NFSD_MODULE="noload"
#
#
# Optional arguments passed to rpc.mountd. See rpc.mountd(8)
#STATDARG=""
#RPCMOUNTDOPTS=""
# Port rpc.mountd should listen on.
#MOUNTD_PORT=892
#
#
# Optional arguments passed to rpc.statd. See rpc.statd(8)
#RPCIDMAPDARGS=""
#
# Set to turn on Secure NFS mounts.
SECURE_NFS="no"
# Optional arguments passed to rpc.gssd. See rpc.gssd(8)
#RPCGSSDARGS="-vvv"
# Optional arguments passed to rpc.svcgssd. See rpc.svcgssd(8)
#RPCSVCGSSDARGS="-vvv"
# Don't load security modules in to the kernel
#SECURE_NFS_MODS="noload"
#
# Don't load sunrpc module.
#RPCMTAB="noload"
#

[root@simcom1 ~]# cat /etc/fstab
--start snip--
charlie:/home /usr/local/dev/charlie nfs4 rw,nosuid, 0 0
--end snip--

[brendanmac@simcom1 /usr/local/dev/charlie/brendanmac]# touch file
touch: cannot touch 'file': Permission denied

[brendanmac@simcom1 /usr/local/dev/charlie/brendanmac]# su
Password:
[root@simcom1 /usr/local/dev/charlie/brendanmac]# touch file
[root@simcom1 /usr/local/dev/charlie/brendanmac]# ls -la file
-rw------- 1 root root 0 May 26 10:43 file
2
brendanmac

私はまったく同じ問題を抱えており、問題が何であるかを見つけました。問題は、nfsv4がidmapdを使用し、idmapdがuserid =>名の間のマッピングを行うが、その逆ではないことです。言い換えれば、それは機能しません。正しい権限のユーザーとグループを確認するのは面白くて混乱しますが、ファイルシステムを使用する場合でも、uidを介した古いマッピング方法が使用されます。したがって、サーバー側のuidは、そのユーザーのクライアント側と同じである必要があります。それ以外の場合、ファイルを作成すると、許可が拒否されて失敗します。もちろん、uidが一致しない限り。

参照: http://thread.gmane.org/gmane.linux.nfsv4/7103/focus=7105

3
deadeyes