ここでは、Fedora(Linux)にNFS/Network File Systemサーバを構成し、Vine LinuxとNetBSDをNFSクライアントとして利用する方法について記します。
基本的にやることは同じなのですが、*BSD間でも、Linuxでも、また、それらのバージョンによっても各種サービスやコマンドの名称、その方法が若干異なる場合があります。
ネットワークを介した共有においては、各種デーモンが特定、または、自動割り当てされた任意の通信ポートを利用することがあり、こうしたRPC/Remote Procedure Callにおいては、通信ポートを動的に割り当てることができる[portmap](portmapper)や[rpcbind]デーモンが利用されるのが慣例となっています。
Fedoraでは、互換性はある(変換される)ものの、[portmap]がFedora 14から[rpcbind]に置き換えられているのでFedora 14含む以降でNFSv2/NFSv3を使用する場合には、[rpcbind]を起動しておくことになります。
Fedoraでは、各種サービスの起動/停止/再起動、再読み込みなどには、Fedora 14までは、(SysV互換モードにおけるUpstartの)[service]、Fedora 15からは、([systemd]の)[systemctl]コマンドに置き換えられ、サービスの有効化/無効化なども一部[systemctl]に移行したサービスもある模様も従来の[chkconfig]コマンドを使用できます。
Vine Linux 6.1時点では、ポートマッピングには、[rpcbind]、各種サービスの起動/停止/再起動、再読み込みなどでは、[service]コマンドを使用するようです。
ファイアウォールが有効な場合、NFS用デーモン[nfs]、マウント用デーモン[mountd]、NFSv2/NFSv3の場合、[rpcbind]のポートを開ける(信頼済みのサービスとして設定する)必要があります。
一時的、または、永続的にする設定ができるはずなので、そこは必要に応じて設定します。
Fedora 21においては、NFSやSambaサーバとする場合、SELinuxの設定上、それぞれ関連するサービス(NFSではnfsやrpcbind、mountdなど)を許可する必要がありました。
Fedora 21でNFSサーバを構成する1つの例としては、次のようにしたら利用可能となりました。
SELinux(Linuxカーネルに強制アクセス制御(MAC)機能を付加するモジュール)が導入されている場合には、NFSファイルシステムの読み書きをoffにしておきます。
FedoraでNFSサーバ(やNFSクライアント)を構成する場合には、[nfs-utils]パッケージが必要となるので[rpm -q ...]などで確認の上、なければ、インストールします。
[rpcinfo -p]を使うとRPCに関する起動中のサービスを確認することができます。
NFSサーバを構成するホスト(ここでは、Fedora)の[/etc/exports]ファイルに共有するNFSファイルシステム(ディレクトリ)と公開する先のIPアドレス(、または、ホスト名)にスラッシュ(/)、ネットマスク(、または、/16、/24などネットワークアドレスビット)から成るブロックをタブ区切りで指定しておきます。
この時、ネットマスクやネットワークアドレスビットがないと、また、ディレクトリとこれら情報の間をタブではなくスペースで区切ってしまうと、また、末尾に改行がないと、クライアント側でマウントする際に"no route to host"や"timed out"、場合によっては、無縁に見えるエラーに見舞われ、途方に暮れることがあるので記述方法は重要です。
Fedoraの場合、公開する先のIPアドレス(ホスト名)に続けて丸括弧内にro/rw、wdelay、root_squash/no_root_squash、no_subtree_checkなど複数ある場合にはカンマ区切りでオプションを指定することができるようになっています。
1行につき、共有ディレクトリは1つ、IPアドレス(ホスト名)は、複数ある場合には、それぞれスペースで区切って指定します。
複数のディレクトリを共有する際には、それぞれ一行ずつ指定しますが、その場合、それらのディレクトリは、別のファイルシステム(ドライブやパーティション)上にある必要があります。
[/etc/exports]ファイルの編集後には、これを反映させるため、[exportfs -r]/[exportfs -ra]/[exportfs -rv]を実行しておきます。
正しくマウントされているかを[showmount -e]で確認することができます。
IPアドレスとホスト名(ニックネーム)の名前解決のために、例えば、[/etc/hosts]ファイルで自ホストやクライアントのIPアドレスとホスト名をマッピング、また、適宜、[/etc/hosts.allow]、[/etc/hosts.deny]ファイルにアクセスを許可する/しないネットワークを設定しておきます。
今回、Fedora上のNFSサーバでは、[/etc/hosts.allow]に、[rpcbind]、[lockd]、[statd]、[mountd]の他、リモートマシンでNFSマウントされているローカルファイルシステムの、 あるユーザに対するquota/クォータ(割当)を返すrpcサーバデーモン[rquotad]をアクセスを許可するネットワークに対して設定してみました。
尚、Fedora 21におけるNFSは、NFSv4がデフォルトであり、NFSv4では、[rpcbind]は不要ですが、NFSクライアントがNFSv2/NFSv3を利用している場合には、[rpcbind]が必要となり、今回の検証のケースでは、NetBSDはこれに該当、Vineは該当しないものと思われますが、一応設定してあります。
SELinuxが導入されていてNFSファイルシステムの読み書きをoffにしておいた場合には、onにしておきます。
ちなみにRHEL、FedoraやCentOSなどRed Hat系では、[system-config-nfs]パッケージをインストールするとNFSサーバ設定用のGUI操作パネルを利用することができるようになります。
このスクリーンショットは、統合デスクトップ環境MATEにおいて[システム] > [システム管理]を選んでサブメニューを表示させ、そこに[System-Config-NFS]というメニューが追加されている様子と、これの選択により、NFSサーバ設定パネルが表示されている様子です。(便宜上、パネルを表示させた後、メニューを開いています。)
Vine LinuxでNFSクライアントを構成する場合には、[nfs-utils]パッケージが必要となるので[rpm -q nfs-utils]などで確認の上、なければ、インストールします。
NFSのバージョンが、NFSv2/NFSv3で[rpcbind]が起動していない場合には、[rpcbind]を起動しておきます。
IPアドレスとホスト名(ニックネーム)の名前解決のためにDNSを利用、または、[/etc/hosts]ファイルで自ホストやサーバのIPアドレスとホスト名をマッピングしておきます。
手動で共有するファイルシステム(ディレクトリ)を利用する場合には、[mount -t nfs ...]や[mount.nfs ...]でマウントします。
192.168.x.x:には適切なものを指定するものとする前提で名前解決できていれば、IPアドレスの代わりにホスト名(ホスト名.ドメイン名)を指定することもできます。
exportdirは、実際の環境に合わせたディレクトリを指定します。
思った通りにマウントできるまでは、手動でやってみるとよいでしょう。
起動時に常に共有する場合には、[/etc/fstab]ファイルに追記します。
NetBSDをNFSクライアントとして使う場合、特に追加で必要となるパッケージはなかったように思います。
NFSのバージョンが、NFSv2/NFSv3で[rpcbind]が起動していない場合には、[rpcbind]を起動しておきます。
マシン起動時に常時、NFSクライアントとして起動する場合には、[/etc/rc.conf]で[rpcbind]、[nfs_client]、[lockd]、[statd]に[yes]を設定し、追記しておきます。
さて早速マウント。。。と思ったら、当初、NetBSDをNFSクライアントとして(後述の解決策[-T]オプションを付けずに)NFS共有ディレクトリをマウントしてみるとプロンプトが一向に返ってこなくなり、[ps aux | grep mount]でPID確認後、[kill -9]しても停止できず、プロセスは残ったままでマシンを再起動する以外なくなりました。
[man mount_nfs]も見つつ、試行錯誤した上、「netbsd nfs mount」でネット検索した結果、LinkStationでNetBSDを試すの「非力なNFSサーバ(LinkStation)にたいし、高速なNFSクライアント(最近のパソコン全部)でUDPでmountとしているとおこる。」といった一文が目に止まり、訪問してみると先の一文に続いて「TCPで接続すると、よい。(NetBSDだとmount_nfs -T。)」とありました。
状況は違うように見えましたが、確かにNetBSDとNFSの話だし、常にTCP転送するものだと勝手に思い込んでいたものの、UDP転送することもあるのか(というか、それがデフォルト?なのか)。。。
確かに[man mount_nfs]には、[-T]オプションがあって「UDPの代わりにTCP転送を使用」、「よっぽど古くない限りは、サポートされるはずだよ」みたいなことも書いてあったよね。。。先の記事を読んだあとになってみれば、わざわざこんなオプションがあるということは。。。と思うに至り、やってみたら、なんと、あっさりマウントできました。。。何事も思い込みは禁物ですね・・・先のサイトには感謝です。
[man mount_nfs]だけでなく、改めて[man mount]を見てみると[-o]オプションに値[tcp]を渡すことができ、これは、[-T]オプションと同じとあるので[-T]ではなく、[tcp]としてもよいわけですね。
それにしても、これってNFSバージョンの違いからくるのかな?との思いから、更に「nfsv3 nfs over udp」で検索してみたら、Linux JFdocs NFS-HOWTO.txtに「ここでは NFS version 2 と 3、。。。NFSがTCPを使うかUDPを使うかによって、別々のサービスとしてリストされ。。。Linux システムは、特に TCP を使うべく指定されない限り、 UDP をデフォルトで用います。しかし Solarisのような他のOSでは、デフォルトはTCPになっています。」とありました。
というわけで[mount_nfs -T]と[mount -t nfs -o -T]の2通り試してみたら、どちらでも、あっさり、マウントすることができました。
今時点でNetBSDは7.0、Fedoraは23ですが、上記のようにしてもNFSクライアントであるNetBSDからNFSサーバであるFedoraにアクセスすることができなくなっている(NetBSDをNFSサーバ、FedoraをNFSクライアントとした逆のケースはできる)ことに気づきました。
この状況が、いつ頃からだったのか、いずれのOSによるものなのか、解決策があるのか否かは未確認ですが、SELinuxなどFedora側のセキュリティ関連に起因しているのかも?
尚、IPアドレス192.168.0.2やホスト名fedora(やホスト名.ドメイン名)には適切なものを指定し、これらの間で名前解決できている前提とし、exportdirは、実際の環境に合わせたディレクトリを指定するものとします。
ちなみにIPアドレスとホスト名(ニックネーム)の名前解決の1つの方法として[/etc/hosts]ファイルで自ホストやサーバのIPアドレスとホスト名をマッピングしておく方法があります。
尚、NetBSDは、NFSv2/NFSv3はサポート済みもNFSv4については、将来的に事情は変わるかもしれないけど一からコードを書くという素晴らしい考えは出てきそうもなく、それとは別にNFS共有ディレクトリへの接続が不安定な場合には、NFSではなく、AFS2ベースのCodaを推奨しているようです。
ちなみにNFSの通信は、互換性からより古いものに対応する仕様となっています。
今回の検証においてNFSサーバとして使ったFedora 21は、物理マシン(Pavilionの内蔵HDD故障によるHDD交換後にインストール、更にアップグレードしたもの、NFSクライアントとして使ったVine Linux 6.1は、Fedora 21上で仮想化ソフトウェアであるVirtualBox 4.3.20を使って起動した仮想マシンにインストール済みだったもの、NetBSD/i386 6.1.4は、Fedora 21上のVMware Player 6.0.3を使って起動した仮想マシンにインストール済みで後にアップグレードしたものを使用しました。
ちなみに各種仮想マシンに入れたVine LinuxとNetBSDは、Pavilionの内蔵HDD故障によるHDD交換前にWindows Vista上で作成してあったものです。
このようにホストOSを超えて共用できるのは便利です。