サーバ - NFS
概要
NFSプロトコルは、1983年にSun Microsystemsによって最初に開発された。
これは、クライアントPCがネットワーク経由でファイルにアクセスできるようにするための方法として設計された。
NFS(Network File System)を使用することにより、
NFSサーバのディスクパーティションをクライアント端末のHDD /SSDのようにマウントすることができるようになる。
ここでは、以下のような環境を例に、NFSサーバを構築する。
+----------------------+ | +----------------------+ | [ NFS Server ] |192.168.1.10 | 192.168.1.11| [ NFS Client ] | | www.suse.com +-------------+-------------+ client.suse.com | | | | | +----------------------+ +----------------------+
NFSとSambaの違いは、以下の通りである。
- NFS
- マルチプラットフォームでファイルシステムを共有する。
- 冗長処理が少ないので高速で動作する。
- Samba
- CIFS(Windows固有のプロトコル)を使用して、Windows / Unixプラットフォーム間でファイルシステムを共有する。
NFSサーバのインストール
パッケージ管理システムからインストールする場合
まず、全てのパッケージが最新であることを確認する。
# RHEL sudo dnf update # SUSE sudo zypper update # Raspberry Pi sudo apt-get update sudo apt-get upgrade
NFSサーバをインストールするため、以下のコマンドを実行する。
# RHEL sudo dnf install nfs-utils # SUSE sudo zypper install nfs-kernel-server # Raspberry Pi sudo apt-get install nfs-kernel-server
ソースコードからインストールする場合
NFSのビルドに必要なライブラリをインストールする。
# SUSE sudo zypper install rpcgen libtirpc-devel libevent-devel libxml2-devel libmount-devel device-mapper-devel systemd-devel krb5-devel \ libgssglue-devel # GSSAPIを有効にする場合
NFSの公式Webサイトにアクセスして、ソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。
tar xf nfs-utils-<バージョン>.tar.xz cd nfs-utils-<バージョン>
NFSをビルドおよびインストールする。
./configure --prefix=<NFSのインストールディレクトリ> \ --sysconfdir=<NFSの設定ディレクトリ 例. /etc または /<NFSのインストールディレクトリ>/etc等> \ --sbindir=<NFSのシステムバイナリディレクトリ 例. /usr/sbin または /<NFSのインストールディレクトリ>/sbin等> \ --with-statedir=<NFSのステータスディレクトリ 例. /<NFSのインストールディレクトリ>/var等 デフォルトでもよい> \ --with-systemd \ --disable-gss # GSSAPIを無効にする場合は指定する make -j $(nproc) # /sbin/mount.nfsファイル、/sbin/nfsdcltrackファイル、/usr/lib/udev/rules.d/99-nfs.rulesファイルを作成する必要があるため、スーパーユーザ権限で実行する sudo make install
特に重要なファイルとして、以下に示すものがインストールされる。
- /sbin/mount.nfs
- /sbin/nfsdcltrack
- /usr/lib/systemd/system-generators/nfs-server-generator
- /usr/lib/systemd/system-generators/rpc-pipefs-generator
- /usr/lib/systemd/system/fsidd.service
- /usr/lib/systemd/system/XXX-NFS-var-rpc_pipefs.mount
- /usr/lib/systemd/system/nfs-blkmap.service
- /usr/lib/systemd/system/nfs-idmapd.service
- /usr/lib/systemd/system/nfs-mountd.service
- /usr/lib/systemd/system/nfs-server.service
- /usr/lib/systemd/system/nfsdcld.service
- /usr/lib/systemd/system/rpc-statd-notify.service
- /usr/lib/systemd/system/rpc-statd.service
- /usr/lib/systemd/system/rpc_pipefs.target
- /usr/lib/udev/rules.d/60-nfs.rules
- /usr/lib/udev/rules.d/99-nfs.rules
NFSのルールファイルを編集する。
sudo vi /usr/lib/udev/rules.d/99-nfs.rules
# /usr/lib/udev/rules.d/99-nfs.rulesファイル SUBSYSTEM=="bdi", ACTION=="add", PROGRAM="/<NFSのインストールディレクトリ>/lib/nfsrahead %k", ATTR{read_ahead_kb}="%c"
NFS-Ganeshaサーバのインストール
NFS-Ganeshaは、ほとんどのUNIX/Linux上でユーザーモードで動作するNFSv3、v4、v4.1ファイルサーバである。
また、9p.2000Lプロトコルもサポートしている。
詳細を知りたい場合は、NFS-GaneshaサーバのプロジェクトWikiを参照すること。
NFS-Ganeshaサーバのビルドに必要なライブラリをインストールする。
sudo zypper install gcc gcc-c++ git cmake autoconf libtool bison flex \ libgssglue-devel openssl-devel libnsl-devel libacl-devel libntirpc-devel doxygen
NFS-Ganeshaサーバの公式WebサイトまたはGithubにアクセスして、ソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。
tar xf nfs-ganesha-<バージョン>.tar.gz cd nfs-ganesha-<バージョン>
NFS-Ganeshaサーバをビルドおよびインストールする。
mkdir build && cd build cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=<NFS-Ganeshaサーバのインストールディレクトリ> ../src \ -DUSE_GSS=Off # GSSを無効にする場合 -D_USE_9P=OFF # 9pプロトコルを無効にする場合 make -j $(nproc) make install
NFSサーバの設定
NFSサーバのドメイン名を設定するため、以下のコマンドを実行する。
ドメインを使用しない場合は、以下の設定を行わない。
sudo vi /etc/idmapd.conf
# /etc/idmapd.confファイル # 5行目:自ドメイン名に変更 # RHEL Domain = rhel.com # SUSE Domain = suse.com # Raspberry Pi Domain = raspberrypi.com
/etc/exportsファイルの設定を行う。
/etc/exportsファイルは、どのクライアント端末に、どのディレクトリを、どのような権限でアクセス許可するかを設定するファイルである。
例えば、以下の設定では、/home/ユーザ名/NFSディレクトリを共有ディレクトリとして、読み書き可能としている。
sudo vi /etc/exports
# /etc/exportsファイル # マウント設定を記述 /home/ユーザ名/NFS 192.168.1.0/24(rw,async,no_root_squash)
exportsの主なオプションを下表に示す。
オプション | 説明 |
---|---|
rw | 読み込みと書き込みの両方を許可する |
ro | 読み込みを許可する |
sync | 同期書き込みを有効にする(デフォルト) |
async | 非同期書き込みを有効にする |
secure | 1024番ポートより小さいポートからのリクエストのみ受け付ける (デフォルト) |
insecure | 1024番ポート以降のポートからのリクエストも受け付ける |
wdelay | 別の書き込み要求が実行中 / 発生予定の場合、書き込みを遅延させる(デフォルト) |
no_wdelay | wdelayを無効にする。 asyncと合わせて設定する |
subtree_check | サブツリーのチェックを行う。(デフォルト) 一般的な指針として、多くは読み込みのみでファイル名の変更があまり行われないようなディレクトリをエクスポートする場合は、 サブツリーチェックが有効の方が良い。 |
no_subtree_check | サブツリーのチェックを無効にする。 一般的な指針として、ホームディレクトリのような細かなファイルが多く、変更も多いディレクトリをエクスポートする場合は、 サブツリーのチェックを無効にした方が良い。 |
root_squash | root UID / GIDをanonymous UID / GIDにマッピングする。 エクスポートされたディレクトリに対して、root権限ではアクセスできないようにする。 |
no_root_squash | rootをanonymous UID / GIDにマッピングしない。 エクスポートされたディレクトリに対して、root権限でアクセスできるようにする。 |
all_squash | 全てのUID / GIDをanonymous UID / GIDにマッピングする。 |
no_all_squash | 全てのUID / GIDをanonymous UID / GIDにマッピングしない。(デフォルト) |
anonuid=UID | 指定のUIDをanonymous UIDにマッピングする。 |
anongid=GID | 指定のGIDをanonymous GIDにマッピングする。 |
/etc/exportsファイルの設定の変更を反映させる。
exportfs -ra
NFSサービスの自動起動
Linuxの起動時に、NFSサービスを自動起動するために、以下のコマンドを実行する。
# RHEL sudo systemctl start rpcbind nfs-server sudo systemctl enable rpcbind nfs-server # SUSE sudo systemctl start nfs-server sudo systemctl enable nfs-server # Raspberry Pi sudo systemctl start nfs-server sudo systemctl enable nfs-server
ファイアーウォールの設定
Firewalldを有効にしている場合は、NFSサービスの許可が必要である。
# NFS v4の許可 sudo firewall-cmd --permanent --add-service=nfs # NFS v3も許可する場合 sudo firewall-cmd --permanent --add-service={nfs3,mountd,rpc-bind} sudo firewall-cmd --reload
KVM上でNFSサービスを有効にする場合は、ゾーンをlibvirtdに変更する必要がある。
# NFS v4の許可 sudo firewall-cmd --permanent --zone=libvirt --add-service=nfs # NFS v3も許可する場合 sudo firewall-cmd --permanent --zone=libvirt --add-service={nfs3,mountd,rpc-bind} sudo firewall-cmd --reload
NFSの共有ディレクトリへの接続
Linuxクライアント
まず、NFSクライアントをインストールする。
# RHEL sudo dnf install nfs-utils # SUSE sudo zypper install nfs-client # Raspberry Pi sudo apt-get install nfs-common
次に、ドメインの設定を行う。
ドメインが存在しない場合は、この設定を行わない。
sudo vi /etc/idmapd.conf
# /etc/idmapd.confファイル # 自ドメイン名に変更 Domain = <ドメイン名>
手動マウント
NFSサーバの共有ディレクトリをマウントする。
もし、NFS v3でマウントする場合は、-o vers=3
オプションを付加してマウントする。
# NFS v4の場合 sudo mount -t nfs <NFSサーバのIPアドレスまたはホスト名>:/home/ユーザ名/NFS <マウントするクライアントPCのディレクトリ> # NFS v3の場合 sudo mount -t nfs -o vers=3 <NFSサーバのIPアドレスまたはホスト名>:<NFSサーバの共有ディレクトリ> <マウントするクライアントPCのディレクトリ> # 例: NFS v3でマウントする場合 # NFSサーバのIPアドレスが192.168.0.1 # NFSサーバの共有ディレクトリが/mnt/NFS # NFSクライアントのマウントディレクトリが$HOME/NFS-Clientディレクトリ sudo mount -t nfs -o vers=3 192.168.0.1:/mnt/NFS $HOME/NFS-Client
正常にマウントされているか確認するために、以下のコマンドを実行する。
df -hT
自動マウント(Linuxの起動時)
Linuxの起動時にNFS共有ディレクトリを自動マウントする場合は、/etc/fstabファイルに以下のように設定する。
sudo vi /etc/fstab # /etc/fstabファイル(最下行に追記) <NFSサーバのIPアドレスまたはホスト名>:/home/ユーザ名/NFS <マウントするクライアントPCのディレクトリ> nfs defaults 0 0
自動マウント(マウントポイントのアクセス時)
マウントポイントのアクセス時に、動的にNFS共有ディレクトリにマウントする場合は、以下のように設定する。
以下の例では、/mnt/NFSディレクトリに動的マウントするように設定している。
sudo mkdir /mnt/NFS
sudo zypper install autofs
sudo vi /etc/auto.master # /etc/auto.masterファイル(最下行に追記) /- /etc/auto.mount
sudo vi /etc/auto.mount # /etc/auto.mountファイル # [マウントポイント] [オプション] [ロケーション] /mnt/NFS -fstype=nfs,rw <NFSサーバのIPアドレスまたはホスト名>:/home/ユーザ名/NFS
AutoFSを自動起動設定にする。
sudo systemctl start autofs sudo systemctl enable autofs
正常に機能しているか確認するため、マウントポイントへ移動して以下のコマンドを実行する。
cd /mnt/NFS ls -ahlF cat /proc/mounts | grep mntdir
Windowsクライアント
ネットワークドライブのマウント
WindowsからNFSの共有ディレクトリと通信するには、NFSクライアントを有効にする必要がある。
初期設定では、この機能は無効になっている。
- NFSクライアント機能を有効にする。
- [設定]から行う場合
- [設定] - [システム] - [オプション機能]を選択する。
- 画面右上の[Windowsのその他の機能]を選択する。
- [Windowsの機能]画面が表示されるので、一覧から[NFS用サービス]を展開して[NFSクライアント]と[管理ツール]にチェックを入力する。
- [OK]ボタンを押下する。
- Powershellから行う場合
Enable-WindowsOptionalFeature -FeatureName ServicesForNFS-ClientOnly, ClientForNFS-Infrastructure -Online -NoRestart
- [設定]から行う場合
- インストール完了後、PCを再起動する。
- ネットワークドライブを割り当てる。
- ファイルエクスプローラから行う場合
- ファイルエクスプローラを起動して、[ネットワークドライブの割り当て]を選択して、NFSの共有ディレクトリを設定する。
- [ネットワークドライブ]画面が表示されるので、NFSサーバのIPアドレス(またはホスト名)とNFSの共有ディレクトリのパスを続けて入力する。
- ファイルエクスプローラを起動して、[ネットワークドライブの割り当て]を選択して、NFSの共有ディレクトリを設定する。
- Powershellから行う場合
- 一般ユーザ権限でPowershellを起動する。
New-PSdrive -PSProvider FileSystem -Name <ネットワークドライブ名 例: M> -Root <NFSサーバのディレクトリパス 例: \\192.168.0.1\mnt\NFS>
- 一般ユーザ権限でPowershellを起動する。
- コマンドプロンプトから行う場合
- 一般ユーザ権限でコマンドプロンプトを起動する。
mount <NFSサーバのディレクトリパス 例: 192.168.0.1:/mnt/NFS> <ネットワークドライブ名 例: Z:\>
- 一般ユーザ権限でコマンドプロンプトを起動する。
- ファイルエクスプローラから行う場合
- 例えば、NFSサーバのIPアドレスが"192.168.0.1"、共有ディレクトリのパスが"/mnt/NFS"の場合、以下のように入力する。
- \\192.168.0.1\mnt\NFS
- 以上の設定を行うと、ファイルエクスプローラの[ネットワークロケーション]または[ネットワーク]に共有ディレクトリが表示される。
ネットワークドライブの権限
NFSサーバ上にあるディレクトリおよびファイルにおいて、作成または書き込みを行う場合、以下に示すファイル群を作成する。
これらのファイル群を作成するには、管理者権限が必要となることに注意する。
passwdファイルを作成する。
このファイルには、Windows上のユーザ名とマッピングするLinux上のユーザのUIDとGIDを記述する。
# C:\Windows¥System32¥drivers¥etc\passwd <Windows上のユーザ名>:x:<Linux上のUID>:<Linux上のGID>::: 例: win11:x:1000:
Windows 10/11において、ユーザのグループ名を表示する。
net user <ユーザ名>
groupファイルを作成する。
このファイルには、groupファイルには、Windows上のユーザが所属するグループ名とマッピングするLinux上のユーザのGIDを記述する。
# C:\Windows¥System32¥drivers¥etc\group <Windows上のユーザのグループ名>:x:<GID>: 例: Administrators:x:100:
ネットワークドライブの切断
NFSサーバから切断する時は、エクスプローラまたはコマンドプロンプトから切断する。
- エクスプローラから切断する場合
- NFSサーバに接続しているドライブを右クリックして、コンテキストメニューから[切断]を選択する。
- Powershellから切断する場合
- 例: ZドライブとしてNFSサーバのディレクトリをマウントしている場合
Remove-PSdrive -Name Z
- コマンドプロンプトから切断する場合
- コマンドプロンプト上にて、umountコマンドを実行する。
- 例: ZドライブとしてNFSサーバのディレクトリをマウントしている場合
umount Z: