Network File System (NFS) は、ネットワーク上でリモートディレクトリを共有することができる分散ファイルシステムプロトコルです。
NFSプロトコルは、デフォルトでは暗号化されておらず、Sambaとは異なり、ユーザー認証を提供していません。
このチュートリアルでは、Ubuntu 18.04でNFSv4サーバーをセットアップする方法を説明します。
Prerequisites #
この例では、Ubuntu 18.04を実行している1台のサーバーと、その他のLinuxディストリビューションを実行しているもう1台のサーバーがあることを想定しています。 サーバーとクライアントは、プライベート ネットワーク上で相互に通信できる必要があります。 ホスティングプロバイダーがプライベートIPアドレスを提供していない場合は、パブリックIPアドレスを使用し、信頼できるソースからのみポート2049
のトラフィックを許可するようにサーバーのファイアウォールを設定することができます。
この例のマシンのIPアドレスは次のとおりです。
NFS Server IP: 192.168.33.10NFS Clients IPs: From the 192.168.33.0/24 range
NFSサーバーの設定 #
まず、NFSサーバーのインストールと設定を行います。
NFSサーバーのインストール #
パッケージのインデックスを更新し、NFSサーバーパッケージをインストールします:
sudo apt update
sudo apt install nfs-kernel-server
インストールが完了すると、NFSサービスが自動的に開始されます。
デフォルトでは、Ubuntu 18.04のNFSバージョン2は無効になっています。 バージョン3と4は有効になっています。 次のcat
コマンドを実行することで確認できます:
sudo cat /proc/fs/nfsd/versions
-2 +3 +4 +4.1 +4.2
NFSv2はもうかなり古いので、有効にする理由はありません。
NFSサーバーの設定オプションは、/etc/default/nfs-kernel-server
/etc/default/nfs-common
ファイルに設定されています。
Creating the file systems #
NFSv4サーバーを構成する際には、グローバルなNFSルートディレクトリを使用し、実際のディレクトリを共有マウントポイントにバインドマウントすることが良い方法です。
ここでは、NFSマウントがどのように構成されるかをよりよく説明するために、異なる構成設定を持つ2つのディレクトリ(/var/www
/opt/backups
)を共有します。
/var/www/
www-data
/opt/backups
root
が所有しています。
mkdir
コマンドを使用してエクスポートファイルシステムを作成します:
sudo mkdir -p /srv/nfs4/backups
sudo mkdir -p /srv/nfs4/www
実際のディレクトリをマウントします。
sudo mount --bind /opt/backups /srv/nfs4/backups
sudo mount --bind /var/www /srv/nfs4/www
バインドマウントを恒久的なものにするために、/etc/fstab
ファイルを開きます:
sudo nano /etc/fstab
そして以下の行を追加します。
/opt/backups /srv/nfs4/backups none bind 0 0/var/www /srv/nfs4/www none bind 0 0
ファイルシステムのエクスポート #
次のステップでは、NFSサーバーによってエクスポートされるファイルシステム、共有オプション、およびそれらのファイルシステムへのアクセスが許可されているクライアントを定義します。 これを行うには、/etc/exports
ファイルを開きます:
sudo nano /etc/exports
今回のケースでは、www
backups
192.168.33.0/24
ネットワーク上のクライアントからのアクセスのみを許可する必要があります。
/srv/nfs4 192.168.33.0/24(rw,sync,no_subtree_check,crossmnt,fsid=0)/srv/nfs4/backups 192.168.33.0/24(ro,sync,no_subtree_check) 192.168.33.3(rw,sync,no_subtree_check)/srv/nfs4/www 192.168.33.110(rw,sync,no_subtree_check)
1行目にfsid=0
があり、NFSルートディレクトリ/srv/nfs
を定義しています。 このNFSボリュームへのアクセスは、192.168.33.0/24
crossmnt
オプションが必要です。
2行目では、1つのファイルシステムに対して複数のエクスポートルールを指定する方法を示しています。 これは、/srv/nfs4/backups
192.168.33.0/24
192.168.33.3
sync
オプションは、NFSに、返信する前に変更内容をディスクに書き込むように指示します。
最後の行は、説明が不要でしょう。
ファイルを保存し、共有をエクスポートします。
sudo exportfs -ra
ファイルを変更するたびに、上記のコマンドを実行する必要があります。
現在のアクティブなエクスポートとその状態を表示するには、次のようにします:
sudo exportfs -v
出力には、すべての共有とそのオプションが含まれます。 ご覧のとおり、/etc/exports
ファイルでは定義していないオプションもあります。
/srv/nfs4/backups192.168.33.3(rw,wdelay,root_squash,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)/srv/nfs4/www 192.168.33.110(rw,wdelay,root_squash,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)/srv/nfs4 192.168.33.0/24(rw,wdelay,crossmnt,root_squash,no_subtree_check,fsid=0,sec=sys,rw,secure,root_squash,no_all_squash)/srv/nfs4/backups192.168.33.0/24(ro,wdelay,root_squash,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
Ubuntuでは、root_squash
がデフォルトで有効になっています。 これは、NFSのセキュリティに関する最も重要なオプションの一つです。 クライアントから接続されたrootユーザーが、マウントされた共有に対してroot権限を持つことを防ぎます。 rootのUID
GID
nobody
nogroup
UID
GID
にマッピングしてくれます。
クライアントマシンのユーザーがアクセスできるようにするには、NFSではクライアントのユーザーとグループのIDがサーバー上のものと一致する必要があります。 また、NFSv4のidmapping機能を使って、ユーザーやグループのIDを名前に変換する方法もあります。
以上です。 この時点で、UbuntuサーバーにNFSサーバーを設定することができました。
Firewall configuration #
ネットワーク上でファイアウォールを実行している場合は、NFSポートのトラフィックを有効にするルールを追加する必要があります。
UFW
192.168.33.0/24
サブネットからのアクセスを許可している場合、次のコマンドを実行する必要があります。
sudo ufw allow from 192.168.33.0/24 to any port nfs
変更を確認するために実行します。
sudo ufw status
ポート2049
のトラフィックが許可されていることが出力されます。
To Action From-- ------ ----2049 ALLOW 192.168.33.0/24 22/tcp ALLOW Anywhere 22/tcp (v6) ALLOW Anywhere (v6)
NFS クライアントのセットアップ #
NFS サーバーがセットアップされ、共有がエクスポートされたので、次のステップでは、クライアントを設定し、リモート ファイル システムをマウントします。
macOSやWindowsマシンでもNFS共有をマウントすることができますが、ここではLinuxシステムに焦点を当てます。
NFSクライアントのインストール #
クライアントマシンには、リモートNFSファイルシステムのマウントに必要なツールのみをインストールする必要があります。
-
NFS クライアントを Debian および Ubuntu にインストールする
Debian ベースのディストリビューションで NFS ファイルシステムをマウントするためのプログラムを含むパッケージの名前は
nfs-common
です。sudo apt update
sudo apt install nfs-common
-
CentOSやFedoraでNFSクライアントをインストールする
Red Hatやその派生製品では
nfs-utils
パッケージをインストールします。sudo yum install nfs-utils
ファイルシステムのマウント #
ここでは、IPアドレスが192.168.33.110
/srv/nfs4/www
/srv/nfs4/backups
ファイル システムへの読み取りのみのアクセスを持ちます。
マウントポイント用に2つの新しいディレクトリを作成します。 このディレクトリは任意の場所に作成できます。
sudo mkdir -p /backups
sudo mkdir -p /srv/www
エクスポートしたファイルシステムをmount
コマンドでマウントします:
sudo mount -t nfs -o vers=4 192.168.33.10:/backups /backups
sudo mount -t nfs -o vers=4 192.168.33.10:/www /srv/www
192.168.33.10
はNFSサーバーのIPです。 IPアドレスの代わりにホスト名を使用することもできますが、クライアントマシンで解決可能である必要があります。
NFSv4ファイルシステムをマウントする際には、NFSルートディレクトリを省略する必要があるため、/srv/nfs4/backups
/backups
を使用する必要があります。
mount または df
コマンドのいずれかを使用して、リモート ファイル システムが正常にマウントされていることを確認します:
df -h
このコマンドはマウントされたすべてのファイル システムを表示します。 最後の2行はマウントされたシェアです:
Filesystem Size Used Avail Use% Mounted on/dev/mapper/VolGroup00-LogVol00 38G 1.7G 36G 5% /devtmpfs 236M 0 236M 0% /devtmpfs 244M 0 244M 0% /dev/shmtmpfs 244M 4.5M 240M 2% /runtmpfs 244M 0 244M 0% /sys/fs/cgroup/dev/sda2 1014M 87M 928M 9% /boottmpfs 49M 0 49M 0% /run/user/1000192.168.33.10:/backups 9.7G 1.2G 8.5G 13% /backups192.168.33.10:/www 9.7G 1.2G 8.5G 13% /srv/www
再起動時にマウントを永続的にするには、/etc/fstab
ファイルを開きます:
sudo nano /etc/fstab
そして次の行を追加します。
192.168.33.10:/backups /backups nfs defaults,timeo=900,retrans=5,_netdev0 0192.168.33.10:/www /srv/www nfs defaults,timeo=900,retrans=5,_netdev0 0
NFSファイルシステムをマウントする際に利用可能なオプションの詳細を確認するには、ターミナルでman nfs
と入力してください。
リモート ファイル システムをマウントするもうひとつの方法は、autofs
ツールを使用するか、systemd ユニットを作成することです。
Testing NFS Access #
それぞれの共有に新しいファイルを作成して、アクセスをテストしてみましょう。
まず、/backups
touch
コマンドを使用してテスト ファイルを作成してみます。
sudo touch /backups/test.txt
/backup
Permission denied
エラーメッセージが表示されます。
touch: cannot touch ‘/backups/test’: Permission denied
次に、/srv/www
sudo
コマンドを使用して、ルートとしてテスト ファイルを作成してみます。
sudo touch /srv/www/test.txt
再び、Permission denied
のメッセージが表示されます。
touch: cannot touch ‘/srv/www’: Permission denied
思い返してみると、/var/www
www-data
root_squash
nobody
nogroup
グループにマッピングしていますが、このグループはリモート共有への書き込み権限を持っていません。
クライアント マシンに、リモート サーバーと同じ UID
GID
www-data
の使用があると仮定します (例えば、両方のマシンに nginx をインストールした場合はそうなるはずです)。
www-data
ユーザーとしてファイルを作成するテストを行うことができます。
sudo -u www-data touch /srv/www/test.txt
このコマンドは何も出力しませんが、これはファイルが正常に作成されたことを意味します。
それを確認するために、/srv/www
ディレクトリ内のファイルをリストアップします:
ls -la /srv/www
出力には新しく作成されたファイルが表示されます。
drwxr-xr-x 3 www-data www-data 4096 Jun 23 22:18 .drwxr-xr-x 3 root root 4096 Jun 23 22:29 ..-rw-r--r-- 1 www-data www-data 0 Jun 23 21:58 index.html-rw-r--r-- 1 www-data www-data 0 Jun 23 22:18 test.txt
NFSファイルシステムのアンマウント #
リモートNFS共有が必要なくなった場合、umountコマンドを使用して、マウントされた他のファイルシステムと同様にアンマウントすることができます。 たとえば、/backup
の共有をアンマウントするには、次のように実行します。
sudo umount /backups
マウントポイントが/etc/fstab
#
を追加してコメントアウトしてください。
結論 #
このチュートリアルでは、NFS サーバーの設定方法と、クライアント マシンにリモート ファイル システムをマウントする方法を紹介しました。
NFSの代わりに、SSHFSを使ってSSH接続でリモートディレクトリをマウントすることができます。 SSHFSはデフォルトで暗号化されており、設定や使用が非常に簡単です。