19 December 2012

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=0crossmnt を指定する方法。

/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