サーバ - NFS

提供:MochiuWiki : SUSE, EC, PCB
2024年12月26日 (木) 09:00時点におけるWiki (トーク | 投稿記録)による版 (→‎ネットワークドライブの切断)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

概要

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クライアントを有効にする必要がある。
初期設定では、この機能は無効になっている。

  1. NFSクライアント機能を有効にする。
    • [設定]から行う場合
      1. [設定] - [システム] - [オプション機能]を選択する。
      2. 画面右上の[Windowsのその他の機能]を選択する。
      3. [Windowsの機能]画面が表示されるので、一覧から[NFS用サービス]を展開して[NFSクライアント]と[管理ツール]にチェックを入力する。
      4. [OK]ボタンを押下する。
    • Powershellから行う場合
      1. Enable-WindowsOptionalFeature -FeatureName ServicesForNFS-ClientOnly, ClientForNFS-Infrastructure -Online -NoRestart

  2. インストール完了後、PCを再起動する。

  3. ネットワークドライブを割り当てる。
    • ファイルエクスプローラから行う場合
      1. ファイルエクスプローラを起動して、[ネットワークドライブの割り当て]を選択して、NFSの共有ディレクトリを設定する。
      2. [ネットワークドライブ]画面が表示されるので、NFSサーバのIPアドレス(またはホスト名)とNFSの共有ディレクトリのパスを続けて入力する。
    • Powershellから行う場合
      1. 一般ユーザ権限でPowershellを起動する。
        New-PSdrive -PSProvider FileSystem -Name <ネットワークドライブ名 例: M> -Root <NFSサーバのディレクトリパス 例: \\192.168.0.1\mnt\NFS>
    • コマンドプロンプトから行う場合
      1. 一般ユーザ権限でコマンドプロンプトを起動する。
        mount <NFSサーバのディレクトリパス 例: 192.168.0.1:/mnt/NFS> <ネットワークドライブ名 例: Z:\>

  4. 例えば、NFSサーバのIPアドレスが"192.168.0.1"、共有ディレクトリのパスが"/mnt/NFS"の場合、以下のように入力する。
    \\192.168.0.1\mnt\NFS

  5. 以上の設定を行うと、ファイルエクスプローラの[ネットワークロケーション]または[ネットワーク]に共有ディレクトリが表示される。


ネットワークドライブの権限

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: