(このページは Raspbian wheezy での試行です。あしからず)
いまさらですが、1号機、2号機間でNFSによるファイル共有の設定をします。
パッケージのインストールから始めて、設定ファイルの作成、NFSの起動・動作確認まで行います。

参考サイト:
http://www.asahi-net.or.jp/~aa4t-nngk/nfsv4.html
http://0x0d0a.tumblr.com/post/94631531201/raspberry-pi-autofs-nfs

目次

装置の構成

主な構成は下記の通りです。

NFSサーバー
1号機(192.168.1.20)
NFSクライアント
2号機(192.168.1.21)
OSのバージョン
Linux rasp01 3.18.9+ #768 PREEMPT Sun Mar 15 18:59:03 GMT 2015 armv6l GNU/Linux
(1号機、2号機とも同じ。wheezyです)

次に、NFSサーバー側のどのディレクトリを公開するのか、また、NFSクライアント側でどこへマウントするのかを決めておきます。

NFSサーバー(1号機)
公開ディレクトリ /var/export/
NFSクライアント(2号機)
マウントディレクトリ /mnt/nfs/export.rasp00/

また、クライアント側は autofs パッケージ(automountデーモン)により、必要に応じて自動マウント・アンマウントするようにします。

次からは設定作業ですが、基本的にはrootで作業します。

NFSサーバー(1号機)

パッケージのインストール

下記で一発です。

# apt-get install nfs-kernel-server
(以下省略)
Creating config file /etc/default/nfs-kernel-server with new version
Not starting NFS kernel daemon: no exports. ... (warning).

なにやら最後にワーニングが出ていますが、とりあえず保留にして、次へ。

設定ファイル

/etc/exports ファイルの雛形が既に存在するので、下記の行を末尾へ追加します。

/var/export         192.168.1.21(rw,no_subtree_check)

細かいオプションはひとまず置いておき、カッコの中にはとりあえず最低限を記述します。

補足:
「no_subtree_check」オプションはなくても動きますが、これを省略してnfs-kernel-serverを起動すると、

Neither 'subtree_check' or 'no_subtree_check' specified for export "192.168.1.21:/var/export".
  Assuming default behaviour ('no_subtree_check').
  NOTE: this default has changed since nfs-utils version 1.0.x

というようなメッセージが出力されます。このメッセージが出ないようにするために「no_subtree_check」または「subtree_check」を設定ファイルに記述しておきます。

NFSサーバーの起動

とりあえず手動で起動します。

# /etc/init.d/nfs-kernel-server start
[ ok ] Exporting directories for NFS kernel daemon....
[....] Starting NFS kernel daemon: nfsd
[warn] Not starting: portmapper is not running ... (warning).

むむ、最後の行で warning が出ている・・・しかも、nfsも起動していません。
portmapper の設定が必要のようです。
portmapper は rpcbind パッケージが面倒を見ているので、rpcbindの起動状態を確認します。

# /etc/init.d/rpcbind status
[FAIL] rpcbind is not running ... failed!

起動していないようです。
気を取り直して、rpcbind, nfs-kernel-serverを起動します。

# /etc/init.d/rpcbind start
[ ok ] Starting rpcbind daemon....
root@rasp00:/etc# /etc/init.d/nfs-kernel-server  start
[ ok ] Exporting directories for NFS kernel daemon....
[ ok ] Starting NFS kernel daemon: nfsd mountd.

これで無事NFSサーバーを起動することができました。

OS起動時の自動起動

rpcbind , nfs-kernel-serverの自動起動の設定状態を確認します。
管理人TKはchkconfigパッケージを導入しているので、chkconfig コマンドで確認します。
(debian系の正統派はinsservあたりでしょうか。実際 chkconfig を実行すると中でinsservが走っているようです:-)。

# chkconfig --list rpcbind nfs-kernel-server
rpcbind                   0:off  1:off  2:off  3:off  4:off  5:off  6:off
nfs-kernel-server         0:off  1:off  2:on   3:on   4:on   5:on   6:off

rpcbind が自動起動しないので、下記のコマンドで自動起動するようにします。

# chkconfig --add rpcbind
insserv: warning: current start runlevel(s) (empty) of script `rpcbind' overrides LSB defaults (2 3 4 5 S).
insserv: warning: current stop runlevel(s) (0 1 2 3 4 5 6 S) of script `rpcbind' overrides LSB defaults (0 1 6).
rpcbind                   0:off  1:off  2:off  3:off  4:off  5:off  6:off

エラーを吐いてしまい、自動起動を有効にできません。
さあて、はまりました・・・
答えは下記のサイトにありました(ありがとうございます)。
http://0x0d0a.tumblr.com/post/94631531201/raspberry-pi-autofs-nfs
どうやら、すべてのrunlevelのシンボリックリンクを手動で削除してから、改めて自動起動設定コマンドを打つ必要があるそうです。
とりあえず削除する予定のファイル(symlink)を確認し、rmで一気に削除します。

# ls -l /etc/rc*/*rpcbind
lrwxrwxrwx 1 root root 17  6月 25  2014 /etc/rc0.d/K08rpcbind -> ../init.d/rpcbind*
lrwxrwxrwx 1 root root 17  6月 25  2014 /etc/rc1.d/K08rpcbind -> ../init.d/rpcbind*
lrwxrwxrwx 1 root root 17  6月 25  2014 /etc/rc2.d/K08rpcbind -> ../init.d/rpcbind*
lrwxrwxrwx 1 root root 17  6月 25  2014 /etc/rc3.d/K08rpcbind -> ../init.d/rpcbind*
lrwxrwxrwx 1 root root 17  6月 25  2014 /etc/rc4.d/K08rpcbind -> ../init.d/rpcbind*
lrwxrwxrwx 1 root root 17  6月 25  2014 /etc/rc5.d/K08rpcbind -> ../init.d/rpcbind*
lrwxrwxrwx 1 root root 17  6月 25  2014 /etc/rc6.d/K08rpcbind -> ../init.d/rpcbind*
lrwxrwxrwx 1 root root 17  9月 26  2013 /etc/rcS.d/K12rpcbind -> ../init.d/rpcbind*
root@rasp00:/etc# rm -f /etc/rc*/*rpcbind

はい、削除完了しました。
このあと、再度自動起動の設定をします。

# chkconfig --add rpcbind
rpcbind                   0:off  1:off  2:on   3:on   4:on   5:on   6:off  S:on

めでたく設定できました。

ワークファイルのSDカードへの書き込み抑止

(2015-04-10)後日気づいたのですが、NFSサーバーを起動するとき、下記の2つのファイルが作成・更新されるようです。

  1. /var/lib/nfs/etab
  2. /var/lib/nfs/rmtab

/var/lib/ ディレクトリは tmpfs 化していないため、書き換え頻度によってはSDカードの寿命を縮めてしまうことになります。
よって、これらをtmpfs上の適当なファイルへ振って(シンボリックリンク作成して)、SDカードへの書き込みを回避することにします。

  1. /var/lib/nfs/etab
    NFSサーバーが起動するときに、シンボリックリンクが強制的に通常ファイルとして作成されてしまい、失敗でした。これはまあNFSサーバーが起動するときだけ(たいていOSブート時)なので、ひとまず目をつぶります。
  2. /var/lib/nfs/rmtab
    NFSクライアントから接続が来た時に作成されます。/var/tmp/rmtab へのシンボリックリンクとして作成したところ、うまい具合にシンボリックリンクのまま動作しました。
    → 2016-08-19 syslog見たら、エラー吐いてました!! NFSマウント時に rmtab.tmp を作成し、アンマウント時に rmtab.tmp を rmtab へリネームしようとしていて、rmtab がシンボリックリンクなのでエラーになっているようです。
    これがもともとなのか、NFSのバージョンやらOSのバージョンが上がったせいなのか(wheezy → jessie)は、よくわかりません。

ということで・・・
2016-08-19 /var/lib/nfs を /var/tmp/nfs へのシンボリックリンクにしました(/var/tmpはtmpfs済み)。
OSブート時には/var/tmp/nfsは存在しないので、/etc/tmpfiles.d/var.conf へ下記の行を追加し、自動作成されるようにします。

d /var/tmp/nfs 0755  statd nogroup - 

/etc/tmpfiles.d/var.conf がない場合は、/usr/lib/tmpfiles.d/var.conf を /etc/tmpfiles.d/ へコピーしてから編集すればオッケー。
(/etc/tmpfiles.d/に同名のファイルがあれば優先して使ってくれる)

それから、シンボリックリンクも作成。

# cd /var/lib
# mv nfs nfs.old      (元のディレクトリをリネームして念のため保存)
# ln -s /var/tmp/nfs .

OSを再起動して、/var/tmp/nfs が作成されていることを確認。

NFSクライアント(2号機)

autofs パッケージを使用し、必要に応じて自動マウント・アンマウントするようにします。

パッケージのインストール

まずは基本。

$ su
# apt-get install nfs-common
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
nfs-common はすでに最新バージョンです。
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 0 個。

あれれ、いつの間にかインストール済みでした。
次、autofs。

# apt-get install autofs
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
  autofs
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 0 個。
655 kB のアーカイブを取得する必要があります。
この操作後に追加で 1,417 kB のディスク容量が消費されます。
取得:1 http://mirrordirector.raspbian.org/raspbian/ wheezy/main autofs armhf 5.0.7-3 [655 kB]
655 kB を 1秒 で取得しました (408 kB/s)
以前に未選択のパッケージ autofs を選択しています。
(データベースを読み込んでいます ... 現在 77889 個のファイルとディレクトリがインストールされています。)
(.../autofs_5.0.7-3_armhf.deb から) autofs を展開しています...
man-db のトリガを処理しています ...
autofs (5.0.7-3) を設定しています ...

Creating config file /etc/auto.master with new version

Creating config file /etc/auto.net with new version

Creating config file /etc/auto.misc with new version

Creating config file /etc/auto.smb with new version

Creating config file /etc/default/autofs with new version
[ ok ] Starting automount....

デフォルトの設定ファイル(たぶん空)のまま、とりあえずデーモンが起動しました。
まだ何もマウントしていないと思いますが・・・。

設定ファイル

通常なら /etc/auto.master を直接編集するのですが、/etc/auto.master.d/*.autofs というファイルがあればそれをインクルードしてくれる(と/etc/auto.masterの中に書いてあった)ので、そちらへ設定ファイルを作成します。こうすると、パッケージに含まれているデフォルトのファイルを触らなくて済みます。

# mkdir /etc/auto.master.d
# head /etc/auto.master.d/*
==> /etc/auto.master.d/mnt-nfs.autofs <==
/mnt/nfs  /etc/auto.master.d/mnt-nfs.map  --timeout=60

==> /etc/auto.master.d/mnt-nfs.map <==
export.rasp00  -fstype=nfs,rw  192.168.1.20:/var/export

auto.master.d ディレクトリは存在しないので自分で作成します。
最初の mnt-nfs.autofs ファイルを作成する注意点としては、拡張を「.autofs」にする必要があります(でないとautofs起動時に読み込んでくれない)。
なお、上記でファイル内容を表示するのに、head コマンドを使っていますが、内容が少ないファイルを一度に複数表示させる場合に便利なので、管理人TKはよく使います。

この例は、192.168.1.20(NFSサーバー側)の /var/export ディレクトリを、2号機側で /mnt/nfs/export.rasp00 というディレクトリへマウントする、という内容となっています。

補足:
上記のマウントの仕方は「間接マップ」というそうです。ほかに、「直接マップ」等々あるようです。
詳しくは、man autofs からたどりましょう:-)。

autofsの起動

おもむろに autofs を起動します。

# /etc/init.d/autofs start

そして、/mnt/nfs/export.rasp00 へアクセスしてみます。

# ls /mnt/nfs/export.rasp00
ls: /mnt/nfs/export.rasp00 にアクセスできません: そのようなファイルやディレクトリはありません

ガーン。エラーです。
syslogを見てみると・・・

Mar 23 12:08:39 rasp01 rpc.statd[5573]: Version 1.2.6 starting
Mar 23 12:08:39 rasp01 rpc.statd[5573]: Flags: TI-RPC
Mar 23 12:08:39 rasp01 rpc.statd[5573]: failed to create RPC listeners, exiting

RPCがどうのこうの、と出ています。NFSサーバーと同じく rpcbind が必要ということでしょうか。
起動して確認してみます。

# /etc/init.d/rpcbind start
# /etc/init.d/autofs restart
# ls /mnt/nfs/export.rasp00

とりあえず大丈夫のようです。ファイルはまだないので、何も表示されません。
なお、NFSアンマウント状態では ls /mnt/nfs/ としても export.rasp00 は見えません。export.rasp00 へのアクセスが発生して初めて automout デーモンによりNFSマウントが行われ、export.rasp00 が出現します。
また、最後にアクセスしてから60秒経過すると /mnt/nfs/ の下から export.rasp00 が消えてなくなります(以後、これの繰り返し)。

OS起動時の自動起動

自動起動の設定状態を確認します。

# chkconfig --list rpcbind autofs
rpcbind                   0:off  1:off  2:off  3:off  4:off  5:off  6:off
autofs                    0:off  1:off  2:on   3:on   4:on   5:on   6:off

1号機と同じく rpcbind が起動しないので、自動起動するようにします。
1号機と同じエラーが出るので、シンボリックリンクを手動削除してから、自動起動の設定をします。

# rm -f /etc/rc*/*rpcbind
# chkconfig --add rpcbind
rpcbind                   0:off  1:off  2:on   3:on   4:on   5:on   6:off  S:on

これで万事オッケーです。

動作確認

ファイルの読み書き

1号機の/var/export/に下記のようなファイルを作成します。

rasp00# echo "this is 192.168.1.20" > /var/export/hello20.txt

2号機で表示してみます。

rasp01# ls -l /mnt/nfs/export.rasp00
合計 4
-rw-r--r-- 1 pi pi 21  3月 23 13:27 hello20.txt
rasp01# cd /mnt/nfs/export.rasp00
cat hello20.txt
here is 192.168.1.20

ん~ナイスです。 今度は2号機でファイルを作成してみます。

rasp01# echo "this is 192.168.1.21" > /mnt/nfs/export.rasp00/hello21.txt
bash: /mnt/nfs/export.rasp00/hello21.txt: 許可がありません

あれれ、書き込みはだめでつか。
クライアント側は rw オプションをつけているはずなので、サーバー側の問題でしょうか。いやいやサーバー側も rw つけてます。
ふと気づきました。rootではだめなのか!?一般ユーザーで再度挑戦。

rasp01# exit
rasp01$ echo "this is 192.168.1.21" > /mnt/nfs/export.rasp00/hello21.txt

問題なく実行できました。
1号機で確認します。

rasp00# cat /var/export/hello21.txt
this is 192.168.1.21

ばっちりOKです。

自動アンマウント

60秒経過後、2号機の/mntの下を見てみます。

rasp01# ls -l /mnt/nfs/
合計 0

はい、アンマウントされています。
ところで、カレントディレクトリを /mnt/nfs/export.rasp00 にしておくとか、この下のファイルを開いた状態では、アンマウントされませんのでご安心ください。

その他メモ(autofs使用上の注意とかコツとか)

NFSのマウントポイントディレクトリの制限

結論から書くと、*.autofsファイルに記述したマウントポイント(上の例では /mnt/nfs)直下には、ファイル、ディレクトリなどは一切作成できないようです(rootですら作成不可能)。
何らかの特別な管理用ディレクトリになっているようです(というかautofsというファイルシステム)。
前述の設定手順の中に、/mntの下にnfsディレクトリを作成する手順が含まれていませんが、不要です。
autofsをスタートさせると、/mntの下に自動的にnfsディレクトリが出現します。
ということは、autofsを停止すると、nfsディレクトリは消滅します。

autofsを手動で停止させる場合

下記のコマンドでクリーンな停止になります。

# cd /                          # マウントポイント以外へ移動
# /etc/init.d/autofs stop

万一、1行目を忘れてしまいマウントポイントを握ったまま(カレントディレクトリにしてしまっているとか)で autofs stop をしてしまうと、autofsは停止しますが、/mnt/nfs/はマウントされたまま(mount -lで確認できる)になってしまいますので、慌てずに、mountコマンドで確認~umountでマウント解除すればOKです。

# mount -l | grep autofs
/etc/auto.master.d/mnt-nfs.map on /mnt/nfs type autofs \
(rw,relatime,fd=6,pgrp=6594,timeout=60,minproto=5,maxproto=5,indirect)
# umount /mnt/nfs

これでクリーンになります。


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2022-02-15 (火) 10:06:42