「NFS」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(文字列「Tips and tricks」を「ヒントとテクニック」に置換)
(→‎サーバーを起動する: 不要なスペースを削除)
 
(5人の利用者による、間の43版が非表示)
1行目: 1行目:
 
[[Category:ファイルシステム]]
 
[[Category:ファイルシステム]]
[[Category:ネットワーク]]
+
[[Category:ネットワーク共有]]
  +
[[Category:サーバー]]
 
[[ar:NFS]]
 
[[ar:NFS]]
 
[[cs:NFS]]
 
[[cs:NFS]]
12行目: 13行目:
 
{{Related articles start}}
 
{{Related articles start}}
 
{{Related|NFS/トラブルシューティング}}
 
{{Related|NFS/トラブルシューティング}}
{{Related|Avahi}}
 
{{Related|ディスクレスシステム}}
 
 
{{Related articles end}}
 
{{Related articles end}}
 
[[Wikipedia:ja:Network File System|Wikipedia]] より:
 
[[Wikipedia:ja:Network File System|Wikipedia]] より:
 
: ''Network File System (NFS) はローカルストレージにアクセスするのと同じようにネットワーク上のファイルにクライアントコンピュータでアクセスできるようにする分散ファイルシステムおよびそのプロトコルである。1984年に Sun Microsystems によって開発された。''
 
: ''Network File System (NFS) はローカルストレージにアクセスするのと同じようにネットワーク上のファイルにクライアントコンピュータでアクセスできるようにする分散ファイルシステムおよびそのプロトコルである。1984年に Sun Microsystems によって開発された。''
  +
  +
{{Note|
  +
*NFS は暗号化されません。機密情報を扱うときは [[Kerberos]] や [[Tinc]] などの暗号化プロトコルを使って NFS をトンネル化してください。
  +
*[[Samba]] とは異なり、NFS にはデフォルトでユーザー認証がありません。クライアントのアクセスは IP アドレスや[[ホストネーム]]で制限します。
  +
* NFS では、クライアントとサーバーの両方で [[ユーザー]] および/または [[ユーザーグループ]] ID が同じであることを期待しています(Kerberos を使用していない場合)。[[#idmapping を有効化]]するか、{{ic|/etc/exports}} で {{ic|anonuid}}/{{ic|anongid}} と {{ic|all_squash}} を一緒に使用して UID/GID を手動で上書きしてください。
  +
* NFS は [[アクセス制御リスト|POSIX ACLs]] をサポートしていません。NFS サーバーは引き続き ACL を強制しますが、クライアントはそれらを見たり変更したりすることができません。
  +
  +
}}
   
 
== インストール ==
 
== インストール ==
22行目: 29行目:
 
クライアントとサーバーどちらでも必要なのは {{Pkg|nfs-utils}} パッケージの[[pacman|インストール]]だけです。
 
クライアントとサーバーどちらでも必要なのは {{Pkg|nfs-utils}} パッケージの[[pacman|インストール]]だけです。
   
{{Note|クライアント・サーバーの時計を一致させるために全てのノードで時刻同期デーモンを使うことが強く推奨されます。全てのノードで時計が正確でないと、NFS は望ましくない遅延を生じさせる可能性があります。[[Network Time Protocol daemon|NTP]] システムを使ってサーバーとクライアントの両方をインターネット上の正確な NTP サーバーに同期させることが推奨されています。}}
+
クライアント・サーバーの時計を一致させるために全てのノードで[[時刻同期]]デーモンを使うことが強く推奨されます。全てのノードで時計が正確でないと、NFS は望ましくない遅延を生じさせる可能性があります。
   
==設定==
+
==サーバー設定==
   
  +
グローバル設定オプションは {{ic|/etc/nfs.conf}} で設定されます。単純な設定を使用するユーザーはこのファイルを編集する必要はありません。
===サーバー===
 
   
NFS は共有のリスト (以下 "exports" と呼称します) を確認する必要があります。exports は {{ic|/etc/exports}} に定義ます。ファイシステムのどのディレクトリでもかせん。セキュリティ上、ユーザーのアが限られる NFS export root を使うことが推奨されます。以下ではこの考を例証しています。
+
NFS サーバー共有するディレクトリのリスト必要で、{{ic|/etc/exports}} または {{ic|/etc/exports.d/*.exports}} に定義する必要があります(詳細は {{man|5|exports}} を参照)トでは、ディレクトリはそのパスのままクスポートされます。ば:
   
  +
{{hc|/etc/exports|2=
{{ic|/etc/exports}} に NFS ルートの相対パスで NFS 共有を定義します。ここでは、NFS ルートは {{ic|/srv/nfs4}} とし、{{ic|/mnt/music}} を共有させます。
 
  +
/data/music 192.168.1.0/24(rw)
  +
}}
   
  +
上記の設定により、ディレクトリ {{ic|/data/music}} は NFSv3 および NFSv4 で {{ic|MyServer:/data/music}} としてマウント可能になります。
# mkdir -p /srv/nfs4/music /mnt/music
 
   
  +
=== カスタムエクスポートルート ===
クライアントが書き込めるように music ディレクトリには読み書きの権限を設定しておきます。
 
   
  +
共有はいわゆる NFS ルートからの相対パスになります。セキュリティ上、NFS ルートを定義するときはサーバーのルートファイルシステム下の専用のディレクトリツリーを使用して、ユーザーからマウントポイントへのアクセスを制限すると良いでしょう。バインドマウントは、共有マウントポイントを [[ファイルシステム]] 上の実際のディレクトリにリンクするために使用されます。過去には NFSv4 で NFS ルートが必須でしたが、現在はオプションです(カーネル 2.6.33 および nfs-utils 1.2.2 から、仮想ルートが実装されています)。
そして実際の対象の共有である {{ic|/mnt/music}} を NFS 共有に mount コマンドでマウントします:
 
   
  +
下の例では以下の設定を使用します:
# mount --bind /mnt/music /srv/nfs4/music
 
   
  +
# NFS ルートは {{ic|/srv/nfs}}。
サーバーを再起動してもマウントされるように、bind マウントを {{ic|fstab}} に追加:
 
  +
# エクスポートは {{ic|/srv/nfs/music}} で {{ic|/mnt/music}} にバインドマウントする。
{{hc|/etc/fstab|
 
/mnt/music /srv/nfs4/music none bind 0 0
 
}}
 
   
  +
# mkdir -p /srv/nfs/music /mnt/music
共有するディレクトリと、マウントを許可するクライアントマシンの ip アドレスまたはホスト名を {{ic|exports}} に追加します:
 
  +
# mount --bind /mnt/music /srv/nfs/music
{{hc|/etc/exports|<nowiki>
 
/srv/nfs4/ 192.168.1.0/24(rw,fsid=root,no_subtree_check)
 
/srv/nfs4/music 192.168.1.0/24(rw,no_subtree_check,nohide) # note the nohide option which is applied to mounted directories on the file system.
 
</nowiki>}}
 
   
  +
{{Note|[[ZFS]] ファイルシステムの場合、バインドマウントの使い方が特殊です。[[ZFS#バインドマウント]]を見てください。}}
共有をサブネット全体で開く必要はありません。単一の IP アドレスまたはホスト名だけを指定することも可能です。
 
   
  +
サーバーを再起動してもマウントされるように、バインドマウントを [[fstab]] に追加:
利用可能なオプションについての詳細は {{ic|man 5 exports}} を見て下さい。
 
   
  +
{{hc|/etc/fstab|/mnt/music /srv/nfs/music none bind 0 0}}
{{Note|Modifying {{ic|/etc/exports}} while the server is running will require a re-export for changes to take effect: {{ic|# exportfs -rav}}.}}
 
   
  +
CIDR によるアドレス指定またはホストネームを使ってマウントを許可するクライアントマシンを制限するには {{ic|/etc/exports}} に以下のように共有ディレクトリを追加:
==== サーバーを起動する ====
 
   
  +
{{hc|/etc/exports|2=
{{ic|nfs-server.service}} を[[起動]]・[[有効化]]してください。昔の V2 や V3 のエクスポートを使うには {{ic|rpcbind.service}} も必要になります。V4 だけを使う場合は、V2 と V3 を明示的に無効化してください [https://bbs.archlinux.org/viewtopic.php?id=193629]: {{hc|/etc/conf.d/nfs-server.conf|2=
 
  +
/srv/nfs 192.168.1.0/24(rw,fsid=root)
NFSD_OPTS="-N 2 -N 3"
 
  +
/srv/nfs/music 192.168.1.0/24(rw,sync)
  +
/srv/nfs/home 192.168.1.0/24(rw,sync)
  +
/srv/nfs/public 192.168.1.0/24(ro,all_squash,insecure) desktop(rw,sync,all_squash,anonuid=99,anongid=99) # map to user/group - in this case ''nobody''
 
}}
 
}}
上記の設定をしない場合 {{ic|rpcbind.service}} が必要になります。
 
   
  +
NFSv4 を使用する場合、オプション {{ic|1=fsid=root}} または {{ic|1=fsid=0}} は「ルート」エクスポートを示します。そのようなエクスポートが存在する場合、他のすべてのディレクトリはそれ以下でなければなりません。{{ic|/etc/nfs.conf}} ファイルの {{ic|rootdir}} オプションはこれに影響しません。{{ic|1=fsid=0}} エクスポートがない場合のデフォルトの動作は、NFSv3 と同じように動作することです。
==== その他 ====
 
   
  +
上記の例では、{{ic|/srv/nfs}} がルートとして指定されているため、エクスポート {{ic|/srv/nfs/music}} は NFSv4 を介して {{ic|MyServer:/music}} としてマウント可能になります - ルートプレフィックスは省略されることに注意してください。
===== 任意のサーバー設定 =====
 
{{ic|/etc/conf.d/nfs-server.conf}} には rpc.nfsd, rpc.mountd, rpc.svcgssd のオプションを任意で記述します。シンプルな設定をする場合はこのファイルを編集する必要はありません。
 
   
  +
{{Tip|
===== 固定ポート =====
 
  +
* NFSv3 には必要ですが NFSv4 には必要ない {{ic|crossmnt}} オプションは、{{ic|crossmnt}} でマークされたファイルシステム上にマウントされた '''全ての''' ファイルシステムにクライアントがアクセスできるようにします。クライアントはすべての子エクスポートを別々にマウントする必要がありません。ただし、異なるアドレス範囲で子が共有されている場合、これは望ましくないかもしれません。
NFSv3 クライアントのサポートが必要な場合、固定ポートを使うのが良いでしょう。デフォルトでは、NFSv3 による {{ic|rpc.statd}} や {{ic|lockd}} の制御にはランダムな一時的なポートが使われます。ファイアウォールを通して NFSv3 の制御ができるようにするには固定ポートを定義する必要があります。{{ic|/etc/conf.d/nfs-common.conf}} を編集して {{ic|STATD_OPTS}} を設定してください:
 
  +
* {{ic|crossmnt}} の代わりに、子エクスポートに {{ic|nohide}} オプションを使用すると、クライアントがルートエクスポートをマウントするときに自動的にマウントされます。{{ic|crossmnt}} と異なり、{{ic|nohide}} は子エクスポートのアドレス範囲を尊重します。このオプションも NFSv3 固有であり、NFSv4 は常に nohide が有効であるかのように振る舞います。
 
  +
* {{ic|insecure}} オプションは、クライアントが 1023 番以上のポートから接続できるようにします。(通常、ルートユーザーのみが低番号ポートを使用できるため、デフォルトで他のポートをブロックすることはアクセスへの表面的な障壁を作ります。実際には {{ic|insecure}} オプションを省略しても含めても、セキュリティに有意な改善または悪化はありません。)
{{hc|/etc/conf.d/nfs-common.conf|2=
 
  +
* アスタリスク ({{ic|*}}) を使用して、任意のインターフェースからのアクセスを許可します。
STATD_OPTS="-p 32765 -o 32766 -T 32803"
 
 
}}
 
}}
   
  +
サーバー実行中に {{ic|/etc/exports}} を変更した場合は再度エクスポートしないと変更が適用されないので注意してください:
{{ic|rpc.mountd}} は {{ic|/etc/services}} を読み込んで通常の状態では同じ固定ポート 2048 に bind されます。しかしながら、明示的に定義する必要があるときは {{ic|/etc/conf.d/nfs-server.conf}} を編集して MOUNTD_OPTS を設定してください:
 
  +
# exportfs -rav
   
  +
現在ロードされているエクスポートの状態をより詳細に見るには、以下を使用する:
{{hc|/etc/conf.d/nfs-server.conf|2=
 
MOUNTD_OPTS="-p 20048"
 
}}
 
   
  +
# exportfs -v
これらの変更を加えたら、複数のサービスを再起動してください。最初に設定オプションを {{ic|/run/sysconfig/nfs-utils}} (参照: {{ic|/usr/lib/systemd/scripts/nfs-utils_env.sh}}) に書き出して、二番目に新しいポートで {{ic|rpc.statd}} を再起動し、最後に新しいポートで lockd (カーネルモジュール) をリロードします。
 
   
  +
利用可能なオプションについて詳しくは {{man|5|exports}} を参照してください。
# systemctl restart nfs-config
 
  +
{{Tip|IP の範囲を CIDR 表記に変換するツールとして [http://ip2cidr.com/ ip2cidr] が存在します。}}
# systemctl restart rpcbind
 
  +
{{Note|エクスポート先が tmpfs ファイルシステムの場合、{{ic|1=fsid=1}} オプションが必要です。}}
# systemctl restart rpc-statd
 
# systemctl restart nfs-server
 
   
  +
=== サーバーを起動する ===
再起動後、サーバーで {{ic|rpcinfo -p}} を使って固定ポートが思い通りにいってるか確認してください。クライアントから {{ic|rpcinfo -p <server IP>}} を使えば本当に同じ固定ポートを使っているか明らかになります。
 
   
  +
* NFSv3 および NFSv4 サービスを提供するには、{{ic|nfs-server.service}} を[[開始]]して[[有効化]]します。
===== NFSv2 との互換性 =====
 
  +
* NFSv4 サービスのみを提供するには、{{ic|nfsv4-server.service}} を[[開始]]して[[有効化]]します。
  +
  +
プロトコルバージョン 4 のエクスポートを使用するユーザーは、不要なサービスが実行されないように、最低限 {{ic|rpcbind.service}} と {{ic|rpcbind.socket}} を[[マスク]]することを望むでしょう。詳細は {{Bug|76453}} を参照してください。また、何らかの理由で引き込まれた {{ic|nfs-server.service}} もマスクすることを検討してください。
  +
  +
{{Note|ZFS シェアをエクスポートする場合は、{{ic|zfs-share.service}} も [[開始]]/[[有効化]] してください。これを行わないと、再起動後に ZFS シェアがエクスポートされなくなります。詳細は [[ZFS#NFS]] を参照してください。}}
  +
  +
=== 特定のインターフェイスあるいは IP からのアクセスに NFS を制限 ===
  +
  +
デフォルトでは {{ic|nfs-server.service}} を起動すると {{ic|/etc/exports}} とは関係なく全てのネットワークインターフェイスから接続を待機します。待機する IP あるいはホストネームを定義することで挙動を変更できます:
  +
  +
{{hc|/etc/nfs.conf|2=
  +
[nfsd]
  +
host=192.168.1.123
  +
# Alternatively, you can use your hostname.
  +
# host=myhostname
  +
}}
   
NFSv2 使用するクライアント (例えば U-Boot) のサポートが必要な場合、{{ic|/etc/conf.d/nfs-server.conf}} に {{ic|1=NFSD_OPTS="-V 2"}} を設定してください。
+
変更用するには {{ic|nfs-server.service}} を[[再起動]]してください。
   
===== ファイアウォール設定 =====
+
=== ファイアウォール設定 ===
   
 
ファイアウォールを通過してアクセスできるようにするには、デフォルト設定の場合 tcp と udp のポート 111, 2049, 20048 を開放する必要があります。{{ic|rpcinfo -p}} を使ってサーバーで使用しているポートを確認してください。この設定を [[iptables]] でするには、{{ic|/etc/iptables/iptables.rules}} を編集して以下の行を含めるようにしてください:
 
ファイアウォールを通過してアクセスできるようにするには、デフォルト設定の場合 tcp と udp のポート 111, 2049, 20048 を開放する必要があります。{{ic|rpcinfo -p}} を使ってサーバーで使用しているポートを確認してください。この設定を [[iptables]] でするには、{{ic|/etc/iptables/iptables.rules}} を編集して以下の行を含めるようにしてください:
125行目: 144行目:
 
変更を適用するために、{{ic|iptables}} サービスを再起動してください。
 
変更を適用するために、{{ic|iptables}} サービスを再起動してください。
   
  +
=== NFSv4 の ID マッピングが有効になっていることを確認 ===
=== クライアント ===
 
   
  +
idmapd が動作していても、マッピングが完全には有効になっていないことがあります。{{ic|/sys/module/nfsd/parameters/nfs4_disable_idmapping}} が {{ic|N}} になっている場合、以下のコマンドを実行することで有効にできます:
[[systemd#ユニットを使う|systemd]] を使って {{ic|rpcbind.service}}, {{ic|nfs-client.target}}, {{ic|remote-fs.target}} を起動して下さい。また、サービスを有効にして起動時に systemd がクライアントを起動するように設定することも推奨されています。このユニットは他のサービスも必要としますが、それらは [[systemd]] によって自動的に起動されます。
 
   
  +
# echo "N" | sudo tee /sys/module/nfsd/parameters/nfs4_disable_idmapping
3.12.7-2 以前のカーネルバージョン (例えば現在の {{pkg|linux-lts}}) のクライアントは {{ic|rpc-gssd.service}} を起動しなくてはなりません。そうしないとカーネルバグによって約15秒の遅延が発生して dmesg に "RPC: AUTH_GSS upcall timed out" というエラーが表示されます。
 
   
  +
変更を永続化するには[[カーネルモジュール#モジュールオプションを設定する|モジュールオプション]]で設定してください:
{{Note|サーバーはこのサービスを実行することを必要としません。}}
 
   
  +
{{hc|/etc/modprobe.d/nfsd.conf|<nowiki>
{{Warning|正しく設定を行わずにこのサービスを実行すると以下のようなエラーメッセージが表示されます:
 
  +
options nfsd nfs4_disable_idmapping=0
rpc.gssd[30473]: ERROR: Key table file '/etc/krb5.keytab' not found while beginning keytab scan for keytab 'FILE:/etc/krb5.keytab'
 
  +
</nowiki>}}
rpc.gssd[30473]: ERROR: gssd_refresh_krb5_machine_credential: no usable keytab entry found in keytab /etc/krb5.keytab for connection with host server.domain
 
rpc.gssd[30473]: ERROR: No credentials found for connection to server server.domain
 
そして頻繁にマウントとアンマウントを繰り返すとシステム上の NFS マウントがロックアップする可能性があります。
 
}}
 
 
または [https://bugzilla.redhat.com/show_bug.cgi?id=1001934 Red Hat の Bugzilla] に書かれているように {{ic|rpcsec_gss_krb5}} をブラックリストに入れます。
 
   
  +
== クライアント設定 ==
# echo "blacklist rpcsec_gss_krb5" > /etc/modprobe.d/rpcsec_gss_krb5-blacklist.conf
 
# reboot
 
   
  +
NFSv4 で [[Kerberos]] を使用する場合、{{ic|nfs-client.target}} も[[起動]]・[[有効化]]する必要があります。
==== systemd のエラー ====
 
   
  +
=== 手動マウント ===
起動時に "Dependency failed for pNFS block layout mapping daemon" という警告が表示されることがあります。親切な警告ですが起動するたびに systemd のメッセージが表示されてしまいます (基本的に NFS は問題なく動作します)。サービスが必要ない場合、systemd のサービスをマスクすることで無効にできます。
 
 
# systemctl mask nfs-blkmap.service
 
 
==== Linux からマウントする ====
 
   
 
NFSv3 の場合、次のコマンドを使ってサーバーのエクスポートされたファイルシステムを表示:
 
NFSv3 の場合、次のコマンドを使ってサーバーのエクスポートされたファイルシステムを表示:
157行目: 166行目:
   
 
NFSv4 の場合、root NFS ディレクトリをマウントして利用できるマウントを確認:
 
NFSv4 の場合、root NFS ディレクトリをマウントして利用できるマウントを確認:
$ mount server:/ /mountpoint/on/client
+
# mount server:/ /mountpoint/on/client
   
 
そしてサーバーの NFS エクスポートルートは省略してマウント:
 
そしてサーバーの NFS エクスポートルートは省略してマウント:
163行目: 172行目:
   
 
マウントが失敗する場合はサーバーのエクスポートルートを含めて見て下さい (Debian/RHEL/SLES では必須、ディストリビューションによっては {{ic|-t nfs}} ではなく {{ic|-t nfs4}}):
 
マウントが失敗する場合はサーバーのエクスポートルートを含めて見て下さい (Debian/RHEL/SLES では必須、ディストリビューションによっては {{ic|-t nfs}} ではなく {{ic|-t nfs4}}):
# mount -t nfs -o vers=4 servername:/full/path/to/music /mountpoint/on/client
+
# mount -t nfs -o vers=4 servername:/srv/nfs/music /mountpoint/on/client
   
 
{{Note|サーバーの名前は (IP アドレスではなく) ホストネームを指定する必要があります。それ以外だとリモート共有がハングアップします。}}
 
{{Note|サーバーの名前は (IP アドレスではなく) ホストネームを指定する必要があります。それ以外だとリモート共有がハングアップします。}}
   
===== /etc/fstab を使う =====
+
=== /etc/fstab を使う ===
   
 
クライアントを立ち上げたときにいつでも NFS 共有が使えるように、常に稼働させているサーバーでは [[fstab]] を利用すると便利です。{{ic|/etc/fstab}} ファイルを編集して、設定に合わせて適切な行を追加してください。また、サーバーの NFS エクスポートルートは省略します。
 
クライアントを立ち上げたときにいつでも NFS 共有が使えるように、常に稼働させているサーバーでは [[fstab]] を利用すると便利です。{{ic|/etc/fstab}} ファイルを編集して、設定に合わせて適切な行を追加してください。また、サーバーの NFS エクスポートルートは省略します。
   
 
{{hc|/etc/fstab|<nowiki>
 
{{hc|/etc/fstab|<nowiki>
servername:/music /mountpoint/on/client nfs4 rsize=8192,wsize=8192,timeo=14,_netdev 0 0
+
servername:/music /mountpoint/on/client nfs rsize=8192,wsize=8192,timeo=14,_netdev 0 0
 
</nowiki>}}
 
</nowiki>}}
   
  +
{{Note|マウントオプションについては {{man|5|nfs}} や {{man|8|mount}} を参照してください。}}
{{Note|Consult the ''NFS'' and ''mount'' man pages for more mount options.}}
 
   
 
マウントオプションの説明は以下の通り:
 
マウントオプションの説明は以下の通り:
   
; rsize と wsize: {{ic|rsize}} はサーバーから読み込むときに使用されるバイト数の値です。{{ic|wsize}} はサーバーに書き込むときのバイト数の値です。どちらもデフォルトは 1024 ですが、8192 などと値を高く設定することでスループットを改善できます。この値は汎用ではありません。値を変更した後にテストを行うことを推奨します、[[#パフォーマンスチューニング]] を見てさい。
+
; rsize と wsize: {{ic|rsize}} はサーバーから読み込むときに使用されるバイト数の値です。{{ic|wsize}} はサーバーに書き込むときのバイト数の値です。どちらもデフォルトは 1024 ですが、8192 などと値を高く設定することでスループットを改善できます。この値は汎用ではありません。値を変更した後にテストを行うことを推奨します、[[#パフォーマンスチューニング]]を見てください。
   
 
; timeo: {{ic|timeo}} は RPC タイムアウトの後に再送信を行うまで待機する時間の値です (10分の1秒単位)。最初にタイムアウトした後、再試行する度にタイムアウトの値は2倍になっていき、最大60秒になるか正式なタイムアウトになります。遅いサーバーやトラフィックの多いネットワークに接続する場合、このタイムアウトの値を増やすことでパフォーマンスが改善されるかもしれません。
 
; timeo: {{ic|timeo}} は RPC タイムアウトの後に再送信を行うまで待機する時間の値です (10分の1秒単位)。最初にタイムアウトした後、再試行する度にタイムアウトの値は2倍になっていき、最大60秒になるか正式なタイムアウトになります。遅いサーバーやトラフィックの多いネットワークに接続する場合、このタイムアウトの値を増やすことでパフォーマンスが改善されるかもしれません。
187行目: 196行目:
 
; minorversion: NFS バージョン 4.1 の Windows Server 2012 (Essentials) の共有をマウントするときは {{ic| <nowiki>minorversion=1</nowiki>}} を使います。
 
; minorversion: NFS バージョン 4.1 の Windows Server 2012 (Essentials) の共有をマウントするときは {{ic| <nowiki>minorversion=1</nowiki>}} を使います。
   
  +
{{Note|6番目のフィールド ({{ic|fs_passno}}) をゼロ以外の値に設定すると予期しない挙動が発生することがあります。例えば systemd で自動マウントしたときにチェックの待機が行われなくなります。}}
{{Note|Setting the sixth field (fs_passno) to a nonzero value may lead to unexpected behaviour, e.g. hangs when the systemd automount waits for a check which will never happen.}}
 
   
===== systemd で /etc/fstab を使う =====
+
=== systemd で /etc/fstab を使う ===
   
 
systemd の {{ic|automount}} サービスを使う方法もあります。接続が遮断されたり、復帰した時に素早くネットワークデバイスを再マウントするため、{{ic|_netdev}} よりも好ましいと思われます。さらに、autofs の問題も解決します、下の例を見て下さい:
 
systemd の {{ic|automount}} サービスを使う方法もあります。接続が遮断されたり、復帰した時に素早くネットワークデバイスを再マウントするため、{{ic|_netdev}} よりも好ましいと思われます。さらに、autofs の問題も解決します、下の例を見て下さい:
203行目: 212行目:
 
* {{ic|users}} マウントオプションはユーザーによるマウントを許可しますが、{{ic|noexec}} などのオプションも含まれているので注意してください。
 
* {{ic|users}} マウントオプションはユーザーによるマウントを許可しますが、{{ic|noexec}} などのオプションも含まれているので注意してください。
 
* {{ic|<nowiki>x-systemd.idle-timeout=1min</nowiki>}} オプションは NFS 共有が1分間使われなかったときに自動的にアンマウントします。ネットワークから突然切断する可能性があるノートパソコンなどで有用です。
 
* {{ic|<nowiki>x-systemd.idle-timeout=1min</nowiki>}} オプションは NFS 共有が1分間使われなかったときに自動的にアンマウントします。ネットワークから突然切断する可能性があるノートパソコンなどで有用です。
* NFS のせいでシャットダウンや再起動に時間がかかってしまうときは、{{ic|NetworkManager-wait-online.service}} を[[有効化]]して NFS ボリュームがアンマウントされる前に NetworkManager が終了しないようにしてください。
+
* NFS のせいでシャットダウンや再起動に時間がかかってしまうときは、{{ic|NetworkManager-wait-online.service}} を[[有効化]]して NFS ボリュームがアンマウントされる前に NetworkManager が終了しないようにしてください。それでもシャットダウンが長すぎる場合 {{ic|<nowiki>x-systemd.requires=network.target</nowiki>}} マウントオプションを追加してみてください。
 
}}
 
}}
   
 
{{Note|サーバーでも同じ方法で systemd で NFS 共有を自動マウントすると、データの量が多かった場合にフリーズする可能性があります。}}
 
{{Note|サーバーでも同じ方法で systemd で NFS 共有を自動マウントすると、データの量が多かった場合にフリーズする可能性があります。}}
   
===== autofs を使う =====
+
=== systemd ユニットとして ===
   
  +
{{ic|/etc/systemd/system}} 内に新しい {{ic|.mount}} ファイルを作成します。例:{{ic|mnt-home.mount}}。詳細は {{man|5|systemd.mount}} を参照してください。
複数のマシンを NFS で接続したい場合は [[autofs]] を使うのが便利です。サーバーだけでなくクライアントにもなることができます。他の簡単な方法よりもこの方法が推奨される理由は、サーバーの電源が落とされた時に、クライアントがNFS 共有を見つけられないことについてエラーを投げないからです。詳しくは [[autofs#NFS ネットワークマウント]] を見て下さい。
 
   
  +
{{Note|ファイル名が使用したいマウントポイントに対応していることを確認してください。
==== Windows からマウントする ====
 
  +
例えば、ユニット名 {{ic|mnt-home.mount}} は {{ic|/mnt/home}} の下に共有をマウントする場合にのみ使用できます。それ以外の場合、次のエラーが発生する可能性があります:{{ic|1=systemd[1]: mnt-home.mount: Where= setting does not match unit name. Refusing.}}。マウントポイントに非ASCII文字が含まれている場合は、[[Systemd#Writing unit files|systemd-escape]] を使用してください。}}
   
  +
{{ic|1=What=}} 共有へのパス
{{Note|"Client for NFS" が含まれているのは Windows 7 の Ultimate と Enterprise エディションや Windows 8 の Enterprise エディションだけです。}}
 
"Client for NFS" サービスが有効になっていれば Windows から NFS 共有をマウントできます (デフォルトでは有効になっていません)。
 
サービスをインストールするにはコントロールパネルの "Programs and features" から "Turn Windows features on or off" をクリックしてください。"Services for NFS" と副サービス ("Administrative tools" と "Client for NFS") を両方有効にします。
 
   
  +
{{ic|1=Where=}} 共有をマウントするパス
"Services for Network File System" (検索ボックスで探して下さい) を開いて ''client > properties'' を右クリックすることでグローバルオプションを設定できます。
 
   
  +
{{ic|1=Options=}} 共有のマウントオプション
{{Warning|パフォーマンスに深刻な問題が発生することがありますが (ギガビット LAN でもフォルダを表示するのに30から60秒ほどかかったり、ファイルのコピー速度が 2 MB/s になったりします)、Microsoft はまだ解決方法を用意できていません [https://social.technet.microsoft.com/Forums/en-CA/w7itpronetworking/thread/40cc01e3-65e4-4bb6-855e-cef1364a60ac]。}}
 
   
  +
{{Note|
エクスプローラーを使って共有をマウントするには:
 
  +
* ネットワークマウントユニットは自動的に {{ic|remote-fs-pre.target}}、{{ic|network.target}}、および {{ic|network-online.target}} に対して {{ic|After}} 依存関係を取得し、{{ic|nofail}} マウントオプションが設定されていない限り {{ic|remote-fs.target}} に対して {{ic|Before}} 依存関係を取得します。後者には {{ic|Wants}} ユニットも追加されます。
  +
* {{ic|Options}} に {{ic|noauto}} を [[追加]] して、ブート時の自動マウントを防ぎます(他のユニットによって引き込まれない限り)。
  +
* サーバーの IP アドレスではなくホスト名を使用したい場合、{{ic|1=After}} に {{ic|1=nss-lookup.target}} を追加します。これにより、ユニットのテスト時には発生しないブート時のマウントエラーを回避できるかもしれません。
  +
}}
   
  +
{{hc|/etc/systemd/system/mnt-home.mount|2=
{{ic|Computer}} > {{ic|Map network drive}} > {{ic|servername:/srv/nfs4/music}}
 
  +
[Unit]
  +
Description=Mount home at boot
   
  +
[Mount]
==== OS X からマウントする ====
 
  +
What=172.16.24.192:/home
  +
Where=/mnt/home
  +
Options=vers=4
  +
Type=nfs
  +
TimeoutSec=30
   
  +
[Install]
{{Note|OS X はデフォルトでセキュアでない (>1024) ポートを使って共有をマウントしません。}}
 
  +
WantedBy=multi-user.target
{{ic|insecure}} フラグを使って共有をエクスポートし、Finder でマウントする:
 
  +
}}
   
  +
{{Tip|システムが到達不能な場合、{{ic|1=ForceUnmount=true}} を {{ic|[Mount]}} に[[追加]]して、エクスポートを(強制的に)アンマウントできるようにします。}}
{{ic|Go}} > {{ic|Connect to Server}} > {{ic|nfs://servername/}}
 
   
  +
{{ic|mnt-home.mount}} を使用するには、ユニットを[[開始]]し、システムブート時に実行するように[[有効化]]します。
またはターミナルでセキュアなポートを使って共有をマウント:
 
# mount -t nfs -o resvport,nolocks,locallocks servername:/srv/nfs4 /Volumes/servername
 
   
  +
==== オートマウント ====
{{ic|nolocks}} と {{ic|locallocks}} オプションを使う理由については https://blogs.oracle.com/jag/entry/nfs_on_snow_leopard を見て下さい。
 
  +
  +
共有を自動的にマウントするには、次のオートマウントユニットを使用できます:
  +
  +
{{hc|/etc/systemd/system/mnt-home.automount|2=
  +
[Unit]
  +
Description=Automount home
  +
  +
[Automount]
  +
Where=/mnt/home
  +
  +
[Install]
  +
WantedBy=multi-user.target
  +
}}
  +
  +
{{ic|mnt-home.mount}} ユニットを[[無効化]]/[[停止]]し、{{ic|mnt-home.automount}} を[[有効化]]/[[開始]]して、マウントパスにアクセスされた際に共有を自動マウントします。
  +
  +
{{Tip|自動アンマウントを有効にするために {{ic|TimeoutIdleSec}} を[[追加]]します。詳細は {{man|5|systemd.automount}} を参照してください。}}
  +
  +
=== autofs を使う ===
  +
  +
複数のマシンを NFS で接続したい場合は [[autofs]] を使うのが便利です。サーバーだけでなくクライアントにもなることができます。他の簡単な方法よりもこの方法が推奨される理由は、サーバーの電源が落とされた時に、クライアントがNFS 共有を見つけられないことについてエラーを投げないからです。詳しくは [[autofs#NFS ネットワークマウント]] を見て下さい。
   
 
== ヒントとテクニック ==
 
== ヒントとテクニック ==
242行目: 282行目:
 
=== パフォーマンスチューニング ===
 
=== パフォーマンスチューニング ===
   
  +
{{Out of date|32ビットや2.6 Linux カーネルに言及しています...}}
NFS を使い倒すつもりならば、ネットワーク設定の要件を満たすように {{ic|rsize}} や {{ic|wsize}} マウントオプションを調整してするのが必須になります。
 
   
  +
クライアントの数が多いネットワークで NFS を使用する場合、デフォルトの NFS スレッド数を「8」から「16」やそれ以上に増やすことができます。これはサーバー/ネットワークの要件に応じて変わります:
=== systemd-networkd で共有を自動マウント ===
 
   
  +
{{hc|/etc/nfs.conf|2=
systemd-networkd を使っている場合、起動時に nfs がマウントされないことがあります。以下のようなエラーが表示されます:
 
  +
[nfsd]
mount[311]: mount.nfs4: Network is unreachable
 
  +
threads=16
  +
}}
  +
  +
NFS の性能を完全に発揮するには、ネットワーク設定にあわせて {{ic|rsize}} や {{ic|wsize}} マウントオプションを調整する必要があります。
  +
  +
最近の Linux カーネル (2.6.18 以上) ではメモリの容量によって NFS サーバーが使用できる I/O のサイズ (最大ブロックサイズ) が変わります。最大は 1M (1048576バイト) で、NFS クライアントがより大きな {{ic|rsize}} や {{ic|wsize}} を必要としている場合でもサーバーの最大ブロックサイズが使われます [https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/5/html/5.8_Technical_Notes/Known_Issues-kernel.html]。''nfsd'' を起動する前に {{ic|/proc/fs/nfsd/max_block_size}} に書き込むことでサーバーのデフォルト最大ブロックサイズを変更できます。例えば、以下のコマンドは昔のデフォルトの IO サイズであった 32k に設定します:
  +
  +
# echo 32767 > /proc/fs/nfsd/max_block_size
  +
  +
{{Note|これは主に、多数の nfsd スレッドを扱う際に 32 ビットサーバーで役立ちます。{{ic|max_block_size}} を小さくすると、現代のハードウェアでの NFS パフォーマンスが低下する可能性があります。}}
  +
  +
変更を永続化するには [[Systemd#一時ファイル|systemd-tmpfile]] を作成してください:
  +
  +
{{hc|/etc/tmpfiles.d/nfsd-block-size.conf|
  +
w /proc/fs/nfsd/max_block_size - - - - 32768}}
  +
  +
To mount with the increased {{ic|rsize}} and {{ic|wsize}} mount options:
  +
  +
{{ic|rsize}} と {{ic|wsize}} を増やしたマウントオプションでマウントするには:
  +
  +
# mount -t nfs -o rsize=32768,wsize=32768,vers=4 servername:/srv/nfs/music /mountpoint/on/client
  +
  +
さらに、NFS プロトコルに違反するにもかかわらず、{{ic|sync}} や {{ic|sync,no_wdelay}} の代わりに {{ic|async}} を設定すると、特に回転ディスクでは顕著なパフォーマンス向上が期待できるかもしれません。このオプションでエクスポートを設定し、{{ic|exportfs -arv}} を実行して適用します。
  +
  +
{{hc|/etc/exports|2=
  +
/srv/nfs 192.168.1.0/24(rw,async,crossmnt,fsid=0)
  +
/srv/nfs/music 192.168.1.0/24(rw,async)
  +
}}
   
  +
{{Warning|{{ic|async}} を使用すると、サーバーがクラッシュするか不正な再起動をすると、データの損失や破損のリスクがあります。}}
解決方法は簡単です。{{ic|systemd-networkd-wait-online.service}} を[[有効化]]して、ネットワークが完全に設定されるまで待機するように systemd を設定してください。サービスが平行して起動しなくなるので起動時間は多少長くなります。
 
   
 
=== 自動マウントの処理 ===
 
=== 自動マウントの処理 ===
257行目: 325行目:
 
NFS のマウントポイントが {{ic|/etc/fstab}} に正しく記述されていることを確認してください:
 
NFS のマウントポイントが {{ic|/etc/fstab}} に正しく記述されていることを確認してください:
   
{{hc|$ cat /etc/fstab|<nowiki>
+
{{hc|/etc/fstab|<nowiki>
 
lithium:/mnt/data /mnt/data nfs noauto,noatime,rsize=32768,wsize=32768 0 0
 
lithium:/mnt/data /mnt/data nfs noauto,noatime,rsize=32768,wsize=32768 0 0
 
lithium:/var/cache/pacman /var/cache/pacman nfs noauto,noatime,rsize=32768,wsize=32768 0 0</nowiki>
 
lithium:/var/cache/pacman /var/cache/pacman nfs noauto,noatime,rsize=32768,wsize=32768 0 0</nowiki>
309行目: 377行目:
 
done
 
done
 
</nowiki>}}
 
</nowiki>}}
  +
  +
スクリプトに実行権限を付与:
   
 
# chmod +x /usr/local/bin/auto_share
 
# chmod +x /usr/local/bin/auto_share
   
cron エントリか systemd/タイマーを作成して、共有サーバーにアクセスできるか1分ごとに確認するようにしてください。
+
[[cron]] エントリか [[systemd/タイマー|systemd タイマー]]を作成して、共有サーバーにアクセスできるか1分ごとに確認するようにしてください。
   
 
==== Cron ====
 
==== Cron ====
321行目: 391行目:
   
 
==== systemd/タイマー ====
 
==== systemd/タイマー ====
  +
  +
以下のユニットを作成:
   
 
{{hc|# /etc/systemd/system/auto_share.timer|<nowiki>
 
{{hc|# /etc/systemd/system/auto_share.timer|<nowiki>
330行目: 402行目:
   
 
[Install]
 
[Install]
WantedBy=timer.target
+
WantedBy=timers.target
 
</nowiki>}}
 
</nowiki>}}
   
342行目: 414行目:
 
</nowiki>}}
 
</nowiki>}}
   
# systemctl enable auto_share.timer
+
作成したら {{ic|auto_share.timer}} を[[有効化]]してください。
   
 
==== systemd で起動時にマウント ====
 
==== systemd で起動時にマウント ====
364行目: 436行目:
 
{{ic|auto_share.service}} を[[有効化]]してください。
 
{{ic|auto_share.service}} を[[有効化]]してください。
   
==== NetworkManager dispatcher ====
+
==== NetworkManager dispatcher を使う ====
   
 
上で説明している方法に加えて、ネットワークの状態が変わった時にスクリプトを実行するよう NetworkManager を設定することもできます。
 
上で説明している方法に加えて、ネットワークの状態が変わった時にスクリプトを実行するよう NetworkManager を設定することもできます。
372行目: 444行目:
 
ネットワーク状態の変化にあわせてネットワーク上の共有をマウントする一番簡単な方法は {{ic|auto_share}} スクリプトにシンボリックリンクを作成することです:
 
ネットワーク状態の変化にあわせてネットワーク上の共有をマウントする一番簡単な方法は {{ic|auto_share}} スクリプトにシンボリックリンクを作成することです:
   
# ln -s /usr/local/bin/auto_share /etc/NetworkManager/dispatcher.d/30_nfs.sh
+
# ln -s /usr/local/bin/auto_share /etc/NetworkManager/dispatcher.d/30-nfs.sh
   
 
ただし、特定の場合では、ネットワーク接続が無効になった後にアンマウントが実行され、KDE Plasma アプレットがフリーズしたりすることがあります。
 
ただし、特定の場合では、ネットワーク接続が無効になった後にアンマウントが実行され、KDE Plasma アプレットがフリーズしたりすることがあります。
378行目: 450行目:
 
以下のスクリプトを使うことでネットワーク接続が切れる前に NFS 共有を安全にアンマウントすることができます:
 
以下のスクリプトを使うことでネットワーク接続が切れる前に NFS 共有を安全にアンマウントすることができます:
   
{{hc|/etc/NetworkManager/dispatcher.d/30_nfs.sh|<nowiki>
+
{{hc|/etc/NetworkManager/dispatcher.d/30-nfs.sh|<nowiki>
 
#!/bin/bash
 
#!/bin/bash
   
402行目: 474行目:
 
</nowiki>}}
 
</nowiki>}}
 
スクリプトに実行可能属性を付与:
 
スクリプトに実行可能属性を付与:
# chmod +x /etc/NetworkManager/dispatcher.d/30_nfs.sh
+
# chmod +x /etc/NetworkManager/dispatcher.d/30-nfs.sh
 
{{ic|/etc/NetworkManager/dispatcher.d/pre-down}} にシンボリックリンクを作成して {{ic|pre-down}} イベントをキャッチ:
 
{{ic|/etc/NetworkManager/dispatcher.d/pre-down}} にシンボリックリンクを作成して {{ic|pre-down}} イベントをキャッチ:
# ln -s /etc/NetworkManager/dispatcher.d/30_nfs.sh /etc/NetworkManager/dispatcher.d/pre-down.d/30_nfs.sh
+
# ln -s /etc/NetworkManager/dispatcher.d/30-nfs.sh /etc/NetworkManager/dispatcher.d/pre-down.d/30-nfs.sh
   
 
上記のスクリプトは別の接続で別の共有をマウントするように修正することができます。
 
上記のスクリプトは別の接続で別の共有をマウントするように修正することができます。
   
[[NetworkManager#dispatcher を使って CIFS 共有のマウントを処理]] を参照。
+
[[NetworkManager#dispatcher を使って CIFS 共有のマウントを処理]]を参照。
  +
  +
=== TLS 暗号化 ===
  +
  +
Linux 6.5 からは、{{ic|1=xprtsec=tls}} マウントオプションを使用して NFS トラフィックを TLS で暗号化することができます。始めるには、クライアントとサーバーに {{AUR|ktls-utils}} パッケージをインストールし、以下の設定手順に従ってください。
  +
  +
==== サーバー ====
  +
  +
プライベートキーを作成し、サーバーの DNS 名を含む証明書を取得します(詳細は [[Transport Layer Security#証明書を取得|Transport Layer Security]] を参照)。これらのファイルをシステムの信頼ストアに追加する必要はありません。
  +
  +
{{Note|自己署名証明書を暗号化したものは現在サポートされておらず、マウント失敗の原因となります。}}
  +
  +
{{ic|/etc/tlshd.conf}} を編集して、{{ic|x509.certificate}} と {{ic|x509.private_key}} に自分の値を使用してこれらのファイルを利用します。
  +
{{hc|/etc/tlshd.conf|2=
  +
[authenticate.server]
  +
x509.certificate= /etc/nfsd-certificate.pem
  +
x509.private_key= /etc/nfsd-private-key.pem
  +
}}
  +
  +
そして、{{ic|tlshd.service}} を[[開始]]して[[有効化]]します。
  +
  +
==== クライアント ====
  +
  +
前の手順で生成したサーバーの TLS 証明書をシステムの信頼ストアに追加します(詳細は [[Transport Layer Security#Add a certificate to a trust store|トランスポート層セキュリティ]] を参照)。
  +
  +
{{ic|tlshd.service}} を[[開始]]して[[有効化]]します。
  +
  +
これで、サーバーの DNS 名を使用してサーバーをマウントすることができるはずです:
  +
  +
# mount -o xprtsec=tls ''servername.domain'':/ ''/mountpoint/on/client''
  +
  +
クライアント上の journalctl を確認すると、TLS ハンドシェイクが成功したことが表示されるはずです:
  +
  +
{{hc|$ journalctl -b -u tlshd.service|
  +
Sep 28 11:14:46 client tlshd[227]: Built from ktls-utils 0.10 on Sep 26 2023 14:24:03
  +
Sep 28 11:15:37 client tlshd[571]: Handshake with servername.domain (192.168.122.100) was successful
  +
}}
   
 
== トラブルシューティング ==
 
== トラブルシューティング ==
   
[[NFS/トラブルシューティング]] を参照してください。
+
[[NFS/トラブルシューティング]]を参照してください。
   
 
== 参照 ==
 
== 参照 ==
   
  +
* NFS 共有の自動検出を可能にする Zeroconf 実装である [[Avahi]] も参照してください。
* [http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.prftungd/doc/prftungd/nfs_perf.htm NFS Performance Management]
 
  +
* HOWTO: [[ディスクレスシステム]]
* [http://blogs.msdn.com/sfu/archive/2008/04/14/all-well-almost-about-client-for-nfs-configuration-and-performance.aspx Microsoft Services for Unix NFS Client info]
 
  +
* [https://web.archive.org/web/20201111215940/https://docs.microsoft.com/en-us/archive/blogs/msdn/sfu/all-well-almost-about-client-for-nfs-configuration-and-performance/ Microsoft Services for Unix NFS Client info]
* [https://blogs.oracle.com/jag/entry/nfs_on_snow_leopard NFS on Snow Leopard]
 
  +
* [https://web.archive.org/web/20151212160906/https://blogs.oracle.com/jag/entry/nfs_on_snow_leopard NFS on Snow Leopard]
  +
* http://chschneider.eu/linux/server/nfs.shtml
  +
* [https://www.slashroot.in/how-do-linux-nfs-performance-tuning-and-optimization How to do Linux NFS Performance Tuning and Optimization]
  +
* [https://www.cyberciti.biz/faq/linux-unix-tuning-nfs-server-client-performance/ Linux: Tune NFS Performance]
  +
* [https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/storage_administration_guide/nfs-serverconfig#nfs4-only Configuring an NFSv4-only Server]
  +
  +
{{TranslationStatus|NFS|2024-04-19|805216}}

2024年4月19日 (金) 19:55時点における最新版

関連記事

Wikipedia より:

Network File System (NFS) はローカルストレージにアクセスするのと同じようにネットワーク上のファイルにクライアントコンピュータでアクセスできるようにする分散ファイルシステムおよびそのプロトコルである。1984年に Sun Microsystems によって開発された。
ノート:
  • NFS は暗号化されません。機密情報を扱うときは KerberosTinc などの暗号化プロトコルを使って NFS をトンネル化してください。
  • Samba とは異なり、NFS にはデフォルトでユーザー認証がありません。クライアントのアクセスは IP アドレスやホストネームで制限します。
  • NFS では、クライアントとサーバーの両方で ユーザー および/または ユーザーグループ ID が同じであることを期待しています(Kerberos を使用していない場合)。#idmapping を有効化するか、/etc/exportsanonuid/anongidall_squash を一緒に使用して UID/GID を手動で上書きしてください。
  • NFS は POSIX ACLs をサポートしていません。NFS サーバーは引き続き ACL を強制しますが、クライアントはそれらを見たり変更したりすることができません。

インストール

クライアントとサーバーどちらでも必要なのは nfs-utils パッケージのインストールだけです。

クライアント・サーバーの時計を一致させるために全てのノードで時刻同期デーモンを使うことが強く推奨されます。全てのノードで時計が正確でないと、NFS は望ましくない遅延を生じさせる可能性があります。

サーバー設定

グローバル設定オプションは /etc/nfs.conf で設定されます。単純な設定を使用するユーザーはこのファイルを編集する必要はありません。

NFS サーバーは、共有するディレクトリのリストが必要で、/etc/exports または /etc/exports.d/*.exports に定義する必要があります(詳細は exports(5) を参照)。デフォルトでは、ディレクトリはそのパスのままエクスポートされます。例えば:

/etc/exports
/data/music    192.168.1.0/24(rw)

上記の設定により、ディレクトリ /data/music は NFSv3 および NFSv4 で MyServer:/data/music としてマウント可能になります。

カスタムエクスポートルート

共有はいわゆる NFS ルートからの相対パスになります。セキュリティ上、NFS ルートを定義するときはサーバーのルートファイルシステム下の専用のディレクトリツリーを使用して、ユーザーからマウントポイントへのアクセスを制限すると良いでしょう。バインドマウントは、共有マウントポイントを ファイルシステム 上の実際のディレクトリにリンクするために使用されます。過去には NFSv4 で NFS ルートが必須でしたが、現在はオプションです(カーネル 2.6.33 および nfs-utils 1.2.2 から、仮想ルートが実装されています)。

下の例では以下の設定を使用します:

  1. NFS ルートは /srv/nfs
  2. エクスポートは /srv/nfs/music/mnt/music にバインドマウントする。
# mkdir -p /srv/nfs/music /mnt/music
# mount --bind /mnt/music /srv/nfs/music
ノート: ZFS ファイルシステムの場合、バインドマウントの使い方が特殊です。ZFS#バインドマウントを見てください。

サーバーを再起動してもマウントされるように、バインドマウントを fstab に追加:

/etc/fstab
/mnt/music /srv/nfs/music  none   bind   0   0

CIDR によるアドレス指定またはホストネームを使ってマウントを許可するクライアントマシンを制限するには /etc/exports に以下のように共有ディレクトリを追加:

/etc/exports
/srv/nfs        192.168.1.0/24(rw,fsid=root)
/srv/nfs/music  192.168.1.0/24(rw,sync)
/srv/nfs/home   192.168.1.0/24(rw,sync)
/srv/nfs/public 192.168.1.0/24(ro,all_squash,insecure) desktop(rw,sync,all_squash,anonuid=99,anongid=99) # map to user/group - in this case nobody

NFSv4 を使用する場合、オプション fsid=root または fsid=0 は「ルート」エクスポートを示します。そのようなエクスポートが存在する場合、他のすべてのディレクトリはそれ以下でなければなりません。/etc/nfs.conf ファイルの rootdir オプションはこれに影響しません。fsid=0 エクスポートがない場合のデフォルトの動作は、NFSv3 と同じように動作することです。

上記の例では、/srv/nfs がルートとして指定されているため、エクスポート /srv/nfs/music は NFSv4 を介して MyServer:/music としてマウント可能になります - ルートプレフィックスは省略されることに注意してください。

ヒント:
  • NFSv3 には必要ですが NFSv4 には必要ない crossmnt オプションは、crossmnt でマークされたファイルシステム上にマウントされた 全ての ファイルシステムにクライアントがアクセスできるようにします。クライアントはすべての子エクスポートを別々にマウントする必要がありません。ただし、異なるアドレス範囲で子が共有されている場合、これは望ましくないかもしれません。
  • crossmnt の代わりに、子エクスポートに nohide オプションを使用すると、クライアントがルートエクスポートをマウントするときに自動的にマウントされます。crossmnt と異なり、nohide は子エクスポートのアドレス範囲を尊重します。このオプションも NFSv3 固有であり、NFSv4 は常に nohide が有効であるかのように振る舞います。
  • insecure オプションは、クライアントが 1023 番以上のポートから接続できるようにします。(通常、ルートユーザーのみが低番号ポートを使用できるため、デフォルトで他のポートをブロックすることはアクセスへの表面的な障壁を作ります。実際には insecure オプションを省略しても含めても、セキュリティに有意な改善または悪化はありません。)
  • アスタリスク (*) を使用して、任意のインターフェースからのアクセスを許可します。

サーバー実行中に /etc/exports を変更した場合は再度エクスポートしないと変更が適用されないので注意してください:

# exportfs -rav

現在ロードされているエクスポートの状態をより詳細に見るには、以下を使用する:

# exportfs -v

利用可能なオプションについて詳しくは exports(5) を参照してください。

ヒント: IP の範囲を CIDR 表記に変換するツールとして ip2cidr が存在します。
ノート: エクスポート先が tmpfs ファイルシステムの場合、fsid=1 オプションが必要です。

サーバーを起動する

  • NFSv3 および NFSv4 サービスを提供するには、nfs-server.service開始して有効化します。
  • NFSv4 サービスのみを提供するには、nfsv4-server.service開始して有効化します。

プロトコルバージョン 4 のエクスポートを使用するユーザーは、不要なサービスが実行されないように、最低限 rpcbind.servicerpcbind.socketマスクすることを望むでしょう。詳細は FS#76453 を参照してください。また、何らかの理由で引き込まれた nfs-server.service もマスクすることを検討してください。

ノート: ZFS シェアをエクスポートする場合は、zfs-share.service開始/有効化 してください。これを行わないと、再起動後に ZFS シェアがエクスポートされなくなります。詳細は ZFS#NFS を参照してください。

特定のインターフェイスあるいは IP からのアクセスに NFS を制限

デフォルトでは nfs-server.service を起動すると /etc/exports とは関係なく全てのネットワークインターフェイスから接続を待機します。待機する IP あるいはホストネームを定義することで挙動を変更できます:

/etc/nfs.conf
[nfsd]
host=192.168.1.123
# Alternatively, you can use your hostname.
# host=myhostname

変更を適用するには nfs-server.service再起動してください。

ファイアウォール設定

ファイアウォールを通過してアクセスできるようにするには、デフォルト設定の場合 tcp と udp のポート 111, 2049, 20048 を開放する必要があります。rpcinfo -p を使ってサーバーで使用しているポートを確認してください。この設定を iptables でするには、/etc/iptables/iptables.rules を編集して以下の行を含めるようにしてください:

/etc/iptables/iptables.rules
-A INPUT -p tcp -m tcp --dport 111 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 2049 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 20048 -j ACCEPT
-A INPUT -p udp -m udp --dport 111 -j ACCEPT
-A INPUT -p udp -m udp --dport 2049 -j ACCEPT
-A INPUT -p udp -m udp --dport 20048 -j ACCEPT

NFSv3 と、上記の rpc.statdlockd の固定ポートを使用している場合は、それらも設定に追加してください:

/etc/iptables/iptables.rules
-A INPUT -p tcp -m tcp --dport 32765 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 32803 -j ACCEPT
-A INPUT -p udp -m udp --dport 32765 -j ACCEPT
-A INPUT -p udp -m udp --dport 32803 -j ACCEPT

v4 以上だけを使う構成の場合、開く必要があるのは tcp ポート 2049 だけです。したがって、必要な行は一行だけになります:

/etc/iptables/iptables.rules
-A INPUT -p tcp -m tcp --dport 2049 -j ACCEPT

変更を適用するために、iptables サービスを再起動してください。

NFSv4 の ID マッピングが有効になっていることを確認

idmapd が動作していても、マッピングが完全には有効になっていないことがあります。/sys/module/nfsd/parameters/nfs4_disable_idmappingN になっている場合、以下のコマンドを実行することで有効にできます:

# echo "N" | sudo tee /sys/module/nfsd/parameters/nfs4_disable_idmapping

変更を永続化するにはモジュールオプションで設定してください:

/etc/modprobe.d/nfsd.conf
options nfsd nfs4_disable_idmapping=0

クライアント設定

NFSv4 で Kerberos を使用する場合、nfs-client.target起動有効化する必要があります。

手動マウント

NFSv3 の場合、次のコマンドを使ってサーバーのエクスポートされたファイルシステムを表示:

$ showmount -e servername

NFSv4 の場合、root NFS ディレクトリをマウントして利用できるマウントを確認:

# mount server:/ /mountpoint/on/client

そしてサーバーの NFS エクスポートルートは省略してマウント:

# mount -t nfs -o vers=4 servername:/music /mountpoint/on/client

マウントが失敗する場合はサーバーのエクスポートルートを含めて見て下さい (Debian/RHEL/SLES では必須、ディストリビューションによっては -t nfs ではなく -t nfs4):

# mount -t nfs -o vers=4 servername:/srv/nfs/music /mountpoint/on/client
ノート: サーバーの名前は (IP アドレスではなく) ホストネームを指定する必要があります。それ以外だとリモート共有がハングアップします。

/etc/fstab を使う

クライアントを立ち上げたときにいつでも NFS 共有が使えるように、常に稼働させているサーバーでは fstab を利用すると便利です。/etc/fstab ファイルを編集して、設定に合わせて適切な行を追加してください。また、サーバーの NFS エクスポートルートは省略します。

/etc/fstab
servername:/music  /mountpoint/on/client  nfs   rsize=8192,wsize=8192,timeo=14,_netdev 0 0
ノート: マウントオプションについては nfs(5)mount(8) を参照してください。

マウントオプションの説明は以下の通り:

rsize と wsize
rsize はサーバーから読み込むときに使用されるバイト数の値です。wsize はサーバーに書き込むときのバイト数の値です。どちらもデフォルトは 1024 ですが、8192 などと値を高く設定することでスループットを改善できます。この値は汎用ではありません。値を変更した後にテストを行うことを推奨します、#パフォーマンスチューニングを見てください。
timeo
timeo は RPC タイムアウトの後に再送信を行うまで待機する時間の値です (10分の1秒単位)。最初にタイムアウトした後、再試行する度にタイムアウトの値は2倍になっていき、最大60秒になるか正式なタイムアウトになります。遅いサーバーやトラフィックの多いネットワークに接続する場合、このタイムアウトの値を増やすことでパフォーマンスが改善されるかもしれません。
_netdev
_netdev オプションは共有をマウントする前にネットワークが立ち上がるまで待機するようシステムに通知するオプションです。systemd は NFS がこのオプションを使うことを想定していますが、どんな形式のネットワークファイルシステムであれ、このオプションを使うことはグッドプラクティスと言えます。
minorversion
NFS バージョン 4.1 の Windows Server 2012 (Essentials) の共有をマウントするときは minorversion=1 を使います。
ノート: 6番目のフィールド (fs_passno) をゼロ以外の値に設定すると予期しない挙動が発生することがあります。例えば systemd で自動マウントしたときにチェックの待機が行われなくなります。

systemd で /etc/fstab を使う

systemd の automount サービスを使う方法もあります。接続が遮断されたり、復帰した時に素早くネットワークデバイスを再マウントするため、_netdev よりも好ましいと思われます。さらに、autofs の問題も解決します、下の例を見て下さい:

/etc/fstab
servername:/home  /mountpoint/on/client  nfs  noauto,x-systemd.automount,x-systemd.device-timeout=10,timeo=14,x-systemd.idle-timeout=1min 0 0

systemd が fstab の変更に気づくようにクライアントを再起動する必要があります。もしくは、systemd をリロードして mountpoint-on-client.automount を再起動して /etc/fstab の設定を再読み込みしてください。

ヒント:
  • 上記の noauto はアクセスされるまで NFS 共有をマウントしません: いますぐに利用できるようにしたいときは auto を使って下さい。
    ネットワークが立ち上がってなかったり利用できないことが理由でマウントが失敗する問題が発生するときは、NetworkManager-wait-online.service有効にします: このサービスは有効化される前に network.target の全てのリンクが利用可能になることを保証します。
  • users マウントオプションはユーザーによるマウントを許可しますが、noexec などのオプションも含まれているので注意してください。
  • x-systemd.idle-timeout=1min オプションは NFS 共有が1分間使われなかったときに自動的にアンマウントします。ネットワークから突然切断する可能性があるノートパソコンなどで有用です。
  • NFS のせいでシャットダウンや再起動に時間がかかってしまうときは、NetworkManager-wait-online.service有効化して NFS ボリュームがアンマウントされる前に NetworkManager が終了しないようにしてください。それでもシャットダウンが長すぎる場合 x-systemd.requires=network.target マウントオプションを追加してみてください。
ノート: サーバーでも同じ方法で systemd で NFS 共有を自動マウントすると、データの量が多かった場合にフリーズする可能性があります。

systemd ユニットとして

/etc/systemd/system 内に新しい .mount ファイルを作成します。例:mnt-home.mount。詳細は systemd.mount(5) を参照してください。

ノート: ファイル名が使用したいマウントポイントに対応していることを確認してください。 例えば、ユニット名 mnt-home.mount/mnt/home の下に共有をマウントする場合にのみ使用できます。それ以外の場合、次のエラーが発生する可能性があります:systemd[1]: mnt-home.mount: Where= setting does not match unit name. Refusing.。マウントポイントに非ASCII文字が含まれている場合は、systemd-escape を使用してください。

What= 共有へのパス

Where= 共有をマウントするパス

Options= 共有のマウントオプション

ノート:
  • ネットワークマウントユニットは自動的に remote-fs-pre.targetnetwork.target、および network-online.target に対して After 依存関係を取得し、nofail マウントオプションが設定されていない限り remote-fs.target に対して Before 依存関係を取得します。後者には Wants ユニットも追加されます。
  • Optionsnoauto追加 して、ブート時の自動マウントを防ぎます(他のユニットによって引き込まれない限り)。
  • サーバーの IP アドレスではなくホスト名を使用したい場合、Afternss-lookup.target を追加します。これにより、ユニットのテスト時には発生しないブート時のマウントエラーを回避できるかもしれません。
/etc/systemd/system/mnt-home.mount
[Unit]
Description=Mount home at boot

[Mount]
What=172.16.24.192:/home
Where=/mnt/home
Options=vers=4
Type=nfs
TimeoutSec=30

[Install]
WantedBy=multi-user.target
ヒント: システムが到達不能な場合、ForceUnmount=true[Mount]追加して、エクスポートを(強制的に)アンマウントできるようにします。

mnt-home.mount を使用するには、ユニットを開始し、システムブート時に実行するように有効化します。

オートマウント

共有を自動的にマウントするには、次のオートマウントユニットを使用できます:

/etc/systemd/system/mnt-home.automount
[Unit]
Description=Automount home

[Automount]
Where=/mnt/home

[Install]
WantedBy=multi-user.target

mnt-home.mount ユニットを無効化/停止し、mnt-home.automount有効化/開始して、マウントパスにアクセスされた際に共有を自動マウントします。

ヒント: 自動アンマウントを有効にするために TimeoutIdleSec追加します。詳細は systemd.automount(5) を参照してください。

autofs を使う

複数のマシンを NFS で接続したい場合は autofs を使うのが便利です。サーバーだけでなくクライアントにもなることができます。他の簡単な方法よりもこの方法が推奨される理由は、サーバーの電源が落とされた時に、クライアントがNFS 共有を見つけられないことについてエラーを投げないからです。詳しくは autofs#NFS ネットワークマウント を見て下さい。

ヒントとテクニック

パフォーマンスチューニング

この記事またはセクションは情報が古くなっています。
理由: 32ビットや2.6 Linux カーネルに言及しています... (Discuss)

クライアントの数が多いネットワークで NFS を使用する場合、デフォルトの NFS スレッド数を「8」から「16」やそれ以上に増やすことができます。これはサーバー/ネットワークの要件に応じて変わります:

/etc/nfs.conf
[nfsd]
threads=16

NFS の性能を完全に発揮するには、ネットワーク設定にあわせて rsizewsize マウントオプションを調整する必要があります。

最近の Linux カーネル (2.6.18 以上) ではメモリの容量によって NFS サーバーが使用できる I/O のサイズ (最大ブロックサイズ) が変わります。最大は 1M (1048576バイト) で、NFS クライアントがより大きな rsizewsize を必要としている場合でもサーバーの最大ブロックサイズが使われます [1]nfsd を起動する前に /proc/fs/nfsd/max_block_size に書き込むことでサーバーのデフォルト最大ブロックサイズを変更できます。例えば、以下のコマンドは昔のデフォルトの IO サイズであった 32k に設定します:

# echo 32767 > /proc/fs/nfsd/max_block_size
ノート: これは主に、多数の nfsd スレッドを扱う際に 32 ビットサーバーで役立ちます。max_block_size を小さくすると、現代のハードウェアでの NFS パフォーマンスが低下する可能性があります。

変更を永続化するには systemd-tmpfile を作成してください:

/etc/tmpfiles.d/nfsd-block-size.conf
w /proc/fs/nfsd/max_block_size - - - - 32768

To mount with the increased rsize and wsize mount options:

rsizewsize を増やしたマウントオプションでマウントするには:

# mount -t nfs -o rsize=32768,wsize=32768,vers=4 servername:/srv/nfs/music /mountpoint/on/client

さらに、NFS プロトコルに違反するにもかかわらず、syncsync,no_wdelay の代わりに async を設定すると、特に回転ディスクでは顕著なパフォーマンス向上が期待できるかもしれません。このオプションでエクスポートを設定し、exportfs -arv を実行して適用します。

/etc/exports
/srv/nfs        192.168.1.0/24(rw,async,crossmnt,fsid=0)
/srv/nfs/music  192.168.1.0/24(rw,async)
警告: async を使用すると、サーバーがクラッシュするか不正な再起動をすると、データの損失や破損のリスクがあります。

自動マウントの処理

ローカルのワイヤレスネットワークから nfs 共有を使う必要があるノートパソコンでこの設定は役に立ちます。nfs ホストが到達できない状態になったとき、nfs 共有はアンマウントされ、hard マウントオプションを使っている際にシステムフリーズが起こらなくなります。https://bbs.archlinux.org/viewtopic.php?pid=1260240#p1260240 を参照。

NFS のマウントポイントが /etc/fstab に正しく記述されていることを確認してください:

/etc/fstab
lithium:/mnt/data          /mnt/data         nfs noauto,noatime,rsize=32768,wsize=32768 0 0
lithium:/var/cache/pacman  /var/cache/pacman nfs noauto,noatime,rsize=32768,wsize=32768 0 0

noauto マウントオプションは起動時に自動的に共有をマウントしないように systemd に命じます。これを設定していないとネットワーク上に共有が存在するかどうかわからないのに systemd が共有をマウントしようとしてブート中にブランクスクリーンで止まってしまいます。

root 以外のユーザー user で NFS 共有をマウントするには fstab にエントリを追加する必要があります。

cron を使って NFS ホストが到達可能なチェックする auto_share スクリプトを作成:

/usr/local/bin/auto_share
#!/bin/bash

function net_umount {
  umount -l -f $1 &>/dev/null
}

function net_mount {
  mountpoint -q $1 || mount $1
}

NET_MOUNTS=$(sed -e '/^.*#/d' -e '/^.*:/!d' -e 's/\t/ /g' /etc/fstab | tr -s " ")$'\n'b

printf %s "$NET_MOUNTS" | while IFS= read -r line
do
  SERVER=$(echo $line | cut -f1 -d":")
  MOUNT_POINT=$(echo $line | cut -f2 -d" ")

  # Check if server already tested
  if [[ "${server_ok[@]}" =~ "${SERVER}" ]]; then
    # The server is up, make sure the share are mounted
    net_mount $MOUNT_POINT
  elif [[ "${server_notok[@]}" =~ "${SERVER}" ]]; then
    # The server could not be reached, unmount the share
    net_umount $MOUNT_POINT
  else
    # Check if the server is reachable
    ping -c 1 "${SERVER}" &>/dev/null

    if [ $? -ne 0 ]; then
      server_notok[${#Unix[@]}]=$SERVER
      # The server could not be reached, unmount the share
      net_umount $MOUNT_POINT
    else
      server_ok[${#Unix[@]}]=$SERVER
      # The server is up, make sure the share are mounted
      net_mount $MOUNT_POINT
    fi
  fi
done

スクリプトに実行権限を付与:

# chmod +x /usr/local/bin/auto_share

cron エントリか systemd タイマーを作成して、共有サーバーにアクセスできるか1分ごとに確認するようにしてください。

Cron

# crontab -e
* * * * * /usr/local/bin/auto_share

systemd/タイマー

以下のユニットを作成:

# /etc/systemd/system/auto_share.timer
[Unit]
Description=Check the network mounts

[Timer]
OnCalendar=*-*-* *:*:00

[Install]
WantedBy=timers.target
# /etc/systemd/system/auto_share.service
[Unit]
Description=Check the network mounts

[Service]
Type=simple
ExecStart=/usr/local/bin/auto_share

作成したら auto_share.timer有効化してください。

systemd で起動時にマウント

systemd のユニットファイルを使って起動時に NFS 共有をマウントすることも可能です。クライアントに NetworkManager がインストール・設定されている場合はユニットファイルは必要ありません。#NetworkManager dispatcher を見て下さい。

/etc/systemd/system/auto_share.service
[Unit]
Description=NFS automount
After=syslog.target network.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/bin/auto_share

[Install]
WantedBy=multi-user.target

auto_share.service有効化してください。

NetworkManager dispatcher を使う

上で説明している方法に加えて、ネットワークの状態が変わった時にスクリプトを実行するよう NetworkManager を設定することもできます。

NetworkManager-dispatcher サービスを有効化・起動してください。

ネットワーク状態の変化にあわせてネットワーク上の共有をマウントする一番簡単な方法は auto_share スクリプトにシンボリックリンクを作成することです:

# ln -s /usr/local/bin/auto_share /etc/NetworkManager/dispatcher.d/30-nfs.sh

ただし、特定の場合では、ネットワーク接続が無効になった後にアンマウントが実行され、KDE Plasma アプレットがフリーズしたりすることがあります。

以下のスクリプトを使うことでネットワーク接続が切れる前に NFS 共有を安全にアンマウントすることができます:

/etc/NetworkManager/dispatcher.d/30-nfs.sh
#!/bin/bash

# Find the connection UUID with "nmcli con show" in terminal.
# All NetworkManager connection types are supported: wireless, VPN, wired...
WANTED_CON_UUID="CHANGE-ME-NOW-9c7eff15-010a-4b1c-a786-9b4efa218ba9"

if [[ "$CONNECTION_UUID" == "$WANTED_CON_UUID" ]]; then

    # Script parameter $1: NetworkManager connection name, not used
    # Script parameter $2: dispatched event
    
    case "$2" in
        "up")
            mount -a -t nfs4,nfs
            ;;
        "pre-down");&
        "vpn-pre-down")
            umount -l -a -t nfs4,nfs >/dev/null
            ;;
    esac
fi

スクリプトに実行可能属性を付与:

# chmod +x /etc/NetworkManager/dispatcher.d/30-nfs.sh

/etc/NetworkManager/dispatcher.d/pre-down にシンボリックリンクを作成して pre-down イベントをキャッチ:

# ln -s /etc/NetworkManager/dispatcher.d/30-nfs.sh /etc/NetworkManager/dispatcher.d/pre-down.d/30-nfs.sh

上記のスクリプトは別の接続で別の共有をマウントするように修正することができます。

NetworkManager#dispatcher を使って CIFS 共有のマウントを処理を参照。

TLS 暗号化

Linux 6.5 からは、xprtsec=tls マウントオプションを使用して NFS トラフィックを TLS で暗号化することができます。始めるには、クライアントとサーバーに ktls-utilsAUR パッケージをインストールし、以下の設定手順に従ってください。

サーバー

プライベートキーを作成し、サーバーの DNS 名を含む証明書を取得します(詳細は Transport Layer Security を参照)。これらのファイルをシステムの信頼ストアに追加する必要はありません。

ノート: 自己署名証明書を暗号化したものは現在サポートされておらず、マウント失敗の原因となります。

/etc/tlshd.conf を編集して、x509.certificatex509.private_key に自分の値を使用してこれらのファイルを利用します。

/etc/tlshd.conf
[authenticate.server]
x509.certificate= /etc/nfsd-certificate.pem
x509.private_key= /etc/nfsd-private-key.pem

そして、tlshd.service開始して有効化します。

クライアント

前の手順で生成したサーバーの TLS 証明書をシステムの信頼ストアに追加します(詳細は トランスポート層セキュリティ を参照)。

tlshd.service開始して有効化します。

これで、サーバーの DNS 名を使用してサーバーをマウントすることができるはずです:

# mount -o xprtsec=tls servername.domain:/ /mountpoint/on/client

クライアント上の journalctl を確認すると、TLS ハンドシェイクが成功したことが表示されるはずです:

$ journalctl -b -u tlshd.service
Sep 28 11:14:46 client tlshd[227]: Built from ktls-utils 0.10 on Sep 26 2023 14:24:03
Sep 28 11:15:37 client tlshd[571]: Handshake with servername.domain (192.168.122.100) was successful

トラブルシューティング

NFS/トラブルシューティングを参照してください。

参照

翻訳ステータス: このページは en:NFS の翻訳バージョンです。最後の翻訳日は 2024-04-19 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。