NFS4 を用いて共有ディレクトリを公開する

SERVER


NFS

Linux には、NFS (Network File System) という、ネットワークでディレクトリを共有する仕組みがあります。

これを用いることで、NFS サーバ上の特定のディレクトリを公開して、それを別の Linux の任意のディレクトリへマウントすることが出来ます。これにより、通常のディレクトリ操作で、ネットワーク上の別の Linux へデータを保存することができるので、活用の幅がとても広い仕組みです。

今回、CentOS 4.6 で、この NFS を用いて任意のディレクトリを共有し、他の Linux でマウントしてみたので、それについて記しておくことにしました。

 

NFS サーバを設定する

NFS サービスの起動

今回使用した CentOS 4.6 では、既に NFS4 サービスのプログラムがインストールされていたので、起動はとても簡単でした。

service nfs start

上記のコマンドを実行することで、NFS に関連する "rpc.mountd", "nfsd", "rpc.rquotad" が起動されました。

OS 起動時に動作させたい場合には、/etc/rc.d/ ディレクトリにある "rc3.d/" や "rc5.d/" といったランレベル毎の起動サービス設定ディレクトリで、"K**rpc" というファイル名を "S**rpc" に変更することで、OS 起動時に自動的に NFS が立ち上がるようにすることが出来ます。

 

その他、portmap サービスも NFS を使用する上で必要になるとのことでした。

今回の環境では OS 起動時に自動的に立ち上がるように設定されていましたが、こちらを立ち上げる必要がある場合には、NFS サービスと同様、"service portmap start" を実行したり、"/etc/rc.d/" により自動起動するように設定するようにします。

なお、portmap サービスが起動しているかを確認する方法としては、"service portmap status" 命令を実行するという方法もあります。

 

アクセス用のアカウント準備

NFS4 の利用にあたり、共有ディレクトリを提供するサーバ側と、そのディレクトリをマウントするクライアント側とで、同一 UID のアカウントを作成しておく必要がありました。

マウントした NFS へのファイルの読み書きは、クライアント側でその操作を行っているアカウントの UID を用いて行われるようです。ですので、サーバ側で接続を許可したクライアントに登録されている Linux アカウントの状況も踏まえ、適切なアカウントを登録しておく必要があります。

サーバー側とクラアイアンと側とで UID に気を使う必要はあるものの、アクセス制御はクライアント毎に指定することができますし、接続してきたクライアントによっては、どのアカウントからのアクセスであっても強制的に特定の UID からのアクセスとみなすこともできるので、接続してくるクライアント全てを把握している必要はない感じです。

また、標準では root アカウントでアクセスしてきた場合には、"nfsnobody" アカウント (UID=65534) で接続してきたとみなすようになっているのも安心感があります。

 

そんなことを考慮してアカウントの準備をすることとなりますが、今回は、クライアント側とサーバ側の両方に、UID=1000 の "nfs-user" というアカウントを登録したとして、話を進めて行くことにします。

 

共有するディレクトリの準備

共有するためのディレクトリを、通常とまったく同じ方法で作成します。

今回は "/var/nfs/public" というディレクトリを "nfs-user" アカウントに対して読み書き可能で公開し、それ以外のアカウントに対しても読取のみで公開するようにします。

つまり、"/var/nfs/public" ディレクトリを作成して、"nfs-user" を所有者とし、所有者には読み書き権限を、それ以外には読取権限のみを与えるという感じになりますので、設定の手順としては次のような感じになると思います。

# /var/nfs/public ディレクトリを作成します。

mkdir /var/nfs

mkdir /var/nfs/public

 

# /var/nfs/public ディレクトリの所有者を "nfs-user" にします。

chown nfs-user /var/nfs/public

 

# /var/nfs/public ディレクトリに、適切な権限を設定します。

chmod 755 /var/nfs/public

 

共有ディレクトリを公開する

NFS で共有するディレクトリは "/etc/exports" ファイルに記載します。

ここで、どのディレクトリを、どのクライアントへ、どのような形で公開するかといった指定を行うことが出来るようになっています。たとえば、次のように設定されている場合をみて行きます。

/var/nfs/public 192.168.0.2(rw,sync,root_squash,fsid=0,insecure,no_subtree_check,anonuid=-2,anongid=-2)

幾つか詳しく分らないオプション指定もありますが、解る範囲でみて行くと、まず、大きく分けて次のような構造になっています。

/var/nfs/public 公開するディレクトリです。
192.168.0.2 接続を許可するクライアントのアドレスを指定します。192.168.0.0/255.255.255.0 といった指定方法も出来るようです。
(rw,sync...,anongid=-2) 制御の動作を決めるオプションです。

ここで、上記 2 番目と 3 番目の間、IP アドレスとオプション記載のための "(" の間に空白文字を挟んでしまうと、そのアドレスへの制御方法ではなく、その他一般からの接続に対する制御方法として解釈されてしまうので注意が必要です。一応、空白文字を挟んだ場合は、設定を反映させる際に警告メッセージが表示されるようになっていました。

 

制御のためのオプションで、特筆すべきところに少し触れておきます。

"rw" というのは、そのディレクトリが読み書き可能として公開されるということを意味しています。ただし、読み書き可能として公開されても、サーバ側のディレクトリ設定で、接続してきたアカウントが読み取りまでしかできない場合は、ここで書き込み可能に設定しても、そのアカウントでは読み取りだけしかできなくなります。どんなアカウントに対しても読み取りだけしか許可したくない場合には、ここを "r" に設定します。

"root_squash" というオプションは、root アカウントでの接続がされた場合に、{UID=anonuid, GID=anongid} として接続してきたとみなすためのオプションです。これがディフォルトの設定らしく、敢えて root からの接続をそのまま通したい場合には、ここを "no_root_squash" に指定します。また、"all_squash" を指定することで、全てのアクセスを {UID=anonuid, GID=anongid} からのものとみなすことが出来るようにもなっています。

"fsid=0" というのは、NFS4 形式でマウントするために必要なオプションらしいです。NFS4 でマウントすると、2049/TCP ポートでの通信だけで共有を行うことが出来るらしいので、ファイアーウォールとの兼ね合いもあって、個人的には、出来ればこれは設定しておきたいところです。

"anonuid" と "anongid" は、squash 指定で匿名アクセスを行う場合に、実際のアクセスに大して割り当てる UID と GID を設定することができます。

 

 

このような形で、共有ディレクトリの設定を行います。設定は、同一ディレクトリに対して、クライアント毎の設定を行うことができるようになっています。クライアント毎に設定を行う場合は、"クライアントのアドレス(制御オプション)" の記載を、空白文字を挟んで複数記載しても良いですし、行を変えて同じディレクトリ名の制御を複数個、宣言することも可能です。

共有ディレクトリの設定がおわったら、次の命令を実行すれば、"/etc/exports" に書いた内容が NFS サーバに反映されます。

exportfs -r

なお、設定が正しく反映されているかどうかは、次の命令を用いて確認することができます。

exportfs -v

 

NFS4 のためのファイアーウォールの設定

NFS 共有ディレクトリを設定したサーバと、それをマウントするクライアントとの間に、ファイアーウォールが設定されている場合には、通信を通過させる設定を行う必要が出てくる場合があります。

クライアント側から NFS4 でマウントする場合には、サーバへの 2049/TCP での通信が行えるようにする必要があるようです。

 

Linux で一般的な iptables を用いて通信を許可する場合には、次のような感じになります。

iptables -A INPUT -p tcp --dport 2049 -s 192.168.0.2 -j ACCEPT

上記の "192.168.0.2" というのは、接続してくるクライアントのアドレスを想定していますので、環境に応じて制限をきつくしたり緩めたりするのが良いでしょう。

 

 

NFS ディレクトリをマウントする

NFS サーバで公開されたディレクトリをマウントするには、次のようにします。

mount -t nfs4 192.168.0.1:/ /mnt

このようにすることで、NFS サーバ "192.168.0.1" の共有ディレクトリを、ローカルディレクトリ "/mnt" にマウントすることができます。これにより、"/mnt" ディレクトリへファイルの読み書きを行えば、操作しているアカウントの情報およびサーバ側で設定されている制御設定をもとに、ファイルの読み書きを行うことが可能です。

OS 起動時に NFS ディレクトリをマウントさせておきたい場合には、"/etc/rc.local" 等に、上記のマウント命令を記載しておくと良いでしょう。

 

なお、マウントするにあたって、クライアント側で portmap サービスが稼働している必要があります。

これが起動していないと、mount 命令実行時に 30 秒ほど応答なしに待たされてしまう様子です。このような場合には、サーバの設定と同様、以下のようにして portmap サービスを起動します。

service portmap start

OS 起動時に NFS ディレクトリをマウントしたい場合には、クライアント側でも "/etc/rc.d/rc3.d" や "/etc/rc.d/rc5.d" 格納されいてるファイルを調整するなどして、起動時に portmap サービスが起動するようにしておきます。