NFS (Network File System)

NFS を使うと、ネットワーク経由でディレクトリをマウントできます。 /home などはファイルサーバからマウントしておくと どこでも同じファイルにアクセスできます。


NFS サーバ、クライアント共通

/etc/hosts によるホスト名解決ができるように、 サーバ、クライアントをリストに入れておきます。
/etc/hosts

123.45.67.89 server.hogehoge.ac.jp server
123.45.67.90 client.hogehoge.ac.jp client

NFS サーバ

NFS サーバでは、デーモンの起ち上げと /etc/exports の記述、 /etc/hosts.allow で portmap の許可出しをします。

デーモン

NFS サーバでは、つぎの3つのデーモンを起ち上げます。 これらが起動しているかどうかは、ps または rpcinfo -p で 確認できます。
    % rpcinfo -p
     program vers proto   port
       100000    2   tcp    111  portmapper
       100000    2   udp    111  portmapper
       100005    3   udp   1023  mountd
       100005    3   tcp   1023  mountd
       100005    1   udp   1023  mountd
       100005    1   tcp   1023  mountd
       100003    2   udp   2049  nfs
       100003    3   udp   2049  nfs
       100003    2   tcp   2049  nfs
       100003    3   tcp   2049  nfs

起ち上がっていなければ、とりあえず手動で起ち上げます。

# /usr/sbin/portmap
# /sbin/mountd
# /sbin/nfsd

ブート時の自動起ち上げは、/etc/rc.conf に 次の2行を加えます。
/etc/rc.conf

### Network File System: ###
nfs_server_enable="YES"

/etc/exports

マウントを許可するディレクトリとオプションの指定は /etc/exports で行います。
/etc/exports

/usr /usr/local -maproot=0:10 host1 host2 host3
/u2 -alldirs 123.45.67.89
/cdrom -ro host.hogehoge.ac.jp

上の行から説明します。

/etc/exports を変更したら、mountd に HUP シグナルを 送って再起動します。
# killall -HUP mountd

/etc/hosts.allow

NFS ではリモートホストからサーバの portmap を使います。 そこで、portmap が使えるように許可を出しておきます。
/etc/hosts.allow

portmap : (host_name or IP_address) : allow
なお、FreeBSD 5.x では portmap ではなく rpcbindの許可を出さないといけないようです。

NFS クライアント

NFS クライアントでは、デーモンの起ち上げと、 マウント指定をします。

デーモン

NFS クライアントに必要なデーモンは次の一つ。 起ち上がっていなければ、とりあえず手動で起ち上げます。

# /sbin/nfsiod

ブート時の自動起ち上げは、/etc/rc.conf に 次の1行を加えます。
/etc/rc.conf

nfs_client_enable="YES"

手動マウント

NFS サーバ server の /home をローカルの /mnt に 手動でマウントするときは、次のようにします。
# mount -t nfs server:/home /mnt

mount にもいろいろオプションがあるので、 詳しくは (j)man mount して見て下さい。

ブート時マウント

/etc/fstab に次のような記述を加えておきます。
/etc/fstab

server:/home /mnt nfs rw 0 0

これは常にマウントされた状態を維持する設定ですが、 サーバがダウンするとクライアントも道ずれになります。 また、サーバをダウンさせたままクライアントを再起動させると、 マウントするべきディレクトリを探したまま止まってしまいます。

アクセスしたときのみマウントする設定も可能で、 こちらはサーバがダウンしたときにクライアントが 道ずれにならなくてすみます。

トラブルシューティング

ユーザのホームディレクトリ(/home など)を NFS で共有する場合の注意
NFS をする場合、NIS (Network Information Service) を使って ユーザ認証をすることもあるのですが、 NIS を使わない時はどのようにしてユーザ認証をすればよいのでしょう? 答えはユーザID(UID) です。

計算機はユーザを名前(ユーザ名、ログインネーム)ではなくて、 番号(ユーザID) で認識しています。 このことを理解することは NIS なしに /home を NFS で共有する上で 非常に重要です。 例えば、NFSサーバ host1 と クライアント host2 を考えましょう。 これらのマシンの上で、次のようなユーザID が設定されているとしましょ う。

host1 host2
ユーザ名 ホームディレクトリ ユーザ ID ユーザ ID
user1 /home/user1 2001 2002
user2 /home/user2 2002 2001

このとき、host2 の user1 は、NFS でやってきた /home/user1 に 書き込みはできません。なぜなら、host2 の user1 は UID=2002 ですが、 /home/user1 の オーナーは UID=2001 なので、 host1 は「オーナーとは違う人からのアクセス」と解釈するからです。 逆に、host2 の user2 は /home/user1 上で好きなように読み書きできます。 これは非常に困ります。

どうすればよいかはすでにお分かりかと思いますが、 NFS のホストとクライアントでユーザIDを 同じ番号にすればよいのです。 これは、ユーザ登録の時にやっておいた方が楽ですが、 後から変更する場合は vipw で /etc/passwd を編集します。 /etc/passwd は 「:」で区切られたコラムからなり、 UID の欄は左から3つ目です。なお、/etc/passwd を保護するため、 このファイルを 普通の vi では編集しないで下さい。 (man vipw(8) 参照)


FreeBSD の部屋


Feb. 13, 2001