こんにちは! m.uriuです。
今回は、ブロック・ボリュームのストレージを使って、NFSを構築する手順についてご紹介します。
具体的な手順としては、まずLinuxインスタンスにブロック・ボリュームをアタッチし、その後ファイルシステムを構築、NFSクライアントからマウントする手順まで詳しく解説します。
また今回は少し難度の高いWindowsインスタンスをNFSクライアントにしたNFS接続に挑戦してみます。
この記事で、NFSの構築に悩んでいる方々のお手伝いになれれば幸いです。
目次
「NFS」とは?
NFSとは、主にUNIX系OSで利用される分散ファイルシステム、および、そのための通信規約(プロトコル)。IPネットワーク上で利用され、標準ではTCPの2049番ポートで通信を行う。
ネットワークを介して別のコンピュータの外部記憶装置(ストレージ)をマウントすることができ、そこに保存されているディレクトリやファイルをあたかも手元にあるかのように扱うことができる。ストレージを他のコンピュータに提供するコンピュータを「NFSサーバ」、サーバの持つストレージにアクセスして利用するコンピュータを「NFSクライアント」という。
IT用語辞典
通常、サーバ内のストレージはそのサーバ内でしか利用できませんが、NFSを設定することで、ストレージが存在するサーバとは異なる別のサーバからネットワーク経由でそのストレージ内を閲覧し、ファイルを操作することが可能となります。
この機能を利用することで、例えば一つのサーバに保存されたスクリプトなどのファイルを、実際にファイルを複製せずに複数のサーバ間で共有することができます。
「ファイル・ストレージ」という対抗馬
Oracle Cloud Infrastructure File Storage Serviceでは、永続的でスケーラブルな分散型のエンタープライズ規模のネットワーク・ファイル・システムを提供します。仮想クラウド・ネットワーク(VCN)のベア・メタル、仮想マシンまたはコンテナ・インスタンスからファイル・ストレージ・サービスのファイル・システムに接続できます。
OCI公式ドキュメント
OCIには「ファイル・ストレージ」というNFSに特化したストレージサービスも存在します。
こちらはサーバ外に存在するストレージで、サーバにアタッチする必要もなく、デフォルトで複数のサーバに接続できる設計になっているので、ブロック・ボリュームでNFSを構築するよりも設定の手順が少なく簡単です。
ただし、ファイル・ストレージはブロック・ボリュームと比較して料金が高く設定されています。
(例 50GBのファイル・ストレージ : 月¥2,100
50GB/バランスのブロック・ボリューム : 月¥297.5)
ブロックボリュームでNFSを構築するのは少し手間はかかりますが、かなり安価にサービスを利用できるので、こちらを選択肢として考えるのも良いと思います。
今回の記事では、そのブロック・ボリュームでのNFSの設定方法を、できる限りわかりやすくご紹介します。
LinuxインスタンスでNFSを構築
NFSの仕組みについて解説したところで、今度は本題であるブロック・ボリュームでNFSを構築し、Windowsサーバで接続する手順をご紹介します。
検証用環境
Linuxインスタンス(Oracle-Linux-8.8):NFSサーバ
Windowsインスタンス(Windows-Server-2022):NFSクライアント
ブロック・ボリューム(検証用なので最少の50GB):ファイルシステムとして使用するストレージ
手順1 ブロック・ボリュームをアタッチ
まず、OCIコンソールで作成したブロック・ボリュームをLinuxインスタンスにアタッチします。
ブロック・ボリュームのアタッチには、「準仮想化」と「iSCSI」2種類のボリューム・アタッチメント・タイプがあります。
「準仮想化」の場合、アタッチの手順が「iSCSI」に比べて特殊なコマンドが不要で、作業が簡単です。 一方、「iSCSI」の場合は、アタッチ後にサーバ内で追加のコマンド入力が必要で、若干手間がかかりますが、準仮想化に比べてIOPS(Input/Output Operations Per Second)パフォーマンスが高くなります。(詳細についてはこちらの公式ドキュメントをご参照ください)
この2つのボリュームアタッチメントタイプは、インスタンスへのアタッチの手順は異なりますが、それ以外の使い勝手は同じです。
以下では、それぞれのボリュームアタッチメントタイプごとにアタッチの手順を詳しく解説します。
作業の前後を比較するために、ブロック・ボリュームをアタッチする前のLinuxインスタンスの状態を「lsblk」コマンドを使用して表示し、確認します。
[opc@nfs-test-lin-sv ~]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 46.6G 0 disk
├─sda1 8:1 0 100M 0 part /boot/efi
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 45.5G 0 part
├─ocivolume-root 252:0 0 35.5G 0 lvm /
└─ocivolume-oled 252:1 0 10G 0 lvm /var/oled
準仮想化
OCIコンソールからブロック・ボリュームの詳細画面を表示します。左側のリソース一覧から「アタッチされたインスタンス」を選択し、次に「インスタンスのアタッチ」から「インスタンスにアタッチ」画面を表示します。
アタッチメント・タイプに「準仮想化」を選択し、アタッチするインスタンスを選択して「アタッチ」をクリックします。
ブロック・ボリュームの詳細画面に戻り、「アタッチされたインスタンス」画面で、状態が「アタッチ済み」、アタッチメント・タイプが「準仮想化」と表示されればアタッチ成功です。
確認のためサーバ上で「lsblk」コマンドを入力してみると、「sdb」デバイスとして50GBで追加されているのが分かります。
[opc@nfs-test-lin-sv ~]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 46.6G 0 disk
├─sda1 8:1 0 100M 0 part /boot/efi
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 45.5G 0 part
├─ocivolume-root 252:0 0 35.5G 0 lvm /
└─ocivolume-oled 252:1 0 10G 0 lvm /var/oled
sdb 8:16 0 50G 0 disk
iSCSI
iSCSIでのアタッチの手順は、「インスタンスにアタッチ」画面まで同じです。
「インスタンスにアタッチ」画面で、アタッチメントタイプとして「iSCSI」を選択し、アタッチするインスタンスを選択してから「アタッチ」をクリックします。
画面遷移後、「iSCSIコマンド」を入力するような説明が表示されますが、まずはその説明画面を一旦閉じます。
しばらくすると、準仮想化の場合と同様に、状態が「アタッチ済み」と表示されますが、現時点ではまだサーバ上ではこのブロック・ボリュームは使用できません。
サーバ上で「lsblk」コマンドを入力してもsdbデバイスは表示されず、まだサーバに認識されていない状態です。
[opc@nfs-test-lin-sv ~]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 46.6G 0 disk
├─sda1 8:1 0 100M 0 part /boot/efi
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 45.5G 0 part
├─ocivolume-root 252:0 0 35.5G 0 lvm /
└─ocivolume-oled 252:1 0 10G 0 lvm /var/ole
iSCSIでアタッチしたブロック・ボリュームをサーバ上で利用できるようにするためには、
「iSCSIコマンド」をサーバ上で入力する必要があります。
「アタッチされたインスタンス画面」で右側のメニューから「iSCSIコマンドおよび情報」を選択し、「iSCSIコマンドおよび情報」画面を表示します。
ブロック・ボリュームのアタッチに必要な「アタッチ・コマンド」が表示されるので、こちらをコピーして控えておき、サーバにログインしてコマンドを入力します。
コピーしたコマンドをサーバで入力し、最後に「successful」と表示されればアタッチ完了です。
確認のため「lsblk」コマンドを入力すると、今度は「sdb」デバイスが表示されています。
[opc@nfs-test-lin-sv ~]$ sudo iscsiadm -m node -o new -T iqn.2015-12.com.oracleiaas:***** -p ***.***.***.***:3260
New iSCSI node [tcp:[hw=,ip=,net_if=,iscsi_if=default] ***.***.***.***,3260,-1 iqn.2015-12.com.oracleiaas:*****] added
[opc@nfs-test-lin-sv ~]$ sudo iscsiadm -m node -o update -T iqn.2015-12.com.oracleiaas:***** -n node.startup -v automatic
[opc@nfs-test-lin-sv ~]$ sudo iscsiadm -m node -T iqn.2015-12.com.oracleiaas:***** -p ***.***.***.***:3260 -l
Logging in to [iface: default, target: iqn.2015-12.com.oracleiaas:*****, portal: ***.***.***.***,3260]
Login to [iface: default, target: iqn.2015-12.com.oracleiaas:*****, portal: ***.***.***.***,3260] successful.
[opc@nfs-test-lin-sv ~]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 46.6G 0 disk
├─sda1 8:1 0 100M 0 part /boot/efi
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 45.5G 0 part
├─ocivolume-root 252:0 0 35.5G 0 lvm /
└─ocivolume-oled 252:1 0 10G 0 lvm /var/oled
sdb 8:16 0 50G 0 disk
手順2 ファイルシステム構築
続いて、Linuxサーバにアタッチしたブロック・ボリュームを使って、NFS用のファイルシステムを作成します。
Linuxインスタンスに「/dev/sdb」が追加されているので、まずは「fdisk」コマンドを使用してパーティションを作成します。
[root@nfs-test-lin-sv ~]# ll /dev/sd*
brw-rw----. 1 root disk 8, 0 Aug 8 02:16 /dev/sda
brw-rw----. 1 root disk 8, 1 Aug 8 02:16 /dev/sda1
brw-rw----. 1 root disk 8, 2 Aug 8 02:16 /dev/sda2
brw-rw----. 1 root disk 8, 3 Aug 8 02:16 /dev/sda3
brw-rw----. 1 root disk 8, 16 Aug 8 02:16 /dev/sdb
[root@nfs-test-lin-sv ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): n (←新たにパーティション領域を作成する)
Partition number (1-128, default 1): <デフォルトでいいのでそのままEnter>
First sector (34-104857566, default 2048): <デフォルトでいいのでそのままEnter>
Last sector, +sectors or +size{K,M,G,T,P} (2048-104857566, default 104857566): <デフォルトでいいのでそのままEnter>
Created a new partition 1 of type 'Linux filesystem' and of size 50 GiB.
Command (m for help): p (←パーティションの確認)
Disk /dev/sdb: 50 GiB, 53687091200 bytes, 104857600 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 1048576 bytes
Disklabel type: gpt
Disk identifier: E07601F4-EC8D-4E6D-B476-BE91B72871C6
Device Start End Sectors Size Type
/dev/sdb1 2048 104857566 104855519 50G Linux filesystem
Command (m for help): w (←設定を反映させて終了)
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
「/dev」配下に「sdb1」が追加されました。
「lsblk」コマンドでも「sdb」配下にパーティションとして「sdb1」が表示されていることが確認できます。
[root@nfs-test-lin-sv ~]# ll /dev/sd*
brw-rw----. 1 root disk 8, 0 Aug 8 02:16 /dev/sda
brw-rw----. 1 root disk 8, 1 Aug 8 02:16 /dev/sda1
brw-rw----. 1 root disk 8, 2 Aug 8 02:16 /dev/sda2
brw-rw----. 1 root disk 8, 3 Aug 8 02:16 /dev/sda3
brw-rw----. 1 root disk 8, 16 Aug 8 03:04 /dev/sdb
brw-rw----. 1 root disk 8, 17 Aug 8 03:04 /dev/sdb1
[root@nfs-test-lin-sv ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 46.6G 0 disk
├─sda1 8:1 0 100M 0 part /boot/efi
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 45.5G 0 part
├─ocivolume-root 252:0 0 35.5G 0 lvm /
└─ocivolume-oled 252:1 0 10G 0 lvm /var/oled
sdb 8:16 0 50G 0 disk
└─sdb1 8:17 0 50G 0 part
作成した「/dev/sdb1」を以下のコマンドでxfs形式のファイルシステムを構築します。
[root@nfs-test-lin-sv ~]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=3276735 blks
= sectsz=4096 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=0 inobtcount=0
data = bsize=4096 blocks=13106939, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=25600, version=2
= sectsz=4096 sunit=1 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
Discarding blocks...Done.
NFS用で使用するディレクトリ(今回は「/nfs」)を作成し、その後「mount」コマンドを使用して「/dev/sdb1」を「/nfs」にマウントします。
[root@nfs-test-lin-sv ~]# mkdir /nfs
[root@nfs-test-lin-sv ~]# mount /dev/sdb1 /nfs
mount: (hint) your fstab has been modified, but systemd still uses
the old version; use 'systemctl daemon-reload' to reload.
このサーバの再起動時に自動的にマウントするために、「/etc/fstab」ファイルに下記の一文を追記します。
※マウントは基本的にサーバ停止時に解除されてしまいます。この設定を行うことで、デフォルトのマウント情報をサーバ起動時に読み取って、自動的にマウントを行ってくれます。
/dev/sdb1 /nfs xfs defaults 1 1
nfs-server.serviceを起動し、このサーバをNFSサーバとして使えるようにします。
[root@nfs-test-lin-sv ~]# systemctl start nfs-server.service
[root@nfs-test-lin-sv ~]# systemctl enable nfs-server.service
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.
※もしこの後のNFS接続がうまくいかない場合は、Firewallなどを確認してみてください。
最後に「/etc/exports」ファイルに、NFSのマウント先として許可するディレクトリのパス、NFSクライアントのIPアドレス、許可のオプションを追記します。
※NFSクライアントがWindowsの場合は、「insecure」オプションを加えないとWindows側でマウントできないため、必ずこのオプションを含める必要があります。
/nfs <NFSクライアントのIPアドレス>(insecure,rm)
手順3 WindowsサーバでNFS接続
Windowsサーバにサインインし、LinuxサーバへNFS接続します。
コマンドプロンプトを開いて以下のコマンドを入力し、「コマンドは正常に終了しました。」と表示されればNFS接続は成功です。
C:\Users\opc>mount <NFSサーバのIPアドレス>:/nfs T:(←任意のドライブ名)
T: は <NFSサーバのIPアドレス>:/nfs に正常に接続しました
コマンドは正常に終了しました。
※管理者でコマンドプロンプトを開いてコマンドを実行すると、NFS接続には成功しますが管理者以外のユーザはディレクトリにアクセスできません。エクスプローラーでもディレクトリが表示されなくなります。
opcユーザのままディレクトリに触る際は管理者で実行しないようにしましょう。
NFS接続に成功すると、エクスプローラーを開くと指定したドライブ名で、接続先のディレクトリが表示されるようになり、ディレクトリ内のデータの閲覧や実行が可能となります。
試しにLinux側で「/nfs」ディレクトリに「test1.txt」ファイルを作成すると、Windows側でも閲覧することができます。
[root@nfs-test-lin-sv ~]# vim /nfs/test1.txt
[root@nfs-test-lin-sv ~]# cat /nfs/test1.txt
hogehoge
以上で作業終了です。
※サインアウトするとNFS接続は解除されます。
「mount」コマンドを打ち直すのが面倒な場合は、タスクスケジューラを組むのがおすすめです。(参考サイト)
まとめ
いかがだったでしょうか。
ブロックボリュームのアタッチからWindowsでのNFS接続までの手順をご紹介しました。
今回の記事で、個人的に一番手間取ったのは、異なるOS間のNFS接続に関する部分でした。特に、「/etc/export」ファイルで「insecure」オプションを設定する必要があることに気が付くのに時間を取られてしましました。
この記事が、同様の課題に直面している方や、これからNFS環境を導入しようとしている方にとっての一助となれば幸いです。