プロジェクト

全般

プロフィール

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の数を増やします。

クリップボードから画像を追加 (サイズの上限: 1 GB)