CentOS 6でNFS¶
NFSのバージョン¶
CentOS 6では、NFSバージョン2, 3, 4が利用可能です。
- NFSv2(RFC 1094)
転送プロトコルにUDPを使用 - NFSv3(RFC 1813)
2GB以上のサイズのファイル、非同期書き込み、ファイル属性取得の効率化、TCPをサポート - NFSv4(RFC 3530)
Kerberos認証ほかセキュリティ向上、ステートフル、マウント・ロックをプロトコルに組み込み、ポート番号固定
本ページでは、NFSv4のみの設定をします。
NFSサーバーの設定¶
必要なパッケージ¶
# yum install nfs-utils
必要なサービス¶
NFSv4のサーバーには、rpcbind、nfs、rpcidmapdが必要です。
nfslockは、NFSv3までは必要でしたが、NFSv4では不要です。NFSv3以下を受け入れる場合は起動します。
# chkconfig nfslock off
# service start rpcbind # service start nfs # service start rpcidmapd
メモ)
nfsサービスのスクリプトの中で、rpcidmapdを呼び出している箇所がありました。NFSサーバー側では、rpcidmapdを自動起動設定していなくてもnfsサービスから起動してくれます。
# Let's if we need to signal or start rpc.idmapd if [ -f /var/lock/subsys/rpc.idmapd ]; then killproc rpc.idmapd -1 # SIGHUP else /sbin/service rpcidmapd start touch /var/lock/subsys/nfs-rpcidmapd fi
nfsサービス設定(/etc/sysconfig/nfs)¶
NFSv4のみの(NFSv2とNFSv3での接続をしない)設定とします。
MOUNTD_NFS_V2="no" MOUNTD_NFS_V3="no"
rpc.idmapd設定(/etc/idmapd.conf)¶
rpc.idmapdデーモンがリクエストのユーザーとUID/GIDのマッピングを制御しています。
NFSのリクエストには文字列でユーザー@ドメインが指定され、それをUID/GIDにマッピングします。
ドメインは、すべてのNFSクライアントおよびサーバーで同じ名前を指定します。通常はDNSのドメイン名に基づいて指定します。
- ドメインの指定
Domain = example.com
公開するディレクトリを1箇所に集める¶
NFSv4では、NFSサーバー上に公開するディレクトリルートを1つ決め、その下あるディレクトリを公開します。
しかし、公開したいディレクトリがNFSサーバーのファイルシステムで必ずしも1つのディレクトリツリーにあるとは限りません。その場合は、mount --bindで公開するディレクトリルートの下に公開したいディレクトリを置きます。
公開するディレクトリルートについては、LinuxのFHS(Filesystem Hierarchy Standard)に準拠して、/srv/nfsにします。公開したいディレクトリを次のように/srv/nfs下に集めます。
/ +-- srv | +-- nfs | +-- www +-- var ^ bind する | +-- www ---+
コマンドで一過的にbindするときは次を実行します。
# mkdir -p /srv/nfs/www #mount --bind /var/www /srv/nfs/www
システム起動時にbindするときは、/etc/fstabに記述します。
/var/www /srv/nfs/www none bind 0 0
公開設定(/etc/exports)¶
公開するディレクトリとそのオプションを/etc/exportsに定義します。
基本となる書式は次です。
公開するディレクトリ 公開範囲(オプション指定) 定義例 /srv/nfs4 192.168.2.0/24(fsid=0,crossmnt) /srv/nfs4/www 192.168.2.0/24(rw,no_root_squash)
- 公開範囲とオプション指定の開き丸括弧の間に空白を入れてはいけません
- オプション指定の区切りはカンマのみとし、空白を入れてはいけません
公開するディレクトリルートを、fsid=0オプションおよびcrossmntオプションを付けて指定します。
デフォルトのオプション(オプションを指定しなかった場合に適用されるオプション)ro,wdelay,root_squash,no_subtree_check,sec=sys,ro,root_squash,no_all_squash
オプションメモ
- rw 読み書き可能
- root_squash rootユーザーでアクセスした際、匿名ユーザー(デフォルトはnfsnobody)にマッピング
- wdelay 書き込み要求をまとめて処理
- all_squash すべてのUID/GIDをanonymousにマップする
公開設定(/etc/exports)を変更したら、次のコマンドで反映します。
# exportfs -ra
ファイアウォール設定¶
TCPポート2049を通しておきます。
NFSクライアントの設定¶
必要なパッケージ¶
# yum install nfs-utils
必要なサービス¶
サービス名 | 必要な条件 |
---|---|
rpcbind | NFSv3まで |
nfslock | NFSv3まで |
netfs | すべて |
rpcidmapd | NFSv4 |
NFSv4でrpcidmapdを起動していないと、マウントした領域に書き込みすると「読み込み専用ファイルシステムです」とエラーになります[#56]。
rpc.idmapd設定(/etc/idmapd.conf)¶
ドメインは、すべてのNFSクライアントおよびサーバーで同じ名前を指定します。通常はDNSのドメイン名に基づいて指定します。
- ドメインの指定
Domain = example.com
- 起動方法
service rpcidmapd start
- 自動起動する設定
chkconfig rpcidmapd on
mount設定¶
mountコマンドで手動実行¶
# mount -t nfs4 nfsserver:/ /mnt
/etc/fstab¶
nfsserver:/ /nfs nfs4 hard,intr
起動時のマウントがうまくいかないとき¶
ネットワークの初期化が間に合わない¶
起動時にNFSマウントができないが、起動後にコマンドからマウントを実行するとマウントできるといった現象が起きた場合、この問題による可能性があります。
CentOS 6の標準の設定では、networkサービスがnetfsサービスよりも先に起動します。
/etc/rc3.d/ +-- S10network : +-- S25netfs
しかし、ネットワークデバイスやネットワークスイッチ等によってはネットワークの初期化に時間がかかることがあり、netfsサービスが起動するときにNFSサーバーとの通信がまだできない可能性があります。そのときは、ネットワークサービス起動後に次の処理へ進むまでスリープを入れる方法があります。
- /etc/sysconfig/network に20秒のスリープを入れる例
NETWORKDELAY=20
これは、/etc/init.d/network で次のように使われます。
. /etc/sysconfig/network : case "$1" in start) : [ -n "${NETWORKDELAY}" ] && /bin/sleep ${NETWORKDELAY} ;;
または、個々のNIC起動後にスリープを入れる方法もあります。
- /etc/sysconfig/network-scripts/ifcfg-eth0 に15秒のスリープを入れる例
LINKDELAY=15
メモ¶
- /etc/fstabにbgオプションを指定してもだめな模様
- ネットワークスイッチがスパニングツリーを有効にしているとポートがフォワーディングになるのに時間がかかる模様
パフォーマンス関連¶
NFSデーモン数¶
デフォルトで8個起動します。/etc/sysconfig/nfs のRPCNFSDCOUNTで変更します。
目安としてプロセッサ(コア)あたり、4から8個を動かすとよいようです。
/proc/net/rpc/nfsd を見て、th行の値を見て過不足を判断します。
th 128 1196 48 11 677 54 66 31 288 27 26 118 th (threads): <threads> <fullcnt> <10%-20%> <20%-30%> ... <90%-100%> <100%>
fullcntの値が大きいとき、<80%-90%> <90%-100%> <100%> の3つの値が大きいときは、nfsdの数を増やします。