(このページは 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サーバー側のどのディレクトリを公開するのか、また、NFSクライアント側でどこへマウントするのかを決めておきます。
また、クライアント側は autofs パッケージ(automountデーモン)により、必要に応じて自動マウント・アンマウントするようにします。
次からは設定作業ですが、基本的にはrootで作業します。
下記で一発です。
# 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」を設定ファイルに記述しておきます。
とりあえず手動で起動します。
# /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サーバーを起動することができました。
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
めでたく設定できました。
(2015-04-10)後日気づいたのですが、NFSサーバーを起動するとき、下記の2つのファイルが作成・更新されるようです。
/var/lib/ ディレクトリは tmpfs 化していないため、書き換え頻度によってはSDカードの寿命を縮めてしまうことになります。
よって、これらをtmpfs上の適当なファイルへ振って(シンボリックリンク作成して)、SDカードへの書き込みを回避することにします。
ということで・・・
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 が作成されていることを確認。
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 を起動します。
# /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 が消えてなくなります(以後、これの繰り返し)。
自動起動の設定状態を確認します。
# 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ファイルに記述したマウントポイント(上の例では /mnt/nfs)直下には、ファイル、ディレクトリなどは一切作成できないようです(rootですら作成不可能)。
何らかの特別な管理用ディレクトリになっているようです(というかautofsというファイルシステム)。
前述の設定手順の中に、/mntの下にnfsディレクトリを作成する手順が含まれていませんが、不要です。
autofsをスタートさせると、/mntの下に自動的にnfsディレクトリが出現します。
ということは、autofsを停止すると、nfsディレクトリは消滅します。
下記のコマンドでクリーンな停止になります。
# 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
これでクリーンになります。