#必要サービス
NFSを組むのに、以下の通り用途によって必要サービスが異なる。
用途 | portmap | nfsd | mountd |
---|---|---|---|
NFSクライアント | ◎ | ||
NFSサーバ | ◎ | ◎ | ◎ |
yum install nfs-utilsで一通りインストール可能。
#RPCの確認
クライアントがリモートにある記憶領域を使うための命令を送る必要がある。
その命令、システムコールをNW跨ぎで実行する技術をRPCという。
bashでたたかれたコマンドがリモートのサーバにて応答されるのはこのRPCのおかげということ。
昨今のWebAPIの利用時もサーバから別のサーバに対してコマンドをたたいてその応答を表示していたりする。そのときにもRPCは使われている。
/etc/rpcを見ると、NFSはRPC100003が使われるよう。
nfs 100003 nfsprog
RPCと接続ポートを対応させる必要がある。対応させるサービスをportmapと呼ぶ。
RPCはあくまでアプリケーション層のものでトランスポート層におけるTCP/UDPとの対応が必要って感じかな?
RPCとTCPの対応はrpcinfo - pで表示される。
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
デフォルトだと100003に対するマッピングはなされていないよう。
ただし、nfsサービスを起動すると、以下のようにNFSに関連するRPCとその対応するポートが表示された。
NFSのサービスを使ってNFSサーバへアクセスするときにNFSサービスとRPCをマッピングさせる機能なので、NFSサービスがないといけないのかな。クライアントからサーバにアクセスするときに必要な機能なので、そりゃクライアント側でサービス起動していないとマッピングもしないか。
rpcinfo -p
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 46603 status
100024 1 tcp 37560 status
100005 1 udp 20048 mountd
100005 1 tcp 20048 mountd
100005 2 udp 20048 mountd
100005 2 tcp 20048 mountd
100005 3 udp 20048 mountd
100005 3 tcp 20048 mountd
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049 nfs_acl
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 3 udp 2049 nfs_acl
100021 1 udp 45133 nlockmgr
100021 3 udp 45133 nlockmgr
100021 4 udp 45133 nlockmgr
100021 1 tcp 34228 nlockmgr
100021 3 tcp 34228 nlockmgr
100021 4 tcp 34228 nlockmgr
rpcinfoでNFSのRPCと特定のポートが紐づいてればOK.
#Portmapの役割
サービスが起動されたことを受けて、どうやってTCPポートをアサインしてるのか。
Portmapがになっている。
Portmapにおいて事前にアサインするポート範囲を定義しておき、その中から空いてるポート番号をアサインする。
アサインとその管理をPortmapサービスが行う。
つまり、PortmapはRPCサーバにおいて、サービス起動時にサービスから登録リクエストを受け取って、空きポート番号をアサインする。
RPCクライアントにおいてRPC接続リクエストを受け取ったportmapクライアントはPortmapサーバに接続ポート番号をヒアリング。そのヒアリング情報をもとRPC接続通信と接続TCPポートを紐づける。
このあたりの役割をPortampが果たしてる。
つまり下図の感じかな。
RPCの動作については、こちらを参考にした。
サービスは特に接続ポートを意識せずに通信が行えるのはこのportmapによるもののようだ。
#サーバ設定1<TCP Wrapper>
話が大きくそれたが、PortmapはTCP Wrapperを利用し、接続制御できる。
etc/hosts.allow,/etc/hosts.denyを駆使して制御するが、今回は割愛。
#サーバ設定2<exportfs>
ディレクトリ公開のために/etc/exportsをいじる。
/pub 192.168.0.0/255.255.0.0(rw)
上記によりサーバ上/pubディレクトリを192.168.0.0/24の送信元からのアクセスを許可し、そのアクセス時にはrwの権限を付与する意味となる。
TCP Wrapperではportampにおける接続制御でNFSとしての接続制御が/etc/exportfsという整理かな。
#クライアント設定
設定といってももうサーバの設定は完了してるので、実際にマウントするだけ。
mount -t nfs <サーバIP or hostname>:/pub /mnt -v
公開してる/pubを/mntディレクトリにマウントする。
-vはログが出力されるオプション
注意:サーバ側でfirewalldにてNFS通信をDENYしてる可能性がある。
実際そこにひっかかったので、systemctl stop firewalldなどで回避する。
#確認方法
クライアント側でdf -Tにてマウント状況を確認.
以下のようにFilesystemが見えてれば成功。
Filesystem Type 1K-blocks Used Available Use% Mounted on
<サーバIP>:/pub nfs4 17811456 1463296 16348160 9% /mnt
意外とすんなりいけるはず。