Ubuntu7.10 + NFSでファイル共有した際の設定メモ。
■NFSとは
Network File Systemの略で、ネットワークを介してUNIXシステム間でファイル共有を可能にする機能。リモートのファイルシステムをローカルファイルシステムと同じように扱うことができるようになる。元はSunが開発したもの。
■必要なパッケージ
$ sudo apt-get install portmap nfs-common nfs-kernel-server
NFSサーバにはkernel組込み版と通常daemon版の2種類がある。kernelサーバ版はkernel内部にカーネルスレッドとして組み込まれ
ているのでパフォーマンスがよく、ファイルのロック機構も有効になる。nfs-user-serverは通常のdaemon版で、速度的にはkernel
版に劣るが柔軟な設定が可能なのが特徴。
サービスは以下のような感じ。
$ sysv-rc-conf --list | grep -E 'nfs|portmap'
nfs-common 0:off 1:off 2:on 3:on 4:on 5:on 6:off S:on
nfs-kernel-s 0:off 1:off 2:on 3:on 4:on 5:on 6:off
portmap 0:on 1:off 2:on 3:on 4:on 5:on 6:on S:on
nfs-kernel-sで表示が切れてるが本当はnfs-kernel-server。
■起動順序
Ubuntuではインストールすると勝手にサービスに登録されて起動したが、手動で起動する場合は起動順序に気をつける必要がある。起動順序に関して検索するとportmap→nfslock→nfsの順に起動しろという
記述を目にするが、現在のバージョンではサービス名が変わっているようで、portmap→nfs-common→nfs-kernel-serverの順でいいと思う。一応/etc/rc3.d内のファイル名からサービス起動順序が確認できる。
portmapとnfs-common、nfs-kernel-serverの起動順序
itmst@mv1c3e:/etc/rc3.d$ ls *{portmap,nfs*}
S17portmap S20nfs-common S20nfs-kernel-server
nfs-commonやnfs-kernel-serverよりも先にportmapが起動していないとまずいことが分かる。RPCベースのサービスはportmapサービスに依存するので当然。
■RPC
portmapはRPC(Remote Procedure Call)を管理する。NFSサービスはRPCで提供される。
RPCはリモートマシンに用意されているなんらかのサービスを、別のマシンから呼び出して使えるようにする機能。
RPCサービスはプログラム番号で識別される。サービス名とプログラム番号の対応は/etc/rpcで設定されている。
(省略)
portmapper 100000 portmap sunrpc
rstatd 100001 rstat rstat_svc rup perfmeter
rusersd 100002 rusers
nfs 100003 nfsprog
(省略)
■RPCとportmap
RPCの各サービスのTCP/IPポート番号は実行時に動的に割り当てられる。それを管理するのがportmapサービス。
クライアントからサービス番号を受け取り対応するサービスのポート番号を返す。
現在portmapに登録されているすべてのRPCプログラムを表示するには「rpcinfo -p」を実行する。
$ rpcinfo -p
program vers proto port
100000 2 tcp 111 portmapper
100024 1 udp 32768 status
100024 1 tcp 35772 status
100011 1 udp 630 rquotad
100011 2 udp 630 rquotad
100011 1 tcp 632 rquotad
100011 2 tcp 632 rquotad
100000 2 udp 111 portmapper
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100021 1 udp 32780 nlockmgr
100021 3 udp 32780 nlockmgr
100021 4 udp 32780 nlockmgr
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100021 1 tcp 33493 nlockmgr
100021 3 tcp 33493 nlockmgr
100021 4 tcp 33493 nlockmgr
100005 1 udp 32781 mountd
100005 1 tcp 44233 mountd
100005 2 udp 32781 mountd
100005 2 tcp 44233 mountd
100005 3 udp 32781 mountd
100005 3 tcp 44233 mountd
nfsはTCP/IPポート2049番に割り当てられているのが確認できる。portmapperは111番。
クライアントは111番のportmapperサービスにnfsのサービス番号100003で問い合わせ、
nfsサービスがTCP/IPの2049番で動作していることを知ることができる。このようにポート番号は動的に割り当てられることになっているが実際のところNFSは2049番ポートで実行されることがほとんどのようです。
■portmapのアクセス制御
portmapにはTCPWrappersのライブラリlibwrapが組み込まれているので/etc
/hosts.allowと/etc/hosts.denyでアクセス制御が可能。以下のように設定することで192.168.0.0/24ネットワーク
からのみportmapサービスにアクセスできるようにすることができる。ただしportmapサービスのアクセス制御はRPCベースのすべてのサービス
に影響することに注意する。
□192.168.0.*からのアクセスを許可する
/etc/hosts.allow
ALL:127.0.0.1
portmap:192.168.0.
lockd:192.168.0.
mountd:192.168.0.
statd:192.168.0.
□その他のアクセスを拒否する。
/etc/hosts.deny
portmap:ALL
lockd:ALL
mountd:ALL
rquotad:ALL
statd:ALL
上記の設定は以下を参考。
NFS サーバの設定
■公開ディレクトリの設定ファイル
公開ディレクトリは「/etc/exports」で設定する。
/etc/exportsの書式
<公開ディレクトリ> <アクセス許可ホスト>(<カンマ区切りオプション>)
□主なオプション一覧
| ro |
読み取りのみ許可 |
| rw |
読み取り・書き込みともに許可 |
| root_squash |
リモートrootをnobodyユーザとして扱う。明示的に指定しなくてもデフォルトで有効になる。no_root_squashオプションで無効にできるが、特別な理由がない限り避けるべき。 |
| no_root_squash |
リモートrootをローカルrootとして扱う。クライアント側のroot権限をNFSでマウントしたファイルシステムにも有効にする。セキュリティホールになり得るので特別な理由がない限りこのオプションは使うべきではない。 |
| all_squash |
全てのユーザを不特定ユーザとして扱う。 全てのユーザを匿名ユーザ(nobody)として扱う |
| anonuid |
不特定ユーザ用にローカルユーザIDを指定 匿名ユーザ用のUIDを指定する |
| anongid |
不特定ユーザ用にローカルグループIDを指定する 匿名ユーザ用のグループIDを指定する |
| no_subtree_check |
サブツリーのチェックを無効 |
その他オプションは以下参照
Manpage of EXPORTS
実際の例として、/home/itmst/Desktopをlanドメインからのすべてのアクセスを許可し、読み書き可、root権限なし、サブツリーチェック無効で公開する場合、
/home/itmst/Desktop *.lan(rw,root_squash,no_subtree_check)
となる。ひとつのディレクトリに対して複数の公開対象ホストを設定する場合はスペース区切りで続けて記述する。
/home/itmst/Desktop *.lan(rw,root_squash,no_subtree_check) *.lan2(ro)
スペースが区切り文字として認識されるので、「*.lan」と「(rw,」の間にスペースを空けてはいけないことに注意。
■設定の反映
/etc/exportsを変更した場合は以下のコマンドを実行して設定を反映させる。
$ sudo service nfs-kernel-server reload
* Re-exporting directories for NFS kernel daemon... [ OK ]
または
$ sudo exportfs -r
でも可。
■公開ディレクトリの確認
公開されているディレクトリを確認するにはnfs-commonパッケージに含まれるshowmountコマンドを使う。-eオプションでホストを指定できる。クライアントの設定をするときも目的のホストの公開ディレクトリを確認できる。
$ showmount -e localhost
Export list for localhost:
/home/itmst/Desktop 192.168.0.*
■サーバとクライアントでuidとgidを統一させる
NFSではユーザの識別がユーザ名ではなく、ユーザIDによって行われるため、サーバ側とクライアント側でユーザIDを統一しておく。
■NFSクライアント
クライアント側からNFS公開ディレクトリをマウントする。通常のmountとほとんど同じだが、マウント対象
ディレクトリの前に「ホスト名:」をつける。マウントオプションは-oオプションでカンマ区切りで記述する。-tオプションでファイルシステムにnfsを
指定してもいいが無くてもいける。
□代表的なマウントオプション
| hard |
ハードマウント(デフォルトで有効) |
| soft |
ソフトマウント |
| intr |
ハードマウント時に割り込みを受け付けるかどうか |
| rsize=byte |
読み込みバッファサイズ デフォルト1024Byte。rsize=4096のように1024の倍数で16384までの範囲でバイト単位で指定。 |
| wsize=byte |
書き込みバッファサイズ デフォルト1024Byte。rsize=4096のように1024の倍数で16384までの範囲でバイト単位で指定。 |
| nosuid |
サーバ上のsuidプログラムの実行を不可にする。クライアント側のroot所有ファイルが書き換えられるの防ぐ。サーバが完全に信用できない場合は有効にすべき。 |
| noexec |
サーバ上のファイルの実行を禁止する。サーバが信用できない場合、必要なら有効に。 |
実際にマウントする際の例は以下。
$ sudo mkdir /mnt/nfs
$ sudo mount -t nfs -o hard,intr 192.168.0.3:/home/itmst/Desktop nfs
■ハードマウントとソフトマウント
ハードマウントの場合は、NFSサーバへの書き込みは保証されるが、サーバ側がダウンした場合クライント側では無限にリトライを繰り返し、
プロセスがハングアップする可能性がある。サーバが復活したらそのまま再接続される。
ソフトマウントの場合は、NFSサーバへの書き込みは保証されないのでファイルが破損する可能性がある。
接続できない場合はタイムアウトするのでハングアップの心配はない。
NFSの問題については以下参照。
NFS環境の問題点と自動マウント
複数のクライントが接続する場合は負荷が高くなるのでautofsなどを使って通信が発生する場合のみマウントするようにした方が良い。
■/etc/fstabに登録して自動起動
書式
<ホスト名>:<リモートディレクトリ> <マウント先ディレクトリ> nfs <カンマ区切りオプション> 0 0
192.168.0.3で公開されている/home/itmst/Desktopを読み書き可、割り込み可でハードマウントする場合は
192.168.0.3:/home/itmst/Desktop /mnt/nfs nfs rw,hard,intr 0 0
という感じになる。
출처: http://itmst.blog71.fc2.com/blog-entry-89.html