nfsとは(Network File System)の略で、nfsサーバにあるパス(ディレクトリ)を他のLinux/UNIXで参照や更新できます。
クライアントがWindows等であれば「sambaサーバ『ファイルサーバの構築(Samba)』」、Linux/UNIXであれば「nfsサーバ」という位置付けになっている様です。
# yum -y install nfs-utils |
上記の図のように、nfsサーバに「/export/www」「/export/mail」「/export/common」ディレクトリを共有してnfsクライアントにそのディレクトリへの権限を設定します。
図内の表が、その共有ディレクトリへの対応表を示しており、ヘッダ部分はnfsクライアントのホスト名となっています。
共有ディレクトリを作成 # mkdir -p /export/www # mkdir -p /export/mail # mkdir -p /export/common オーナ・グループ設定 # chown -R nfsnobody:nfsnobody /export 「オーナ・グループ」は後述するが、「nfsnobody」と言うデフォルトの匿名とさせる。 |
nfs設定ファイルの設定 # vi /etc/exports 「/export/www」の設定 /export/www web(rw,all_squash,sync) develop(rw,all_squash,sync) client(ro,all_squash,sync) 「/export/mail」の設定 /export/mail smtp(rw,all_squash,sync) pop(rw,all_squash,sync) develop(rw,all_squash,sync) client(ro,all_squash,sync) 「/export/common」の設定 /export/common develop(rw,all_squash,sync) client(rw,all_squash,sync) nfs設定ファイル「/etc/exports」の共有ディレクトリの設定は以下の書式となっています。 <directory> <client>(<option>) [<client>(<option>)] ・・・ directory:共有するディレクトリ client :許可するホスト名またはFQDN(ドメイン名)またはネットワーク指定 例) hogehoge <-- ホスト名指定 hogehoge.kajuhome.com <-- FQDN指定 *.kajuhome.com <-- ワイルドカードによるドメイン名指定 192.168.1.0/24 <-- ネットワーク指定 option :nfsクライアントに対するオプション かなりの数があるので、代表的なオプションを示す。 rw 読書き可 ro 読み取りのみ sync 遅延書き込みの有効 root_squash rootユーザの場合、匿名ユーザにする no_root_squash rootユーザの場合、そのままの権限でアクセスさせる all_squash すべてのユーザを、匿名ユーザにする no_all_squash そのままのユーザ(ID番号)でアクセスさせる anonuid=nn nfsサーバのUIDにマッピングさせる(nnはID番号) anongid=nn nfsサーバのGIDにマッピングさせる(nnはID番号) *:匿名ユーザとは、nfsクライアントから書き込まれたファイルやディレクトリ の所有者・グループがデフォルトの「nfsnobody」となります。 備考1)「/export/common」を例にとりますが、以下の設定でも可能です 例1) ホスト名とFQDNでの設定 /export/common develop(rw,all_squash,sync) client.kajuhome.com(rw,all_squash,sync) 例2) FQDNとIPアドレスでの設定 /export/common develop.kajuhome.com(rw,all_squash,sync) 192.168.1.104(rw,all_squash,sync) 備考2)『nfsの設定』の図には準拠しませんが、192.168.1のセグメント全てに許可を与えることも可能です。 例)ネットワーク設定 /export/common 192.168.1.0/24(rw,all_squash,sync) 備考3)「rw (読書き可)」にも拘わらずクライアントから書込できない場合は、nfsサーバ側の「nfsnobody」UID:GIDを指定。 「nfsnobody」のUID確認 # cat /etc/passwd | grep nfsnobody nfsnobody:x:4294967294:4294967294:Anonymous NFS User:/var/lib/nfs:/sbin/nologin 「nfsnobody」のGID確認 # cat /etc/group | grep nfsnobody nfsnobody:x:4294967294: 例) /export/common develop(rw,all_squash,sync,anonuid=4294967294,anongid=4294967294) client(rw,all_squash,sync,anonuid=4294967294,anongid=4294967294) |
portmapを起動する # /etc/rc.d/init.d/portmap start *:「portmap」がインストールされていない場合は以下のコマンドでインストールして下さい # yum -y install portmap nfsを起動する # /etc/rc.d/init.d/nfs start portmapを起動しなかった場合、以下のエラーメッセージが出力されます。 # /etc/rc.d/init.d/nfs start NFS サービスを起動中: [ OK ] NFS クォータを起動中: サービスを登録できません: RPC: 受け取れません; errno = 接続を拒否されました rpc.rquotad: unable to register (RQUOTAPROG, RQUOTAVERS, udp). [失敗] NFS デーモンを起動中: [失敗] NFS mountd を起動中: Cannot register service: RPC: Unable to receive; errno = Connection refused [失敗] RPC idmapd を起動中: [ OK ] |
rpcbindを起動する 【Fedora7 から Fedora15 / CentOS6 の場合】 # /etc/rc.d/init.d/rpcbind start 【Fedora16以降 の場合】 # systemctl start rpcbind.service 「rpcbind」がインストールされていない場合は以下のコマンドでインストールして下さい # yum -y install rpcbind nfsを起動する 【Fedora7 から Fedora15 / CentOS6 の場合】 # /etc/rc.d/init.d/nfs start 【Fedora16以降 の場合】 # systemctl start nfs-server.service rpcbindを起動しなかった場合、以下のエラーメッセージが出力されます。 # /etc/rc.d/init.d/nfs start NFS サービスを起動中: [ OK ] NFS クォータを起動中: サービスを登録できません: RPC: 受け取れません; errno = 接続を拒否されました rpc.rquotad: unable to register (RQUOTAPROG, RQUOTAVERS, udp). [失敗] NFS デーモンを起動中: [失敗] |
nfsサーバ起動後にnfs設定ファイル「/etc/exports」を変更した場合は以下のコマンドで可能です。 *:nfsサービスを再起動する必要はありません # exportfs -ra *:コマンド実行時に下記の様にメッセージ出力した場合は、クライアントの名前解決する必要があります。 hosts ファイルや DNS サーバを構築して、クライアント(web develop client smtp pop)を名前解決します。 注:FQDNやショート名にご注意ください。 # exportfs -ra exportfs: Failed to resolve web exportfs: Failed to resolve web exportfs: Failed to resolve develop exportfs: Failed to resolve develop exportfs: Failed to resolve client exportfs: Failed to resolve client exportfs: Failed to resolve smtp exportfs: Failed to resolve smtp exportfs: Failed to resolve pop exportfs: Failed to resolve pop exportfs: Failed to resolve develop exportfs: Failed to resolve develop exportfs: Failed to resolve client exportfs: Failed to resolve client exportfs: Failed to resolve develop exportfs: Failed to resolve develop exportfs: Failed to resolve client exportfs: Failed to resolve client nfs のバージョンによって以下のメッセージの場合もあります。 exportfs: web has non-inet addr exportfs: web has non-inet addr exportfs: develop has non-inet addr exportfs: develop has non-inet addr exportfs: client has non-inet addr exportfs: client has non-inet addr exportfs: smtp has non-inet addr exportfs: smtp has non-inet addr exportfs: pop has non-inet addr exportfs: pop has non-inet addr exportfs: develop has non-inet addr exportfs: develop has non-inet addr exportfs: client has non-inet addr exportfs: client has non-inet addr exportfs: develop has non-inet addr exportfs: develop has non-inet addr exportfs: client has non-inet addr exportfs: client has non-inet addr 現在のエクスポートリストを表示 # exportfs -v /export/common develop(rw,wdelay,root_squash,all_squash) /export/common client(rw,wdelay,root_squash,all_squash) /export/mail smtp(rw,wdelay,root_squash,all_squash) /export/mail pop(rw,wdelay,root_squash,all_squash) /export/mail develop(rw,wdelay,root_squash,all_squash) /export/mail client(ro,wdelay,root_squash,all_squash) /export/www web(rw,wdelay,root_squash,all_squash) /export/www develop(rw,wdelay,root_squash,all_squash) /export/www client(ro,wdelay,root_squash,all_squash) |
マウント先を作成する # mkdir /mnt/xxxxx ディレクトリ名は任意です。 上記は説明上「/mnt/xxxxx」となっていますので、必要に応じてマウント先を作成して下さい。 以降のnfsクライアントのマウント先は、適当なディレクトリを作成済みとしています。 nfsサーバの共有ディレクトリをマウントする *:mountコマンドのパラメータ mount <ファイルシステムタイプ> <nfsサーバ:共有名> <マウント先> 【web.kajuhome.com の場合】 # mount -t nfs fedora.kajuhome.com:/export/www /mnt/www 【smtp.kajuhome.com および pop.kajuhome.com の場合】 # mount -t nfs fedora.kajuhome.com:/export/mail /mnt/mail 【develop.kajuhome.com および client.kajuhome.com の場合】 # mount -t nfs fedora.kajuhome.com:/export/www /mnt/www # mount -t nfs fedora.kajuhome.com:/export/mail /mnt/mail # mount -t nfs fedora.kajuhome.com:/export/common /mnt/common |
以下の様にマウント時エラーが発生する場合 # mount -t nfs fedora.kajuhome.com:/export/xxxxx /mnt/xxxxx mount.nfs: rpc.statd is not running but is required for remote locking. mount.nfs: Either use '-o nolock' to keep locks local, or start statd. mount.nfs: an incorrect mount option was specified クライアント側でポートマッピングサービス「portmap」または「rpcbind」を起動する必要があります。 # /etc/rc.d/init.d/portmap start または # /etc/rc.d/init.d/rpcbind start systemd services 系の場合のサービス起動は以下(例:rpcbind) # systemctl start rpcbind.service *:何れのサービスかは上記のサーバサービス起動時のディストリビューション参照の事 |
上記の動作確認を全て説明しても意味がないので、「rw権」「ro権」の両方が存在する「client.kajuhome.com」に絞って説明します。
「ro」権の共有ディレクトリに試験ファイルを作成し保存してみる # vi /mnt/www/client.dat 1234567890 abcdefghijklmnopqrstuvwxyz 「:wq」コマンドで保存 "/mnt/www/client.dat" "/mnt/www/client.dat" E212: 書込み用にファイルを開けません 続けるにはENTERを押すかコマンドを入力してください 上記の様にメッセージ出力され、保存できない事が確認できる 「rw」権の共有ディレクトリに試験ファイルを作成し保存してみる # vi /mnt/common/client.dat 1234567890 abcdefghijklmnopqrstuvwxyz 「:wq」コマンドで保存 作成できているか確認 # ls -l /mnt/common/client.dat -rw-r--r-- 1 nfsnobody nfsnobody 38 2月 16 16:04 /mnt/common/client.dat |
『nfsクライアントでの動作確認』で保存した「client.dat」を確認してみる # cat /export/common/client.dat 1234567890 abcdefghijklmnopqrstuvwxyz nfsクライアントで作成した内容を確認できた *:同様にnfsサーバで作成したファイルが、nfsクライアントで確認できるかも検証してみてください。 「rw」権があるnfsクライアントは、作成されたファイルが確認できて保存も可能であること。 「ro」権のnfsクライアントは、作成されたファイルが確認(読み取りのみ)できること。 |
nfsサーバ側で、接続元のホスト名(IPアドレス)を限定する事によりセキュリティを高めます。
デフォルト状態では全てのホストよりportmap使用許可されているので注意して下さい。
接続拒否設定 # vi /etc/hosts.deny # # hosts.deny This file describes the names of the hosts which are # *not* allowed to use the local INET services, as decided # by the '/usr/sbin/tcpd' server. # # The portmap line is redundant, but it is left to remind you that # the new secure portmap uses hosts.deny and hosts.allow. In particular # you should know that NFS uses portmap! portmap: ALL 接続許可設定 # vi /etc/hosts.allow # # hosts.allow This file describes the names of the hosts which are # allowed to use the local INET services, as decided # by the '/usr/sbin/tcpd' server. # 接続許可をローカルネットワークに限定する portmap: 192.168.1.0/255.255.255.0 |
起動時に portmap または rpcbind を起動する 【FC1 / FC2 / FC3 / FC4 / FC5 / FC6 / CentOS4 / CentOS5 の場合】 # chkconfig portmap on 設定内容を確認 # chkconfig --list portmap portmap 0:off 1:off 2:on 3:on 4:on 5:on 6:off 【Fedora7 から Fedora15 / CentOS6 の場合】 # chkconfig rpcbind on 設定内容を確認 # chkconfig --list rpcbind rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off 【Fedora16以降 の場合】 # systemctl enable rpcbind.service 設定内容を確認 # systemctl status rpcbind.service rpcbind.service - RPC bind service Loaded: loaded (/lib/systemd/system/rpcbind.service; enabled) Active: active (running) since Thu, 17 Nov 2011 08:42:56 +0900; 2h 3min ago Main PID: 989 (rpcbind) CGroup: name=systemd:/system/rpcbind.service └ 989 /sbin/rpcbind -w 起動時にnfsを起動する 【FC1 から Fedora15 / CentOS4 / CentOS5 / CentOS6 の場合】 # chkconfig nfs on 設定内容を確認 # chkconfig --list nfs nfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off 【Fedora16以降 の場合】 # systemctl enable nfs-server.service 設定内容を確認 # systemctl status nfs-server.service nfs-server.service - NFS Server Loaded: loaded (/lib/systemd/system/nfs-server.service; enabled) Active: active (running) since Thu, 17 Nov 2011 10:36:10 +0900; 13min ago Main PID: 7156 (rpc.rquotad) CGroup: name=systemd:/system/nfs-server.service ├ 7156 /usr/sbin/rpc.rquotad └ 7171 /usr/sbin/rpc.mountd |
nfsサービス起動時に以下のメッセージが出力される場合 NFSサービスを起動中: exportfs: /etc/exports:1: syntax error: bad option list [失敗] 「/etc/exports」に設定した内容が構文エラーです。内容を確認してください。 NFS サービスを起動中: [ OK ] NFS クォータを起動中: サービスを登録できません: RPC: 受け取れません; errno = 接続を拒否されました rpc.rquotad: unable to register (RQUOTAPROG, RQUOTAVERS, udp). [失敗] NFS デーモンを起動中: [失敗] NFS mountd を起動中: Cannot register service: RPC: Unable to receive; errno = Connection refused [失敗] RPC idmapd を起動中: [ OK ] 『nfsの起動』でも触れましたが、「portmap」サービスを起動していない為です。 「# /etc/rc.d/init.d/portmap start」を実行してサービスを起動後に「nfs」サービスを起動してください。 nfsクライアントでマウント時に以下のメッセージが出力される場合 mount: mount to NFS server 'fedora.kajuhome.com' failed: RPC Error: プログラムが登録されていません. nfsサーバ側で「nfs」サービスが起動していません。「nfs」サービスを起動してください。 mount: fedora.kajuhome.com:/export/www failed, reason given by server: 許可がありません nfsサーバのnfs設定ファイル「/etc/exports」に要求してきたnfsクライアントが定義されていない。 または、共有するディレクトリ名が誤っていかのどちらかです。 nfsクライアントでマウント後、アクセスできない場合 nfsサーバの共有ディレクトリのアクセス権を確認する。 |