リモートマウント

元側の設定(エクスポート)

1. ファイル /etc/exports にエントリーを追加する
【書式】
パス オプション

【例】192.168.0.1の読み書き、192.168.1.0/24 の読み取りを許可
/home 192.168.0.1(rw) 192.168.1.0/255.255.255.0(ro)

rw=読み書き可能、ro=読み取り専用。既定ではroot(uid/gidが0)のリクエストをnobody(anonymous uid/gid)でのリクエストに置き換える。これを無効にするには読み書きの設定に加え、"no_root_squash"の設定も加える[7]

【例】192.168.0.1の読み書きを許可(root_squashはしない)
/home 192.168.0.1(rw,no_root_squash)
2. エクスポート設定を反映する
【書式】
shell> exportfs -a
※管理者権限必要、なければsudo を前につける必要あり
※コマンドへのパスが通っていないならフルパスで /usr/sbin/exportfs と指定
※既にNFS exportが動作していて内容を修正の上再エクスポートする場合は -r オプションも付加して exportfs -ra とする。
3. NFS関係ポートの固定化(iptablesを稼働させている場合)

ファイヤウォールで必要なポートを開放するに当たって、NFSに関係する一部サービス(rpc.mountd、rpc.statd、lockd)のポートを固定にするよう設定を変更しておく必要がある。nfsdとportmapのポートはデフォルトでは固定(それぞれ2049、111)。NFSで利用するポート設定を変更するには/etc/sysconfig/nfsを編集する。ポート番号は他で使われていない、利用可能なポートを指定する。連続した値にすると、次項の開くポートの指定がしやすくなる。

【例】
LOCKD_TCPPORT=30001 # lockdのTCPポート
LOCKD_UDPPORT=30002 # lockdのUPDポート
MOUNTD_PORT=30003 # rpc.mountdのポート
STATD_PORT=30004 # statdのポート
STATD_OUTGOING_PORT=30005 # statdのポート

上記の話はNFS Version 3を使用している場合の話。Version 4だと2049さえ開けていればいいらしい[18]

4. NFS関係ポートの開放(iptablesを稼働させている場合)
NFSに必要なポートを開放するようファイヤウォールの設定変更を行う(/etc/sysconfig/iptables)。
【例】192.168.100.0/24ネットワークへのNFSエクスポートを許可する
-A RH-Firewall-1-INPUT -s 192.168.100.0/24 -m tcp -p tcp --dport 111 -j ACCEPT # portmapのTCPポートを開放
-A RH-Firewall-1-INPUT -s 192.168.100.0/24 -m udp -p udp --dport 111 -j ACCEPT # portmapのUDPポートを開放
-A RH-Firewall-1-INPUT -s 192.168.100.0/24 -m tcp -p tcp --dport 2049 -j ACCEPT # nfsdのTCPポートを開放
-A RH-Firewall-1-INPUT -s 192.168.100.0/24 -m udp -p udp --dport 2049 -j ACCEPT # nfsdのUDPポートを開放
-A RH-Firewall-1-INPUT -s 192.168.100.0/24 -m tcp -p tcp --dport 30001:30005 -j ACCEPT # その他NFS関係が使うTCPポートを開放
-A RH-Firewall-1-INPUT -s 192.168.100.0/24 -m udp -p udp --dport 30001:30005 -j ACCEPT # その他NFS関係が使うUDPポートを開放
5. iptablesの再起動(iptablesを稼働させている場合)
# /etc/init.d/iptables restart
6. NFSデーモン再起動
# sudo /etc/init.d/nfs restart
NFS mountd を終了中:                                           [  OK  ]
NFS デーモンを終了中:                                              [  OK  ]
NFS サービスを終了中:                                              [  OK  ]
NFS サービスを起動中:                                              [  OK  ]
NFS デーモンを起動中:                                              [  OK  ]
NFS mountd を起動中:                                           [  OK  ]

上の階層へ(リモートマウント)

exportファイルについて

exportファイルに関して詳細は以下の通り[3]

概要

/etc/exportsファイルには、物理的にローカルにあるファイルシステムのどの部分をどのNFSクライアントからアクセスすることを許可するのかについての設定一覧を記します。

この一覧にはオプションとアクセス許可対象リストが記され、exportfsによってmountdに情報が渡されます。

書式は以下の通りです。各項目は空白で区切ります。オプションはexport対象の直後に括弧で囲んで示します。export対象とオプションを囲む括弧との間にスペースを空けてはいけません。オプションを複数記す場合はコンマで区切ります。

オプションリストの前にダッシュ(-)を付けると、それ以降行末までのexport対象に同じオプションが適用されます。

空白行は無視されます。シャープ(#)があるとそれ以降行末までをコメントとして処理します。行をまたいで記述したい場合、行末にバックスラッシュ・円マーク(¥)を記します。export対象の名前に空白を含む場合はダブルクォート記号で囲んで下さい。また空白やその他特殊な文字をexport対象名に含む場合、「バックスラッシュ+キャラクターコード3桁」で記すことができます。

このファイルの変更内容を反映するにはexportfs-raコマンドを実行するか、またはNFSサーバを再起動して下さい。

export先マシン名の記述方法
単一ホスト
リゾルバ(DNSクライアント)が名前解決可能なホスト名、完全修飾ドメイン名、IPv4アドレス、またはIPv6アドレスを指定する。IPv6アドレスを指定する場合、文字クラスワイルドカードと紛らわしいので角かっこ([])を含めないようにして下さい。
NISネットグループ
「@NISネットグループ名」でNISネットグループ名を指定できます。ネットグループ各メンバーのホスト部分だけがメンバーかどうかのチェックにおいて考慮されます。空のホスト部分またはダッシュ1つを含むものは無視されます。
ワイルドカード
*(0文字以上)と?(1文字)
IPネットワーク
ネットワークアドレス/サブネットマスク(例:192.168.0.1/255.255.255.0)、またはネットワークアドレス/ネットマスク長(例:192.168.0.1/24)。
RPCSEC_GSSセキュリティ

rpcsec_gssセキュリティを使ったクライアントに限定してアクセスを許可することができます。sec=セキュリティ方式名の形式で記述。セキュリティ方式名はコンマ区切りで複数指定可能。指定可能な値は、 sys(これが既定値、暗号化なし)、krb5(認証のみ)、krb5i(統合保護)、krb5p(プライバシー保護)。

一般オプション
secure
rw
async
sync
no_wdelay
nohide
crossmnt
no_subtree_check
insecure_locks
no_auth_nlm
mountpoint=path
mp
fsid=num|root|uuid
refer=path@host[+host][:path@host[+host]]
replicas=path@host[+host][:path@host[+host]]
ユーザIDの対応付け

サーバマシン上のファイルに対する nfsd によるアクセスコントロールは、それぞれの NFS RPC request の際に与えられる uid と gid に基づいている。ユーザは通常、サーバ上に ある 自分のファイルには、それが普通のファイルシステム上にあるのと同様にアクセス可能であることを期待している。これにはクライアントとサーバ上で用いられる uid と gid が それぞれ同じである必要があるが、これは常に真であるとは限らず、望ましいとも限らない。

上の階層へ(リモートマウント)

利用側の設定(NFSマウント)

1. ファイル /etc/fstab にエントリーを追加する
【書式】
サーバ名:リモートパス ローカルパス 

【例】
LABEL=/         /     ext3 defaults 1 1 ←LABELについては e2label コマンド参照
LABEL=/var      /var  ext3 defaults 1 2
nfsserve:/home  /home nfs  defaults 0 0
rsize=バイト数
NFSサーバからファイルを読み込む際に、NFS が用いるバッファのバイト数を指定する。デフォルト値はカーネルに依存する。現在は 1024 バイト。 (しかし rsize=8192 でうまく動作 するようなら、転送速度は大きく向上する。)
wsize=バイト数
NFSサーバにファイルを書き込む際に、NFS が用いるバッファのバイト数を指定する。デフォルト値はカーネルに依存する。現在は 1024 バイト。 (しかし rsize=8192 でうまく動作 するようなら、転送速度は大きく向上する。)
timeo=1/10秒
RPCタイムアウトの後、最初の再送を行うまでの時間を1/10秒単位で指定する。デフォルトは7(つまり0.7秒)。最初のタイムアウトの後は、タイムアウトの時間は倍々される。これはタイムアウトが最大値の60秒になるか、あるいは再送の回数が指定した値よりも大きくなって、メジャータイムアウトとなるまで続けられる。メジャータイムアウトになると、ファイルシステムがハードマウントされている場合には、新たなタイムアウトシーケンスが初期値を2倍にして再び試みられる(シーケンス内部でのタイムアウトは倍々)。タイムアウトの最大値は常に60秒である。ネットワークが混雑している、サーバが遅い、経路に複数のルータまたはゲートウェイがある、などの場合には、このタイムアウトを増やすと全体の性能を向上させることができるかもしれない。
retrans=数値
マイナータイムアウトと再送の合計数がこの値を超えるとメジャータイムアウトとなる。デフォルトは3回。メジャータイムアウトが起こると、ファイル操作は中断されるか、あるいは"servernotresponding"のメッセージがコンソールに表示される。
acreqmin=
一般のファイル(regularfile)の属性(attribute)がキャッシュされる最小の時間を秒単位で指定する。この時間内では、サーバーへの新たな情報の問い合わせは行われない。デフォルトは3秒。
acreqmax=
一般のファイルの属性がキャッシュされる最大の時間を秒単位で指定する。この時間を越えると、必ずサーバーへ新たな情報の問い合わせが行われる。デフォルトは60秒。
acdirmin=
ディレクトリの属性がキャッシュされる最小の時間を秒単位で指定する。この時間内では、サーバーへの新たな情報の問い合わせは行われない。デフォルトは30秒。
acdirmax=
ディレクトリの属性がキャッシュされる最大の時間を秒単位で指定する。この時間を越えると、必ずサーバーへ新たな情報の問い合わせが行われる。デフォルトは60秒。
actimeo=
acregmin, acregmax, acdirmin, acdirmax すべてを同じ値にする。デフォルト値はない。
retry=数値
フォアグラウンド、またはバックグラウンドでのNFSマウントオペレーションが、リトライを放棄するまでの時間を指定する。デフォルトは10000分(約一週間)である。
namlen=数値
NFSサーバがRPCマウントプロトコルのバージョン2をサポートしていない場合に、このオプションを用いるとリモートファイルシステムにおいてサポートされているファイル名の最大長を指定できる。これはPOSIXpathconf関数をサポートするために用いられる。デフォルトは255文字。
port=数値
NFSサーバに接続する際のポート番号を指定する。指定が0(デフォルト)の場合、用いるべきポート番号をリモートホストのポートマッパーに尋ねる。もしリモートホストのNFSデーモンがポートマッパーに登録されていなければ、一般的なNFSポート番号である2049を使用する。
bg
最初のNFSマウントの試行がタイムアウトになったときに、バックグラウンドでマウントを試み続ける。マウント動作がバックグラウンドになると、そのNFSサーバーに対して引き続き行われることになっている、他のmount動作もただちにバックグラウンドになる。これらに対して、最初のマウント試行は行われない。マウントポイントが失われると、タイムアウトと同じように扱われる。NFSマウントのネストを許すためである。
nfsvers=数値
リモートホストのNFSデーモンに接続する際に、仕様するNFSプロトコルのバージョンを指定する。指定がない場合の既定値は2。指定できる値は、2 または 3。
bg
最初のNFSマウントの試行がタイムアウトになったときに、バックグラウンドでマウントを試み続ける。マウント動作がバックグラウンドになると、そのNFSサーバーに対して引き続き行われることになっている、他のmount動作もただちにバックグラウンドになる。これらに対して、最初のマウント試行は行われない。マウントポイントが失われると、タイムアウトと同じように扱われる。NFSマウントのネストを許すためである。
fg
最初のNFSマウントの試行がタイムアウトになったときに、再試行をフォアグラウンドで行う。これはbgの反対の意味を持つ指定であり、こちらがデフォルト。
hard
NFSへのファイル操作がメジャータイムアウトとなった場合、コンソールに"server not responding"と表示し、ファイル操作を無期限に再試行し続ける。これがデフォルトの動作である。intrオプションを合わせて指定していない場合、NFS通信再開待ちのプロセスを終了させることはできない。
soft
NFSへのファイル操作がメジャータイムアウトとなった場合、呼び出したプログラムに対しI/Oエラーを返す。デフォルトでは、ファイル操作を無期限に再試行し続ける(hard)。
intr
NFSへのファイル操作がメジャータイムアウトとなり、かつそのNFS接続がhardマウントされている場合、シグナルによるファイル操作の中断を許可し、中断された場合には呼び出したプログラムに対してEINTRを返す。デフォルトではファイル操作の中断を許さない。
tcp
NFSファイルシステムのマウントに、デフォルトのUDPプロトコルではなくTCPプロトコルを用いる。多くのNFSサーバはUDPしかサポートしていない。
udp
NFSファイルシステムのマウントにUDPプロトコルを用いる。こちらがデフォルトである。
2. エクスポート情報を反映する
【書式】
mount -a

既存のNFSマウントをエクスポート側で削除した場合など、NFSのリソースが利用できなくなった場合、「実効性のないNFSファイルハンドルです」と言うエラーが出る。この場合は netfs サービスを再起動するとよい[10]

NFS client> df -H
Filesystem             Size   Used  Avail Use% マウント位置
/dev/mapper/VolGroup00-LogVol00
                        76G    14G    59G  19% /
/dev/sda1              104M    27M    72M  28% /boot
tmpfs                  1.1G      0   1.1G   0% /dev/shm
df: `/home/user/work/XML': 実効性のないNFSファイルハンドルです
server:/var/www/html
                       3.8T   781G   2.9T  22% /home/user/wwwdocs
NFS client> service netfs restart
Unmounting NFS filesystems:                                [  OK  ]
NFS ファイルシステムをマウント中:                                        ]
その他のファイルシステムをマウント中:                                          OK  ]
NFS client> df -H
Filesystem             Size   Used  Avail Use% マウント位置
/dev/mapper/VolGroup00-LogVol00
                        76G    14G    59G  19% /
/dev/sda1              104M    27M    72M  28% /boot
tmpfs                  1.1G      0   1.1G   0% /dev/shm
server:/var/www/html
                       3.8T   781G   2.9T  22% /home/user/wwwdocs

上の階層へ(リモートマウント)

マウント状況の表示

showmountコマンドで、エクスポートされた情報や、マウントしているリモートホストの情報が確認できる。

【例】マウントしているリモートホストの情報
shell> showmount -a
All mount points on nfsserver:
nfsclient:/home

※パスが通っていない環境では以下のようにパスも含めて記述する必要あり
/usr/sbin/showmount -a

【例】エクスポートの設定状況
shell> showmount -e
Export list for nfsserver:
/home nfsclient

どのようなオプションでエクスポートしたかも含めて確認するには /proc/fs/nfs/exports の内容を参照すればよい[15]

【例】
shell> cat /proc/fs/nfs/exports
# Version 1.1
# Path Client(Flags) # IPs
/home	*(rw,no_root_squash,sync,wdelay,no_subtree_check,uuid=61683f47:9ae36803:00000000:00000000)

現在、実際にmountされているNFSクライアントを確認するにはnetstatを使ってtcp 2049に接続しに来ているクライアントを調べればよい19

$ netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State
...
$ netstat -an | grep 192.168.181.223:2049
tcp        0      0 192.168.181.223:2049        192.168.181.221:969         ESTABLISHED
→192.168.181.221が接続している

上の階層へ(リモートマウント)

自動マウント(autofs)

/etc/fstab を使って固定的にNFSマウントを行い、そのリモート領域が利用できない状態に陥った場合、yumインストール・アップデート、dfコマンドなどが途中で固まってしまう現象が生じうる。この場合、autofsを用いてリモート領域が利用可能な場合だけ自動マウントするように設定しておくと無効なNFSマウントが生じることがなくなり問題が回避できる。

/etc/auto.miscに書けば、/misc配下にマウントされる。その他の任意の場所にマウントするには、/etc/auto.master/etc/auto.directを利用する宣言を行い、/etc/auto.directにマウントの指定を記述する[5]。fstabとは記述順序などが異なるので注意。

1. /etc/fstab からNSFマウントに関する記述を削除
2. /etc/auto.master を編集
以下の1行がなければ追記。
/-	/etc/auto.direct
3. /etc/auto.direct を編集
なお、fstabとは異なり、マウントポイントとなるローカルディレクトリは存在しなくてよい。
【書式】
ローカルマウントポイント -オプション NFSサーバ:パス

【例】nfssv:/data をローカルシステムの /data に自動マウントする
/data   -fstype=nfs,rw	  nfssv:/data
4. autofs サービスを再起動
# /etc/init.d/autofs restart
Stopping automount:                                        [  OK  ]
Starting automount:                                        [  OK  ]

システムログ(/var/log/messages)に「lookup_read_master: lookup(nisplus): couldn't locate nis+ table auto.master」のメッセージが表示される場合、/etc/auto.master内の「+auto.master」先頭のプラスを除去すればいいらしい[14]

上の階層へ(リモートマウント)

ローカルの他の場所でも参照できるようにする(bind)

同じリソースを複数のローカルマウントポイントで参照できるようにするには、bindを使う。

fstabの例
cat /etc/fstab

autofsの書式
cat /etc/auto.direct
autofsの書式
バインド先 -bind バインド元
autofsの例(ローカル同士)
/var/www/html/files -bind :/data/files

NFS Version 4の設定

NFSのバージョン3と4で一部設定方法の異なる箇所がある。

【例1】server:/hoge を client:/server/hoge で自動マウントにより参照する
[root@server ~]# cat /etc/exports
/hoge client(rw,sync,no_root_squash,fsid=0,crossmnt)

[root@client ~]# cat /etc/auto.master
/- /etc/auto.direct
[root@client ~]# cat /etc/auto.direct
/server/hoge -default server:/
# ver.3 の場合
/server/hoge -default,nfsvers=3 server:/hoge


トラブルシューティング

NFSマウントがかからず「実効性のないNFSファイルハンドルです」と表示される

netfsサービスを再起動したらマウント復帰した[11][13]

# df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/sda3             9.3G  6.4G  2.5G  73% /
/dev/sda6             9.3G  487M  8.3G   6% /opt
/dev/sda5              19G  9.4G  8.2G  54% /var
/dev/sda1             950M   29M  872M   4% /boot
tmpfs                  16G     0   16G   0% /dev/shm
df: `/home': 実効性のないNFSファイルハンドルです
# mount -a
# これでもdfコマンドの結果は変わらず
# /etc/init.d/netfs restart
Unmounting NFS filesystems:                                [  OK  ]
NFS ファイルシステムをマウント中:                          [  OK  ]
その他のファイルシステムをマウント中:                      [  OK  ]
# df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/sda3             9.3G  6.4G  2.5G  73% /
/dev/sda6             9.3G  487M  8.3G   6% /opt
/dev/sda5              19G  9.4G  8.2G  54% /var
/dev/sda1             950M   29M  872M   4% /boot
tmpfs                  16G     0   16G   0% /dev/shm
server:/home          7.2T  4.3T  2.6T  63% /home

↑ページトップに戻る

「mount.nfs: requested NFS version or transport protocol is not supported」と表示されNFSマウントができない

NFSエクスポート側のシステムログには以下のようなメッセージが出ている。

[root@nfsserver ~]# grep nfsclient /var/log/messages
...
Aug  5 10:35:46 nfsserver portmap[21225]: connect from nfsclient to getport(mountd): request from unauthorized host
Aug  5 10:35:50 nfsserver portmap[21231]: connect from nfsclient to getport(nfs): request from unauthorized host
Aug  5 10:35:50 nfsserver portmap[21232]: connect from nfsclient to getport(nfs): request from unauthorized host

これはhosts.allowhosts.denyの設定が原因とのこと[12]hosts.allowにNFSクライアントを許可するよう記述を追加すればマウントできるようになった。

NFSクライアントのIPは192.168.0.3
[root@nfsclient ~]# ifconfig eth0 | grep 'inet addr'
          inet addr:192.168.0.3  Bcast:192.168.0.255  Mask:255.255.255.0
[root@nfsserver ~]# diff /etc/hosts.allow /etc/hosts.allow.orig
...
既に192.168.0.2が許可されているところに192.168.0.3を許可対象として加える
< lockd : 192.168.0.2 192.168.0.3
< mountd : 192.168.0.2 192.168.0.3
< rquotad : 192.168.0.2 192.168.0.3
< statd : 192.168.02. 192.168.0.3
---
> lockd : 192.168.0.2
> mountd : 192.168.0.2
> rquotad : 192.168.0.2
> statd : 192.168.0.2

↑ページトップに戻る

設定を書いてもマウントされない

既にNFSマウントをかけている領域の配下に、別のところから追加でNFSマウントをかけることはどうもできないらしい。

以下のようにしても、/nfs/server1/server2 のマウントはかからなかった
# cat /etc/auto.direct
/nfs/server1 -default server1:/nfs-export
/nfs/server1/server2 -default server2:/nfs-export

↑ページトップに戻る

システムログに「nfsidmap[XXXXX]: nss_XXXX: name 'user@localdomain' does not map into domain 'hoge.com'」のような記録が多数出る

NFS version4を使っているとき、NFSサーバ・クライアントで共通のドメイン名を設定しておく必要があるらしい。設定は/etc/idmapd.confで「Domain=ドメイン名」の形で記す[15][16]

参考文献・サイト

  1. アイリーン・フリッシュ『UNIXシステム管理 第3版 VOLUME 2』「10.4.1 NFS」飯塚正樹、下田みどり訳、オーラリー・ジャパン、2003年、ISBN 4-87311-139-0、pp202-209
  2. NFS-mount
  3. NFS(Network File System)の設定
  4. NFSサーバー設定…サーバ側の設定について
  5. NFSクライアント設定ファイル…クライアント側の設定について
  6. NFS の設定…「Linux活用日記」より
  7. NFS サーバの設定山口義幸氏のHPより
  8. nfs設定 - とみぞーノート
  9. How to set up Autofs
  10. LC Tuigwaa - Tips/Linux/nfs
  11. LINUXで困ったときの備忘録 - 第二☆しのblogアクション
  12. Simple is better than complex: NFS server setup (getport(nfs): request from unauthorized host| dump(): request from unauthorized host ) RedHat EL
  13. ダレカノブログ: nfs: 実効性のないNFSファイルハンドルです
  14. Linux : automount: lookup_read_master: couldn’t locate nis+ table auto.master | ITechLounge.net
  15. NFSServerSetup - Debian Wiki
  16. Linux - NFSについて教えて欲しいです。(11446)|teratail
  17. 各サーバーソフトの設定:仮想マシン - 倉金家ホームページ
  18. NFSv3からNFSv4への移行(3/4) : SNIA-J
  19. 1 Linux / Unix Command To Find Out NFS Clients Connected To My NFS Server – nixCraft