見出し画像

NFS エクスポートしてみた

前回、2 回に分けて Samba サーバーの環境構築について投稿しました。今日は、NFS サーバーを立ててみます。

/etc/exports

LPIC Lv.2 のあずき本によると、NFS サーバーで特定のディレクトリを公開することをエクスポートというそうです。エクスポートというと、輸出とか書き出し専用をイメージしますが、/etc/exports に記述するとのこと。

AWS で NFS サーバーというと、Amazon EFS が一般的かと思いますが、今日は Amazon EC2 に NFS サーバー機能をインストールして検証してみます。

事前準備

Amazon EC2 インスタンスを追加する

前回構築した Samba サーバーの横に NFS 用の EC2 インスタンスを追加します。

セキュリティグループ「sg_ec2-nfs」を追加してアタッチしました。VPC 内のsべてのプライベート IP に対して、SSH (22) と NFS (2049) のポートを開放しています。

それ以外は Samba サーバーと同様なので、不明な方がいらっしゃれば Samba の投稿 を参考にしてください。

インスタンスが起動したら、yum update をしておきました。

PS C:\Users\Administrator> ssh -i C:\Users\Administrator\Desktop\XXXXX.pem ec2-user@172.29.2.45
The authenticity of host '172.29.2.45 (172.29.2.45)' can't be established.
ECDSA key fingerprint is SHA256:Wwuy9YCyBYIzz7IN6r07eCEgX0dZonIloHN3lZQM5L0.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '172.29.2.45' (ECDSA) to the list of known hosts.

   __|  __|_  )
   _|  (     /   Amazon Linux 2 AMI
  ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
2 package(s) needed for security, out of 6 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-172-29-2-45 ~]$
[ec2-user@ip-172-29-2-45 ~]$ sudo yum -y update
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
amzn2-core

(中略)

Installed:kernel.x86_64 0:5.10.112-108.499.amzn2

Updated:
  curl.x86_64 0:7.79.1-2.amzn2.0.1.              iproute.x86_64 0:5.10.0-2.amzn2.0.2
  kernel-tools.x86_64 0:5.10.112-108.499.amzn2   libcurl.x86_64 0:7.79.1-2.amzn2.0.1
  openldap.x86_64 0:2.4.44-23.amzn2.0.4

Complete!
[ec2-user@ip-172-29-2-45 ~]$

EBS ボリュームを追加する

こちらの記事を拝見してルートボリューム以外で提供すべきと感じたので、EBS ボリュームも追加しておきます。

EC2 コンソールから、左側のメニューペインにあるボリュームを開き、[ボリュームの作成] ボタンをクリックします。

EBS ボリュームはサイズを大きくするのは簡単ですが、小さくする場合は作り直しなので 10GiB でスモールスタートします。

Name タグを付けてボリュームを作成しました。

利用可能になったら、ボリュームを選択して [アクション] から [ボリュームのアタッチ] を選択します。

アタッチする際にインフォメーションが表示されている通り、ここでつけた名前が OS 上でそのまま認識されるわけでないです。

ここで入力された (および詳細情報に表示される) デバイス名が /dev/sdf から /dev/sdp であっても、新しい Linux カーネルによっては内部でデバイスの名前が /dev/xvdf から /dev/xvdp に変更されることがあります。

アタッチ前はこちら。

[ec2-user@ip-172-29-2-45 ~]$ lsblk
NAME          MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1       259:0    0   8G  0 disk
├─nvme0n1p1   259:1    0   8G  0 part /
└─nvme0n1p128 259:2    0   1M  0 part
[ec2-user@ip-172-29-2-45 ~]$

アタッチ後は、10G の nvme1n1 が追加されました。

[ec2-user@ip-172-29-2-45 ~]$ lsblk
NAME          MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1       259:0    0   8G  0 disk
├─nvme0n1p1   259:1    0   8G  0 part /
└─nvme0n1p128 259:2    0   1M  0 part
nvme1n1       259:3    0  10G  0 disk
[ec2-user@ip-172-29-2-45 ~]$

nvme1n1 を ext4 としてフォーマットします。

[ec2-user@ip-172-29-2-230 ~]$ sudo mkfs -t ext4 /dev/nvme1n1
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2621440 blocks
131072 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2151677952
80 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

[ec2-user@ip-172-29-2-230 ~]$

その後、/share としてマウントしました。

[ec2-user@ip-172-29-2-45 ~]$ sudo vi /etc/fstab

/dev/nvme1n1   /share ext4    defaults,nofail  1   2


[ec2-user@ip-172-29-2-45 ~]$ sudo mkdir -p /share
[ec2-user@ip-172-29-2-45 ~]$ sudo mount /share
[ec2-user@ip-172-29-2-45 ~]$
[ec2-user@ip-172-29-2-45 ~]$ lsblk
NAME          MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme1n1       259:0    0  10G  0 disk /share
nvme0n1       259:1    0   8G  0 disk
├─nvme0n1p1   259:2    0   8G  0 part /
└─nvme0n1p128 259:3    0   1M  0 part
[ec2-user@ip-172-29-2-45 ~]$

正常に動作するか、reboot もしておきました。

[ec2-user@ip-172-29-2-45 ~]$ sudo reboot
Connection to 172.29.2.45 closed by remote host.
Connection to 172.29.2.45 closed.
PS C:\Users\Administrator>
PS C:\Users\Administrator> ssh -i C:\Users\Administrator\Desktop\XXXX.pem ec2-user@172.29.2.45
Last login: Sat Jun  4 08:03:50 2022 from ip-172-29-2-133.ap-northeast-1.compute.internal

   __|  __|_  )
   _|  (     /   Amazon Linux 2 AMI
  ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-172-29-2-230 ~]$
[ec2-user@ip-172-29-2-45 ~]$ uptime
 08:13:29 up 1 min,  1 user,  load average: 0.26, 0.20, 0.08
[ec2-user@ip-172-29-2-45 ~]$

認識していました。

[ec2-user@ip-172-29-2-45 ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        462M     0  462M   0% /dev
tmpfs           471M     0  471M   0% /dev/shm
tmpfs           471M  412K  470M   1% /run
tmpfs           471M     0  471M   0% /sys/fs/cgroup
/dev/nvme0n1p1  8.0G  1.7G  6.4G  21% /
/dev/nvme1n1    9.8G   37M  9.2G   1% /export/nfs
tmpfs            95M     0   95M   0% /run/user/1000
[ec2-user@ip-172-29-2-45 ~]$

NFS の設定

それでは、本日のメインテーマである NFS の設定を確認していきます。

export ポイントの設定

共有ディレクトリを /etc/exports にて設定します。
まずは、あずき本 437 ページに記載されている設定を試してみました。/share ディレクトリ以下を、172.29.0.0/22 のホストすべてに対して読み書き可能にするとのこと。

※ 後述していますが、設定間違いしています。○ exports / × export

[ec2-user@ip-172-29-2-45 ~]$ sudo vi /etc/export


/share 172.29.0.0/255.255.64.0(rw,no_root_squash)

nfs サービスを起動してみました。

[ec2-user@ip-172-29-2-45 ~]$ sudo systemctl start nfs

クライアントから接続

nfs サーバー側は準備が整いました。次はクライアントから接続を試します。
Samba サーバーに SSH 接続して、マウントポイントを作成しました。

[ec2-user@ip-172-29-2-230 ~]$ sudo mkdir -p -m 775 /mnt/nfs
[ec2-user@ip-172-29-2-230 ~]$

次に、あずき本 442 ページを参考に fstab に以下を追記しました。

[ec2-user@ip-172-29-2-230 ~]$ sudo vi /etc/fstab


172.29.2.45:/share /mnt/nfs nfs4 rw 0 0

マウントを試しましたが、Access Denied エラーになりました。root マウントなら問題なさそうでしたが。。

[ec2-user@ip-172-29-2-230 ~]$ sudo mount /mnt/nfs
mount.nfs4: access denied by server while mounting 172.29.2.45:/share
[ec2-user@ip-172-29-2-230 ~]$

/etc/export で、all_squash に変更してみましたが、状況は変わりませんでした。

[ec2-user@ip-172-29-2-45 ~]$ systemctl status nfs
● nfs-server.service - NFS server and services
  Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
  Active: active (exited) since Sat 2022-06-04 09:16:33 UTC; 3min 55s ago
  Process: 2674 ExecStopPost=/usr/sbin/exportfs -f (code=exited, status=0/SUCCESS)
  Process: 2671 ExecStopPost=/usr/sbin/exportfs -au (code=exited, status=0/SUCCESS)
  Process: 2669 ExecStop=/usr/sbin/rpc.nfsd 0 (code=exited, status=0/SUCCESS)
  Process: 2695 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, status=0/SUCCESS)
  Process: 2690 ExecStartPre=/bin/sh -c /bin/kill -HUP `cat /run/gssproxy.pid` (code=exited, status=0/SUCCESS)
  Process: 2688 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
 Main PID: 2695 (code=exited, status=0/SUCCESS)
  CGroup: /system.slice/nfs-server.service

Jun 04 09:16:32 ip-172-29-2-45.ap-northeast-1.compute.internal systemd[1]: Starting NFS server and services...
Jun 04 09:16:33 ip-172-29-2-45.ap-northeast-1.compute.internal systemd[1]: Started NFS server and services.
[ec2-user@ip-172-29-2-45 ~]$
[ec2-user@ip-172-29-2-45 ~]$ systemctl status nfslock
● rpc-statd.service - NFS status monitor for NFSv2/3 locking.
  Loaded: loaded (/usr/lib/systemd/system/rpc-statd.service; static; vendor preset: disabled)
  Active: active (running) since Sat 2022-06-04 09:04:19 UTC; 16min ago
  Process: 2554 ExecStart=/usr/sbin/rpc.statd $STATDARGS (code=exited, status=0/SUCCESS)
 Main PID: 2559 (rpc.statd)
  CGroup: /system.slice/rpc-statd.service
    └─2559 /usr/sbin/rpc.statd
  Jun 04 09:04:19 ip-172-29-2-45.ap-northeast-1.compute.internal systemd[1]: Starting NFS status monitor for NFSv2/3 .....
  Jun 04 09:04:19 ip-172-29-2-45.ap-northeast-1.compute.internal rpc.statd[2559]: Version 1.3.0 starting
  Jun 04 09:04:19 ip-172-29-2-45.ap-northeast-1.compute.internal rpc.statd[2559]: Flags: TI-RPC
  Jun 04 09:04:19 ip-172-29-2-45.ap-northeast-1.compute.internal rpc.statd[2559]: Initializing NSM state
  Jun 04 09:04:19 ip-172-29-2-45.ap-northeast-1.compute.internal systemd[1]: Started NFS status monitor for NFSv2/3 l.....
  Hint: Some lines were ellipsized, use -l to show in full.
[ec2-user@ip-172-29-2-45 ~]$

exportfs コマンドで設定変更を反映

あずき本 439 ページに記載の showmount -e で、指定したホストでエクスポートしているディレクトリが表示されるとのことですが、何もありませんでした。

[ec2-user@ip-172-29-2-45 ~]$ showmount -e
Export list for ip-172-29-2-45.ap-northeast-1.compute.internal:
[ec2-user@ip-172-29-2-45 ~]$

もう一度上から手順を見返していくと、/etc/exports ではなく、/etc/export に設定をしていることに気づきました。

[ec2-user@ip-172-29-2-45 ~]$ sudo vi /etc/exports

/share 172.29.0.0/255.255.64.0(rw,no_root_squash)

exportfs コマンドで再読み込みできるとのこと。

[ec2-user@ip-172-29-2-45 ~]$ sudo exportfs -ar
[ec2-user@ip-172-29-2-45 ~]$

共有ディレクトリが増えました!

[ec2-user@ip-172-29-2-45 ~]$ showmount -e
Export list for ip-172-29-2-45.ap-northeast-1.compute.internal:
/share 172.29.0.0/255.255.64.0
[ec2-user@ip-172-29-2-45 ~]$

マウントできました!!

[ec2-user@ip-172-29-2-230 ~]$ sudo mount /mnt/nfs
mount.nfs4: access denied by server while mounting 172.29.2.45:/share
[ec2-user@ip-172-29-2-230 ~]$ sudo mount /mnt/nfs
[ec2-user@ip-172-29-2-230 ~]$ ls -l /mnt/nfs/
total 16
drwx------ 2 root root 16384 Jun  4 08:10 lost+found
[ec2-user@ip-172-29-2-230 ~]$

まとめ

今回は、記述ミスから切り分けも経験することができ、いい感じで学習が進みました。
以下まとめて締めたいと思います。

NFS サーバー側の設定ポイント

  • /etc/exports に設定を記述する。

  • 出力設定は showmount -e コマンドで確認する。

  • 設定変更は exportfs -ar コマンドを使う。

NFS クライアント側の設定ポイント

  • マウントポイントを作成してマウントする。

この記事が気に入ったらサポートをしてみませんか?