NFS v3 と v4 設定まとめ (RHEL/CentOS/Ubuntu編)
NFSのセットアップ手順を簡単にまとめておきます。
NFS v3以前と v4とでポリシーがかなり違うので、それぞれの方法をまとめておきます。
まずは、 RHEL/CentOS でのやり方をメインに説明します。最後に Ubuntu でやる場合の差分情報もまとめておきました。
REEL/CentOS 編
NFSv3以前の場合
CentOS の場合、nfs-file-server パッケージはデフォルトでインストールされています。
サーバー側の設定は /etc/exports
に
directory client(option,...) client(option,...) ...
の形で記述します。
/path/to/dir1 nfs.client.addr(rw,sync)
/path/to/dir2 nfs.client.addr(rw,sync)
みたいな感じ。 同じクライアントへ、複数のディレクトリを公開することもできる。
設定したら
# chkconfig nfs on
# service nfs restart
RHEL や CentOS はデフォルトでファイアウォールでブロックされているので、システム->管理->ファイアウォールで無効にしておきます。 (ポート番号が固定されないらしいので。)
クライアント側から
# mount nfs.server.addr:/path/to/dir1 /mount/point1
# mount nfs.server.addr:/path/to/dir2 /mount/point2
みたいな感じでマウントできます。
マウント対象のディレクトリパスは、実際にサーバーが公開されているディレクトリパスよりも上の階層、下の階層も指定できます。
# mount nfs.server.addr:/ /mount/point
のようにサーバー側のルートディレクトリも指定できる。 もちろん、公開されているディレクトリしか見えないわけですけど。
NFSv4 の場合
v3以前は、サーバーはディレクトリごとに個別に export し、クライアント側もディレクトリごとに個別にマウントしていた。
それに対して、v4 ではサーバーは一つの仮想的なファイルシステムを export し、クライアント側からはそれがサーバーのルートディレクトリとして見えます。
サーバー側の /etc/exports
の設定は
/path/to/dir nfs.client.addr(rw,sync,fsid=0)
などのようにします。
fsid=0
を指定するのがポイントです。
クライアント側はv3以前と同じように
# mount nfs.server.addr:/ /mount/point
のようにする。-t nfs4
はつけてもつけなくても変わらなかった。
v4では、クライアントから見た時のディレクトリの見え方が異なります。
v3以前は サーバー側の /path/to/dir
はクライアントからも server:/path/to/dir
として見えました。
v4の場合、サーバー側の /path/to/dir
はクライアント側からは server:/
に見えます。
前述の通り、v4 では 仮想的なファイルシステムを一つだけ作ってそれを export し、ルートディレクトリとしてクライアントに見せるというポリシーのため、別々のディレクトリを export したいときはちょっと手間がかかります。
とりあえず export するディレクトリツリーを /export
の下に構築することにする。
例えば、 /home/user1
と /home/user2
を export したい場合
# mkdir -p /export/user1 /export/user2
# mount --bind /home/user1 /export/user1
# mount --bind /home/user2 /export/user2
このように export したいディレクトリを bind で /export
の下に集めるわけだ。
/etc/exports
の書き方は2通りあります。
1つ目は親ディレクトリに fsid=0
を指定、子ディレクトリには nohide
を指定する方法。
/export nfs.client.addr(rw,sync,fsid=0)
/export/user1 nfs.client.addr(rw,sync,nohide)
/export/user2 nfs.client.addr(rw,sync,nohide)
2つ目は親ディレクトリに fsid=0
と crossmnt
を指定する方法。
/export nfs.client.addr(rw,sync,fsid=0,crossmnt)
親に crossmnt
指定すると、子に nohide
指定するのと同じ効果が得られます。
後者のやり方の方が、重複する記載がないので、楽だと思います。
なお、v4ではポートが固定されるので、ファイアウォールといっしょに使いやすいです。 2049/tcp を開いておきます。
v3以前とv4が混在したら、、、
上記のように /etc/exports
の書き方、つまり fsid=0
がついているかどうかで、v3 か v4 かが判断されるわけです。
一つの /etc/exports
の中に、v3以前の書き方とv4の書き方を混在して書くこともできるわけだが、その場合どうなるんでしょうね。実験してみました。
/etc/exports
の記載は以下のようにします。
# v3 style
/path/to/dir1 nfs.client.addr(rw,sync)
/path/to/dir2 nfs.client.addr(rw,sync)
# v4 style
/export nfs.client.addr(rw,sync,fsid=0)
/export/user1 nfs.client.addr(rw,sync,nohide)
/export/user2 nfs.client.addr(rw,sync,nohide)
クライアントから
# mount nfs.server.addr:/ /mount/point
とするとサーバーの /export
がマウントされた。ルートディレクトリをマウントしようとすると v4 の意味に解釈されるらしい。
# mount nfs.server.addr:/path/to/dir1 /mount/point
とするとサーバーの /path/to/dir1
がマウントされた。
一応、同一サーバー、同一クライアント間で v3以前と v4 は同時使用できるみたいだ。
ただし、
#mount nfs.server.addr:/path/to /mount/point
のように v3 スタイルの上位ディレクトリを指定するとアクセス拒否されるようになりました。
v3以前のやり方のほうが設定は簡単でわかりやすいとは思いますが、v4 だと
- ポート番号が2049 固定でファイアウォールと一緒に使いやすい
- Kerberos と組み合わせてセキュリティ面を強化
- idmapd で サーバー/クライアント間で異なるUID/GID でも対応できる
などのメリットもあるので、自分は NFSv4 を使うようになりました。
Kerberosとの組み合わせ方は、後日まとめます。
Ubuntu編
さて、上記は RHEL/CentOS の場合ですが、Ubuntuの場合にも簡単にまとめておきます。
Ubuntu ではデフォルトでは NFS は入っていないので
サーバー側は nfs-kernel-server
パッケージをインストール。
クライアント側は nfs-common
パッケージをインストールします。
サービス名は nfs-kernel-server
です。
あとのやり方は RHEL/CentOS編 で説明したのと同じですので、割愛します。
blog comments powered by Disqus