剥いだ布団とメモランダム.old

情報系のことをかいてゆく

CentOSでNFS環境を整えた

研究室の方でCentOSのPCたちにNFSでデータ共有できるようにしてねって言われてやったメモ。
設定ファイル内のスペルミスで時間を食う羽目になってしまった。
あれって意外と便利なんですけどね、ファイアウォールとか色々考えると設定がちょっとね。

NFSってなに

ネットワークファイルシステム (network file system) とは、複数のホストがコンピュータネットワークを経由して共有しつつファイルにアクセスすることを可能にするファイルシステムである。複数のマシン上で複数のユーザーがファイルやストレージ資源を共有できるようにする。
wikipedia:分散ファイルシステムより

分散ファイルシステムとか言いますよね。
あるサーバの中身を他のサーバへコピーしたい時とか、
サーバ間で随時ファイルを共有したい時なんかに使ったりするみたい。

環境

研究室内のネットワーク(192.168.0.0/24)でつながっているPCでやった。
OS:CentOS 5.9
今回は192.168.0.4と192.168.0.5の間でマウントし合える設定した体で書いておきます。

インストールと設定

どういうわけか、PCの方にはもともとNFSが入っていた(?)ので、設定からはじめた。
(もしかしたら覚えていないだけかも…)
インストールは、

# yum install nfs-utils

でいいはず。portmapも入れる必要があるけども、この時一緒に入ると思う。
入らなかったら、portmapもインストール。

サーバの起動は、

# /etc/init.d/nfs start

とすれば、色々でて起動してくれる。

公開するディレクトリの設定

どのディレクトリをマウント許可にするかの設定。
/etc/exportsを編集することで設定できる。

今回は、/etc/exports4というディレクトリを読み書き可で公開したかったので、以下のようにした。

/etc/exports4/	192.168.0.0/24(rw)

公開ディレクトリ 公開先(オプション)
の順で記述する。

オプションには、

  • rw...読み書き可
  • ro...読み込みのみ
  • async...非同期更新(すぐに更新されない)
  • sync...すぐに更新を反映

などなど。ユーザに関するマッピングオプションなんかもあるけど省略。

/etc/exportsをいじったら、

# exportfs -r

で更新できる。

接続を許可するホストの設定

ディレクトリを公開する先をさっき決めたんだから、
接続を許可するホストをまたさらに設定しなくてもいいじゃないかとなるんだけども、
公開を許可していない相手にも接続要求があった段階で、相手にNFSデーモンの情報を伝えている。
なので最悪、NFSからシステムに侵入される可能性があるので、アクセス制御を行う。

TCPWrapperの機能が使えるので、/etc/host.allowでアクセスを許可するホストを指定する。

portmap lockd rquotad mountd statd: 192.168.0.0/255.255.255.0

NFSサービスには、
portmap, lockd, rquotad, mountd, statd
のデーモンが関わっているので、これらについて許可するホストを指定。

ファイアウォールのためにポートを固定

iptablesでファイアウォール環境を作っているので、NFS関係で使用するポートを通すように設定する必要がある。

/etc/sysconfig/nfsの設定

しかし、NFSに関わるデーモンのうち、mountd, statd, lockdが動的にポートを割り当てるようなので、それらのデーモンでポートを固定するように設定してやる。
(nfsdは2049 ,portmapは111を固定で使用)
/etc/sysconfig/nfsにポートを書いておいてやると、その設定で動いてくれる。

MOUNTD_PORT=2050
STATD_PORT=2051
LOCKD_TCPPORT=2052
LOCKD_UDPPORT=2052

今回はこんなかんじでポートを設定してみた。

/etc/sysconfig/iptablesの設定

ポートの固定化はできたので、固定したポートの通信を通すようにiptablesを設定する。
今回は以下の内容を追記して設定することにした。

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 111 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 111 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 2049 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 2049 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 2050 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 2050 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 2051 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 2051 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 2052 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 2052 -j ACCEPT

あとはiptabelsの内容を再読み込みさせれば、ok。

# /etc/init.d/iptables restart

設定の確認とNFSサーバの再起動

ひと通りの設定が終わったら、ポート周りとかの設定がしっかりできているか確認。
サーバ側とクライアント側で同じ設定になっていれば大丈夫。

# rpcinfo -p

を打ってやれば見れる。ここまで全く同じ設定であれば下のようになっているはず。
f:id:sheemaa:20131123012403p:plain

設定が大丈夫なことを確認したら、

# /etc.init.d/nfs restart

サーバを再起動して、設定を反映させる。

マウントしてみる

公開したディレクトリに対して、
クライアント(他のコンピュータ)からマウントしてみる。
クライアントの方から

# mountd -t nfs 192.168.0.4:/etc/exports4 /nfsdata

という形でコマンドを打つ。
(あらかじめ/nfsdataというディレクトリはmkdirした)

分かり易く書くとこんな感じ。

# mountd -t nfs NFSサーバアドレス:公開されているディレクトリ /マウントするディレクトリ

これで何もエラーがでなければマウントできる。
マウントできているかチェックするなら、

# df

を打って、マウントしているファイルシステムが出ていればいい。
実際にやってみるとこんなかんじでした。
f:id:sheemaa:20131123012443p:plain

192.168.0.4:/etc/exports4を/nfsdataへマウントできていることがわかる。

起動時に自動でマウントさせたければ、/etc/fstabに登録しておけばいいし、
アクセスがあった時だけ動的にマウントさせたければ、/etc/auto.miscをいじればいい。
(今回はやらなかったので、省略)

マウントを解除したい場合には、

# umount /etc/exports4

とクライアント側で打てばアンマウントできる。