EC2上にNFSサーバ/クライアント構築する


## ゴール
EC2（Amazon Linux 2015.09）2台でNFSv4サーバ/クライアントを構成する。

## 環境


```
[root@ ec2-user]# cat /etc/issue
Amazon Linux AMI release 2015.09
Kernel \r on an \m

[root@ ec2-user]# yum list | grep nfs
libnfsidmap.i686                      0.25-11.10.amzn1              amzn-updates
libnfsidmap-devel.x86_64              0.25-11.10.amzn1              amzn-updates
nfs4-acl-tools.x86_64                 0.3.3-6.6.amzn1               amzn-main   ★NFSv4
texlive-mfnfss.noarch                 2:svn19410.0-27.21.amzn1      amzn-main   
texlive-mfnfss-doc.noarch             2:svn19410.0-27.21.amzn1      amzn-main   
texlive-psnfss.noarch                 2:svn23394.9.2a-27.21.amzn1   amzn-main   
texlive-psnfss-doc.noarch             2:svn23394.9.2a-27.21.amzn1   amzn-main
```

バージョンの確認は以下でも確認可能

```
■サーバ側
[root@ ec2-user]# nfsstat
Server rpc stats:
calls      badcalls   badclnt    badauth    xdrcall
333668     0          0          0          0       

Server nfs v4:
null         compound     
5         0% 333663   99% 

Server nfs v4 operations:
op0-unused   op1-unused   op2-future   access       close        commit       
0         0% 0         0% 0         0% 14487     1% 55895     5% 8182      0% 
create       delegpurge   delegreturn  getattr      getfh        link         
4815      0% 0         0% 0         0% 316697   31% 60736     6% 0         0% 
lock         lockt        locku        lookup       lookup_root  nverify      
0         0% 0         0% 0         0% 26        0% 0         0% 0         0% 
open         openattr     open_conf    open_dgrd    putfh        putpubfh     
55899     5% 0         0% 8         0% 0         0% 333377   33% 0         0% 
putrootfh    read         readdir      readlink     remove       rename       
5         0% 1         0% 8463      0% 0         0% 11        0% 0         0% 
renew        restorefh    savefh       secinfo      setattr      setcltid     
253       0% 0         0% 0         0% 8         0% 60703     6% 14        0% 
setcltidconf verify       write        rellockowner bc_ctl       bind_conn    
14        0% 0         0% 83786     8% 0         0% 0         0% 0         0% 
exchange_id  create_ses   destroy_ses  free_stateid getdirdeleg  getdevinfo   
0         0% 0         0% 0         0% 0         0% 0         0% 0         0% 
getdevlist   layoutcommit layoutget    layoutreturn secinfononam sequence     
0         0% 0         0% 0         0% 0         0% 0         0% 0         0% 
set_ssv      test_stateid want_deleg   destroy_clid reclaim_comp 
0         0% 0         0% 0         0% 0         0% 0         0% 

■クライアント側
[root@ ec2-user]# nfsstat
Client rpc stats:
calls      retrans    authrefrsh
333492     0          333492  

Client nfs v4:
null         read         write        commit       open         open_conf    
0         0% 0         0% 83785    25% 8182      2% 55893    16% 5         0% 
open_noat    open_dgrd    close        setattr      fsinfo       renew        
0         0% 0         0% 55890    16% 60701    18% 16        0% 173       0% 
setclntid    confirm      lock         lockt        locku        access       
9         0% 9         0% 0         0% 0         0% 0         0% 14469     4% 
getattr      lookup       lookup_root  remove       rename       link         
40993    12% 21        0% 4         0% 9         0% 0         0% 0         0% 
symlink      create       pathconf     statfs       readlink     readdir      
0         0% 4815      1% 12        0% 10        0% 0         0% 8456      2% 
server_caps  delegreturn  getacl       setacl       fs_locations rel_lkowner  
28        0% 0         0% 0         0% 0         0% 0         0% 0         0% 
secinfo      exchange_id  create_ses   destroy_ses  sequence     get_lease_t  
8         0% 0         0% 0         0% 0         0% 0         0% 0         0% 
reclaim_comp layoutget    getdevinfo   layoutcommit layoutreturn getdevlist   
0         0% 0         0% 0         0% 0         0% 0         0% 0         0% 
(null)       
0         0% 
```

## サーバ構築
■EC2のセキュリティグループ設定
インバウンドの設定でNFSサーバのポートをローカルセグメントからのみ許可する。
※デフォルトでは「2049/tcp」

■rootユーザにスイッチ

```
[ec2-user@NFS_SERVER ~]$ sudo -s
[root@ ec2-user]# 
```

■共有する為のボリューム作成
NFSサーバが提供するボリュームは、ルートボリューム(/)を利用する事もできるが、スナップショットの取得などを考慮し、EBSでボリュームを作成しアタッチ及びマウントする。

```
[root@ ec2-user]# lsblk
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
xvda    202:0    0    8G  0 disk 
└─xvda1 202:1    0    8G  0 part /
xvdf    202:80   0  100G  0 disk　★アタッチされている事を確認

[root@ ec2-user]# mkfs -t ext4 /dev/xvdf

[root@ ec2-user]# vi /etc/fstab 
#
LABEL=/     /           ext4    defaults,noatime  1   1
tmpfs       /dev/shm    tmpfs   defaults        0   0
devpts      /dev/pts    devpts  gid=5,mode=620  0   0
sysfs       /sys        sysfs   defaults        0   0
proc        /proc       proc    defaults        0   0
/dev/xvdf   /export/nfs ext4    defaults,nofail  1   2 ★追加

[root@ ec2-user]# mkdir -p /export/nfs

[root@ ec2-user]# mount /export/nfs

[root@ ec2-user]# lsblk
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
xvda    202:0    0    8G  0 disk 
└─xvda1 202:1    0    8G  0 part /
xvdf    202:80   0  100G  0 disk /export/nfs ★マウント済み

[root@ ec2-user]# df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/xvda1       7.8G  1.1G  6.6G   15% /
devtmpfs         489M   60K  489M    1% /dev
tmpfs            498M     0  498M    0% /dev/shm
/dev/xvdf         99G  6.8G   87G    8% /export/nfs ★マウント済み
```

■exportポイント設定（クライアントに共有するボリュームの設定）

```
[root@ ec2-user]# vi /etc/exports
/export/nfs 10.0.0.0/255.255.0.0(rw,no_root_squash)

※②③をセットとして複数の対象に異なるオプションで共有可能
①/export/nfs : 共有するディレクトリパス
②10.0.0.0/255.255.255.0.0 : 共有可能なネットワーク範囲（ホスト指定可）
③(rw,no_root_squash) : オプション（rw:読み書き可、no_root_squash:クライアントのroot権をサーバ側でも適用）

※exportfsコマンドでも設定可能
```

■サービス開始

```
[root@ ec2-user]# service --status-all | grep nfs
/export/nfs
nfsd is stopped

[root@ ec2-user]# service nfs start
Starting NFS services:                                     [  OK  ]
Starting NFS quotas:                                       [  OK  ]
Starting NFS mountd:                                       [  OK  ]
Starting NFS daemon:                                       [  OK  ]
Starting RPC idmapd:                                       [  OK  ]

[root@ ec2-user]# service --status-all | grep nfs
/export/nfs
nfsd (pid 3533 3532 3531 3530 3529 3528 3527 3526) is running...

※デーモン起動済みの場合は以下のコマンドで設定を有効化
[root@ ec2-user]# exportfs -ar
```

■exportポイント設定有効化確認

```
[root@ ec2-user]# exportfs -v
/export/nfs
		10.0.0.0/255.255.0.0(rw,wdelay,no_root_squash,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
※デフォルト値を含む設定していないオプションも確認可

[root@ ec2-user]# showmount -e
Export list for ip-10-0-0-xxx:
/export/nfs 10.0.0.0/255.255.0.0
```

■自動起動/停止設定（ランレベル3〜5で有効化）

```
[root@ ec2-user]# chkconfig --list | grep nfs
nfs            	0:off	1:off	2:off	3:off	4:off	5:off	6:off
…

[root@ ec2-user]# chkconfig --level 345 nfs on

[root@ ec2-user]# chkconfig --list | grep nfs
nfs            	0:off	1:off	2:off	3:on	4:on	5:on	6:off
…
```

NFSv4以降はportmap、rpcbind、nfslockは不要


## クライアント
■rootユーザにスイッチ

```
[ec2-user@NFS_CLIENT ~]$ sudo -s
[root@ ec2-user]# 
```

■nfsマウントに必要なライブラリ（mountコマンドのhelperなど）をインストール

```
[root@ ec2-user]# yum install nfs-utils nfs-utils-lib
```

■アクセス用ユーザ設定（例としてec2-userにグループ設定を追加）

```
[root@ ec2-user]# groupmod -g 1001 nfs
[root@ ec2-user]# usermod -G wheel,nfs ec2-user
※既に別のサブグループに所属している場合は、所属済みのグループの最後に指定する。
[root@ ec2-user]# id ec2-user
uid=500(ec2-user) gid=500(ec2-user) groups=500(ec2-user),10(wheel),1001(nfs)
```

■マウントポイント作成

```
[root@ ec2-user]# mkdir -p -m 775 /mnt/nfs
```

■アクセス用の所有権設定（ここではnfsグループに対して許可）

```
[root@ ec2-user]# chown root:nfs /mnt/nfs
```

■マウントポイントの設定

```
[root@ data_nfs]# cat /etc/fstab
#
LABEL=/     /           ext4    defaults,noatime  1   1
tmpfs       /dev/shm    tmpfs   defaults        0   0
devpts      /dev/pts    devpts  gid=5,mode=620  0   0
sysfs       /sys        sysfs   defaults        0   0
proc        /proc       proc    defaults        0   0
10.0.0.X:/export/nfs /mnt/nfs nfs4 defaults 0 0
```

※IPは環境に合わせて設定

■マウント

```
[root@ ec2-user]# mount /mnt/nfs
```

■確認

```
[root@ ec2-user]# df -h
Filesystem                  Size  Used Avail Use% Mounted on
/dev/xvda1                   50G   29G   21G  59% /
devtmpfs                    3.9G   76K  3.9G   1% /dev
tmpfs                       4.0G     0  4.0G   0% /dev/shm
s3fs                        256T     0  256T   0% /data_s3fs
10.0.0.X:/export/nfs   99G  6.8G   87G   8% /mnt/nfs
```

## 参考URL
https://docs.oracle.com/cd/E39368_01/e48214/ol_about_nfs.html
http://linux.kororo.jp/cont/server/nfs.php
http://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-rg-ja-4/s1-nfs-start.html
http://kaede.blog.abk.nu/nfs-ports-lock