「NFS」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎サーバーを起動する: 不要なスペースを削除)
 
(6人の利用者による、間の47版が非表示)
1行目: 1行目:
 
[[Category:ファイルシステム]]
 
[[Category:ファイルシステム]]
[[Category:ネットワーク]]
+
[[Category:ネットワーク共有]]
  +
[[Category:サーバー]]
 
[[ar:NFS]]
 
[[ar:NFS]]
  +
[[cs:NFS]]
 
[[de:Network File System]]
 
[[de:Network File System]]
 
[[en:NFS]]
 
[[en:NFS]]
 
[[es:NFS]]
 
[[es:NFS]]
 
[[fr:NFS]]
 
[[fr:NFS]]
[[it:NFSv4]]
+
[[it:NFS]]
[[zh-CN:NFS]]
+
[[ru:NFS]]
  +
[[zh-hans:NFS]]
 
{{Related articles start}}
 
{{Related articles start}}
{{Related3|NFS Troubleshooting|NFS トラブルシューティング}}
+
{{Related|NFS/トラブルシューティング}}
 
{{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 を強制しますが、クライアントはそれらを見たり変更したりすることができません。
  +
  +
}}
   
 
== インストール ==
 
== インストール ==
18行目: 29行目:
 
クライアントとサーバーどちらでも必要なのは {{Pkg|nfs-utils}} パッケージの[[pacman|インストール]]だけです。
 
クライアントとサーバーどちらでも必要なのは {{Pkg|nfs-utils}} パッケージの[[pacman|インストール]]だけです。
   
{{Note|クライアント・サーバーの時計を一致させるために全てのノードで時刻同期デーモンを使うことが強く推奨されます。全てのノードで時計が正確でないと、NFS は望ましくない遅延を生じさせる可能性があります。[[Network Time Protocol daemon|NTP]] システムを使ってサーバーとクライアントの両方をインターネット上の正確な NTP サーバーに同期させることが推奨されています。}}
+
クライアント・サーバーの時計を一致させるために全てのノードで[[時刻同期]]デーモンを使うことが強く推奨されます。全てのノードで時計が正確でないと、NFS は望ましくない遅延を生じさせる可能性があります。
   
==設定==
+
==サーバー設定==
   
  +
グローバル設定オプションは {{ic|/etc/nfs.conf}} で設定されます。単純な設定を使用するユーザーはこのファイルを編集する必要はありません。
===サーバー===
 
   
  +
NFS サーバーは、共有するディレクトリのリストが必要で、{{ic|/etc/exports}} または {{ic|/etc/exports.d/*.exports}} に定義する必要があります(詳細は {{man|5|exports}} を参照)。デフォルトでは、ディレクトリはそのパスのままエクスポートされます。例えば:
==== ID マッピング ====
 
   
  +
{{hc|/etc/exports|2=
{{ic|/etc/idmapd.conf}} を編集して {{ic|Domain}} を設定してください。
 
  +
/data/music 192.168.1.0/24(rw)
  +
}}
   
  +
上記の設定により、ディレクトリ {{ic|/data/music}} は NFSv3 および NFSv4 で {{ic|MyServer:/data/music}} としてマウント可能になります。
{{hc|/etc/idmapd.conf|<nowiki>
 
[General]
 
 
Verbosity = 1
 
Pipefs-Directory = /var/lib/nfs/rpc_pipefs
 
Domain = atomic
 
   
  +
=== カスタムエクスポートルート ===
[Mapping]
 
   
  +
共有はいわゆる NFS ルートからの相対パスになります。セキュリティ上、NFS ルートを定義するときはサーバーのルートファイルシステム下の専用のディレクトリツリーを使用して、ユーザーからマウントポイントへのアクセスを制限すると良いでしょう。バインドマウントは、共有マウントポイントを [[ファイルシステム]] 上の実際のディレクトリにリンクするために使用されます。過去には NFSv4 で NFS ルートが必須でしたが、現在はオプションです(カーネル 2.6.33 および nfs-utils 1.2.2 から、仮想ルートが実装されています)。
Nobody-User = nobody
 
Nobody-Group = nobody
 
</nowiki>}}
 
   
  +
下の例では以下の設定を使用します:
==== 固定ポート ====
 
デフォルトでは、NFSv3 による {{ic|rpc.statd}} や {{ic|lockd}} の制御にはランダムな一時的なポートが使われます。ファイアウォールを通して NFSv3 の制御ができるようにするには固定ポートを定義する必要があります。{{ic|/etc/conf.d/nfs-common.conf}} を編集して STATD_OPTS を設定してください:
 
   
  +
# NFS ルートは {{ic|/srv/nfs}}。
{{hc|/etc/conf.d/nfs-common.conf|2=
 
  +
# エクスポートは {{ic|/srv/nfs/music}} で {{ic|/mnt/music}} にバインドマウントする。
STATD_OPTS="-p 32765 -o 32766 -T 32803"
 
}}
 
   
  +
# mkdir -p /srv/nfs/music /mnt/music
{{ic|rpc.mountd}} は {{ic|/etc/services}} を読み込んで通常の状態では同じ固定ポート 2048 に bind されます。しかしながら、明示的に定義する必要があるときは {{ic|/etc/conf.d/nfs-server.conf}} を編集して MOUNTD_OPTS を設定してください:
 
  +
# mount --bind /mnt/music /srv/nfs/music
   
  +
{{Note|[[ZFS]] ファイルシステムの場合、バインドマウントの使い方が特殊です。[[ZFS#バインドマウント]]を見てください。}}
{{hc|/etc/conf.d/nfs-server.conf|2=
 
MOUNTD_OPTS="-p 20048"
 
}}
 
   
  +
サーバーを再起動してもマウントされるように、バインドマウントを [[fstab]] に追加:
これらの変更を加えたら、複数のサービスを再起動してください。最初に設定オプションを {{ic|/run/sysconfig/nfs-utils}} (参照: {{ic|/usr/lib/systemd/scripts/nfs-utils_env.sh}}) に書き出して、二番目に新しいポートで {{ic|rpc.statd}} を再起動し、最後に新しいポートで lockd (カーネルモジュール) をリロードします。
 
   
  +
{{hc|/etc/fstab|/mnt/music /srv/nfs/music none bind 0 0}}
# systemctl restart nfs-config
 
# systemctl restart rpc-statd
 
# systemctl restart nfs-server
 
   
  +
CIDR によるアドレス指定またはホストネームを使ってマウントを許可するクライアントマシンを制限するには {{ic|/etc/exports}} に以下のように共有ディレクトリを追加:
再起動後、サーバーで {{ic|rpcinfo -p}} を使って固定ポートが思い通りにいってるか確認してください。クライアントから {{ic|rpcinfo -p <server IP>}} を使えば本当に同じ固定ポートを使っているか明らかになります。
 
   
  +
{{hc|/etc/exports|2=
==== 任意のサーバー設定 ====
 
  +
/srv/nfs 192.168.1.0/24(rw,fsid=root)
{{ic|/etc/conf.d/nfs-server.conf}} には rpc.nfsd, rpc.mountd, rpc.svcgssd のオプションを任意で記述します。シンプルな設定をする場合はこのファイルを編集する必要はありません。
 
  +
/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 を使用する場合、オプション {{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}} としてマウント可能になります - ルートプレフィックスは省略されることに注意してください。
{{Note|For security reasons, it is recommended to use an NFS export root which will keep users limited to that mount point only. The following example illustrates this concept.}}
 
   
  +
{{Tip|
{{ic|/etc/exports}} に NFS ルートの相対パスで NFS 共有を定義します。この例では、NFS ルートは {{ic|/srv/nfs4}} とし、{{ic|/mnt/music}} を共有させます。
 
  +
* NFSv3 には必要ですが NFSv4 には必要ない {{ic|crossmnt}} オプションは、{{ic|crossmnt}} でマークされたファイルシステム上にマウントされた '''全ての''' ファイルシステムにクライアントがアクセスできるようにします。クライアントはすべての子エクスポートを別々にマウントする必要がありません。ただし、異なるアドレス範囲で子が共有されている場合、これは望ましくないかもしれません。
  +
* {{ic|crossmnt}} の代わりに、子エクスポートに {{ic|nohide}} オプションを使用すると、クライアントがルートエクスポートをマウントするときに自動的にマウントされます。{{ic|crossmnt}} と異なり、{{ic|nohide}} は子エクスポートのアドレス範囲を尊重します。このオプションも NFSv3 固有であり、NFSv4 は常に nohide が有効であるかのように振る舞います。
  +
* {{ic|insecure}} オプションは、クライアントが 1023 番以上のポートから接続できるようにします。(通常、ルートユーザーのみが低番号ポートを使用できるため、デフォルトで他のポートをブロックすることはアクセスへの表面的な障壁を作ります。実際には {{ic|insecure}} オプションを省略しても含めても、セキュリティに有意な改善または悪化はありません。)
  +
* アスタリスク ({{ic|*}}) を使用して、任意のインターフェースからのアクセスを許可します。
  +
}}
   
  +
サーバー実行中に {{ic|/etc/exports}} を変更した場合は再度エクスポートしないと変更が適用されないので注意してください:
# mkdir -p /srv/nfs4/music
 
  +
# exportfs -rav
   
  +
現在ロードされているエクスポートの状態をより詳細に見るには、以下を使用する:
クライアントが書き込めるように music ディレクトリには読み書きの権限を設定しておきます。
 
   
  +
# exportfs -v
そして実際の対象の共有である {{ic|/mnt/music}} を NFS 共有に mount コマンドでマウントします:
 
   
  +
利用可能なオプションについて詳しくは {{man|5|exports}} を参照してください。
# mount --bind /mnt/music /srv/nfs4/music
 
  +
{{Tip|IP の範囲を CIDR 表記に変換するツールとして [http://ip2cidr.com/ ip2cidr] が存在します。}}
  +
{{Note|エクスポート先が tmpfs ファイルシステムの場合、{{ic|1=fsid=1}} オプションが必要です。}}
   
サーバーを起動してもマウントされように、bind マウントを {{ic|fstab}} に追加:
+
=== サーバーを起動===
{{hc|/etc/fstab|
 
/mnt/music /srv/nfs4/music none bind 0 0
 
}}
 
   
  +
* NFSv3 および NFSv4 サービスを提供するには、{{ic|nfs-server.service}} を[[開始]]して[[有効化]]します。
==== エクスポート ====
 
  +
* NFSv4 サービスのみを提供するには、{{ic|nfsv4-server.service}} を[[開始]]して[[有効化]]します。
   
  +
プロトコルバージョン 4 のエクスポートを使用するユーザーは、不要なサービスが実行されないように、最低限 {{ic|rpcbind.service}} と {{ic|rpcbind.socket}} を[[マスク]]することを望むでしょう。詳細は {{Bug|76453}} を参照してください。また、何らかの理由で引き込まれた {{ic|nfs-server.service}} もマスクすることを検討してください。
共有するディレクトリと、マウントを許可するクライアントマシンの ip アドレスまたはホスト名を {{ic|exports}} に追加します:
 
{{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 シェアをエクスポートする場合は、{{ic|zfs-share.service}} も [[開始]]/[[有効化]] してください。これを行わないと、再起動後に ZFS シェアがエクスポートされなくなります。詳細は [[ZFS#NFS]] を参照してください。}}
共有をサブネット全体で開く必要はありません。単一の IP アドレスまたはホスト名だけを指定することも可能です。
 
   
  +
=== 特定のインターフェイスあるいは IP からのアクセスに NFS を制限 ===
利用可能なオプションについての詳細は {{ic|man 5 exports}} を見て下さい。
 
   
  +
デフォルトでは {{ic|nfs-server.service}} を起動すると {{ic|/etc/exports}} とは関係なく全てのネットワークインターフェイスから接続を待機します。待機する IP あるいはホストネームを定義することで挙動を変更できます:
{{Note|Modifying {{ic|/etc/exports}} while the server is running will require a re-export for changes to take effect.}}
 
# exportfs -rav
 
   
  +
{{hc|/etc/nfs.conf|2=
==== NFSv2 との互換性 ====
 
  +
[nfsd]
 
  +
host=192.168.1.123
NFSv2 を使用するクライアント (例えば U-Boot) のサポートが必要な場合、{{ic|/etc/conf.d/nfs-server.conf}} に {{ic|1=NFSD_OPTS="-V 2"}} を設定してください。
 
  +
# Alternatively, you can use your hostname.
 
  +
# host=myhostname
==== サーバーを起動する ====
 
  +
}}
   
  +
変更を適用するには {{ic|nfs-server.service}} を[[再起動]]してください。
[[systemd#ユニットを使う|systemd]] を使って {{ic|nfs-server.service}} を起動して下さい。また、サービスを有効にして起動時に systemd がサーバーを起動すように設定することも推奨されています。このユニットは他のサービスも必要としますが、それらは [[systemd|systemd]] によって自動的に起動されます。
 
   
==== ファイアウォール設定 ====
+
=== ファイアウォール設定 ===
   
 
ファイアウォールを通過してアクセスできるようにするには、デフォルト設定の場合 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}} を編集して以下の行を含めるようにしてください:
127行目: 134行目:
 
-A INPUT -p udp -m udp --dport 32765 -j ACCEPT
 
-A INPUT -p udp -m udp --dport 32765 -j ACCEPT
 
-A INPUT -p udp -m udp --dport 32803 -j ACCEPT
 
-A INPUT -p udp -m udp --dport 32803 -j ACCEPT
  +
</nowiki>}}
  +
  +
v4 以上だけを使う構成の場合、開く必要があるのは tcp ポート 2049 だけです。したがって、必要な行は一行だけになります:
  +
  +
{{hc|/etc/iptables/iptables.rules|<nowiki>
  +
-A INPUT -p tcp -m tcp --dport 2049 -j ACCEPT
 
</nowiki>}}
 
</nowiki>}}
   
 
変更を適用するために、{{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}} を起動して下さい。また、サービスを有効にして起動時に systemd がクライアントを起動するように設定することも推奨されています。このユニットは他のサービスも必要としますが、それらは [[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
 
and might lock up any NFS mount on the system when mounting and unmounting some mounts very often.
 
}}
 
   
  +
== クライアント設定 ==
または [https://bugzilla.redhat.com/show_bug.cgi?id=1001934 Red Hat の Bugzilla] に書かれているように {{ic|rpcsec_gss_krb5}} をブラックリストに入れます。
 
   
  +
NFSv4 で [[Kerberos]] を使用する場合、{{ic|nfs-client.target}} も[[起動]]・[[有効化]]する必要があります。
# echo "blacklist rpcsec_gss_krb5" > /etc/modprobe.d/rpcsec_gss_krb5-blacklist.conf
 
# reboot
 
   
==== Linux からマウントする ====
+
=== 手動マウント ===
   
サーバーのエクスポートされたファイルシステムを表示:
+
NFSv3 の場合、次のコマンドを使ってサーバーのエクスポートされたファイルシステムを表示:
 
$ showmount -e servername
 
$ showmount -e servername
   
次にサーバーの NFS スポールーは省略してマウント:
+
NFSv4 場合、root NFS ディレクトリをマウントして利用できるマウントを確認:
# mount -t nfs servername:/music /mountpoint/on/client
+
# mount server:/ /mountpoint/on/client
  +
  +
そしてサーバーの NFS エクスポートルートは省略してマウント:
  +
# mount -t nfs -o vers=4 servername:/music /mountpoint/on/client
   
 
マウントが失敗する場合はサーバーのエクスポートルートを含めて見て下さい (Debian/RHEL/SLES では必須、ディストリビューションによっては {{ic|-t nfs}} ではなく {{ic|-t nfs4}}):
 
マウントが失敗する場合はサーバーのエクスポートルートを含めて見て下さい (Debian/RHEL/SLES では必須、ディストリビューションによっては {{ic|-t nfs}} ではなく {{ic|-t nfs4}}):
# mount -t nfs servername:/full/path/to/music /mountpoint/on/client
+
# mount -t nfs -o vers=4 servername:/srv/nfs/music /mountpoint/on/client
   
  +
{{Note|サーバーの名前は (IP アドレスではなく) ホストネームを指定する必要があります。それ以外だとリモート共有がハングアップします。}}
{{Note|Server name needs to be a valid hostname (not just IP address). Otherwise mounting of remote share will hang.}}
 
   
===== /etc/fstab を使う =====
+
=== /etc/fstab を使う ===
   
クライアントを立ち上げたときにいつでも NFS 共有が使えるように、常に稼働させているサーバーでは [[fstab|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秒になるか正式なタイムアウトになります。遅いサーバーやトラフィックの多いネットワークに接続する場合、このタイムアウトの値を増やすことでパフォーマンスが改善されるかもしれません。
184行目: 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 の問題も解決します、下の例を見て下さい:
   
 
{{hc|1=/etc/fstab|2=
 
{{hc|1=/etc/fstab|2=
servername :/home /mountpoint/on/client nfs users,noauto,x-systemd.automount,x-systemd.device-timeout=10,timeo=14,soft,intr,noatime 0 0
+
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 を[[Systemd#ユニットを使う|リロード]]して {{ic|''mountpoint-on-client''.automount}} を再起動して {{ic|/etc/fstab}} の設定を再読み込みしてください。
{{Tip|上記の {{ic|noauto}} はアクセスされるまで NFS 共有をマウントしません: いますぐに利用できるようにしたいときは {{ic|auto}} を使って下さい。<br>ネットワークが立ち上がってなかったり利用できないことが理由でマウントが失敗する問題が発生するときは、{{ic|NetworkManager-wait-online.service}} を [[systemd#ユニットを使う|有効]]にします: このサービスは有効化される前に {{ic|network.target}} の全てのリンクが利用可能になることを保証します。}}
 
   
  +
{{Tip|
{{Note|If you try to automount a NFS-share via systemd which is mounted the same way on the server, the system and all applications who try to use the share may freeze when handling larger amounts of data.}}
 
  +
* 上記の {{ic|noauto}} はアクセスされるまで NFS 共有をマウントしません: いますぐに利用できるようにしたいときは {{ic|auto}} を使って下さい。<br>ネットワークが立ち上がってなかったり利用できないことが理由でマウントが失敗する問題が発生するときは、{{ic|NetworkManager-wait-online.service}} を [[systemd#ユニットを使う|有効]]にします: このサービスは有効化される前に {{ic|network.target}} の全てのリンクが利用可能になることを保証します。
  +
* {{ic|users}} マウントオプションはユーザーによるマウントを許可しますが、{{ic|noexec}} などのオプションも含まれているので注意してください。
  +
* {{ic|<nowiki>x-systemd.idle-timeout=1min</nowiki>}} オプションは NFS 共有が1分間使われなかったときに自動的にアンマウントします。ネットワークから突然切断する可能性があるノートパソコンなどで有用です。
  +
* NFS のせいでシャットダウンや再起動に時間がかかってしまうときは、{{ic|NetworkManager-wait-online.service}} を[[有効化]]して NFS ボリュームがアンマウントされる前に NetworkManager が終了しないようにしてください。それでもシャットダウンが長すぎる場合 {{ic|<nowiki>x-systemd.requires=network.target</nowiki>}} マウントオプションを追加してみてください。
  +
}}
   
  +
{{Note|サーバーでも同じ方法で systemd で NFS 共有を自動マウントすると、データの量が多かった場合にフリーズする可能性があります。}}
===== autofs を使う =====
 
   
  +
=== systemd ユニットとして ===
複数のマシンを NFS で接続したい場合は [[autofs]] を使うのが便利です。サーバーだけでなくクライアントにもなることができます。他の簡単な方法よりもこの方法が推奨される理由は、サーバーの電源が落とされた時に、クライアントがNFS 共有を見つけられないことについてエラーを投げないからです。詳しくは [[autofs#NFS network mounts]] を見て下さい。
 
   
  +
{{ic|/etc/systemd/system}} 内に新しい {{ic|.mount}} ファイルを作成します。例:{{ic|mnt-home.mount}}。詳細は {{man|5|systemd.mount}} を参照してください。
==== Windows からマウントする ====
 
   
  +
{{Note|ファイル名が使用したいマウントポイントに対応していることを確認してください。
{{Note|Only the Ultimate and Enterprise editions of Windows 7 and the Enterprise edition of Windows 8 include "Client for NFS".}}
 
  +
例えば、ユニット名 {{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]] を使用してください。}}
"Client for NFS" サービスが有効になっていれば Windows から NFS 共有をマウントできます (デフォルトでは有効になっていません)。
 
サービスをインストールするにはコントロールパネルの "Programs and features" から "Turn Windows features on or off" をクリックしてください。"Services for NFS" と副サービス ("Administrative tools" と "Client for NFS") を両方有効にします。
 
   
  +
{{ic|1=What=}} 共有へのパス
"Services for Network File System" (検索ボックスで探して下さい) を開いて ''client > properties'' を右クリックすることでグローバルオプションを設定できます。
 
   
  +
{{ic|1=Where=}} 共有をマウントするパス
{{Warning|Serious performance issues may occur (it randomly takes 30-60 seconds to display a folder, 2 MB/s file copy speed on gigabit LAN, ...) to which Microsoft does not have a solution yet.[https://social.technet.microsoft.com/Forums/en-CA/w7itpronetworking/thread/40cc01e3-65e4-4bb6-855e-cef1364a60ac]}}
 
   
エクスプローラーを使って共有マウントするには:
+
{{ic|1=Options=}} 共有マウントオプション
   
  +
{{Note|
{{ic|Computer}} > {{ic|Map network drive}} > {{ic|servername:/srv/nfs4/music}}
 
  +
* ネットワークマウントユニットは自動的に {{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=
==== OS X からマウントする ====
 
  +
[Unit]
  +
Description=Mount home at boot
   
  +
[Mount]
{{Note|OS X はデフォルトでセキュアでない (>1024) ポートを使って共有をマウントしません。}}
 
  +
What=172.16.24.192:/home
{{ic|insecure}} フラグを使って共有をエクスポートし、Finder でマウントする:
 
  +
Where=/mnt/home
  +
Options=vers=4
  +
Type=nfs
  +
TimeoutSec=30
   
  +
[Install]
{{ic|Go}} > {{ic|Connect to Server}} > {{ic|nfs://servername/}}
 
  +
WantedBy=multi-user.target
  +
}}
   
  +
{{Tip|システムが到達不能な場合、{{ic|1=ForceUnmount=true}} を {{ic|[Mount]}} に[[追加]]して、エクスポートを(強制的に)アンマウントできるようにします。}}
またはターミナルでセキュアなポートを使って共有をマウント:
 
# mount -t nfs -o resvport,nolocks,locallocks servername:/srv/nfs4 /Volumes/servername
 
   
  +
{{ic|mnt-home.mount}} を使用するには、ユニットを[[開始]]し、システムブート時に実行するように[[有効化]]します。
{{ic|nolocks}} と {{ic|locallocks}} オプションを使う理由については https://blogs.oracle.com/jag/entry/nfs_on_snow_leopard を見て下さい。
 
   
  +
==== オートマウント ====
== Tips and tricks ==
 
  +
  +
共有を自動的にマウントするには、次のオートマウントユニットを使用できます:
  +
  +
{{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 ネットワークマウント]] を見て下さい。
  +
  +
== ヒントとテクニック ==
   
 
=== パフォーマンスチューニング ===
 
=== パフォーマンスチューニング ===
   
  +
{{Out of date|32ビットや2.6 Linux カーネルに言及しています...}}
NFS を使い倒すつもりならば、ネットワーク設定の要件を満たすように {{ic|rsize}} や {{ic|wsize}} マウントオプションを調整してするのが必須になります。
 
  +
  +
クライアントの数が多いネットワークで NFS を使用する場合、デフォルトの NFS スレッド数を「8」から「16」やそれ以上に増やすことができます。これはサーバー/ネットワークの要件に応じて変わります:
  +
  +
{{hc|/etc/nfs.conf|2=
  +
[nfsd]
  +
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}} を使用すると、サーバーがクラッシュするか不正な再起動をすると、データの損失や破損のリスクがあります。}}
   
 
=== 自動マウントの処理 ===
 
=== 自動マウントの処理 ===
240行目: 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,intr,soft 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,intr,soft 0 0</nowiki>
+
lithium:/var/cache/pacman /var/cache/pacman nfs noauto,noatime,rsize=32768,wsize=32768 0 0</nowiki>
 
}}
 
}}
   
251行目: 336行目:
 
''cron'' を使って NFS ホストが到達可能なチェックする {{ic|auto_share}} スクリプトを作成:
 
''cron'' を使って NFS ホストが到達可能なチェックする {{ic|auto_share}} スクリプトを作成:
   
{{hc|/root/bin/auto_share|<nowiki>
+
{{hc|/usr/local/bin/auto_share|<nowiki>
 
#!/bin/bash
 
#!/bin/bash
   
  +
function net_umount {
SERVER="YOUR_NFS_HOST"
 
  +
umount -l -f $1 &>/dev/null
  +
}
   
  +
function net_mount {
MOUNT_POINTS=$(sed -e '/^.*#/d' -e '/^.*:/!d' -e 's/\t/ /g' /etc/fstab | tr -s " " | cut -f2 -d" ")
 
  +
mountpoint -q $1 || mount $1
  +
}
   
  +
NET_MOUNTS=$(sed -e '/^.*#/d' -e '/^.*:/!d' -e 's/\t/ /g' /etc/fstab | tr -s " ")$'\n'b
ping -c 1 "${SERVER}" &>/dev/null
 
   
  +
printf %s "$NET_MOUNTS" | while IFS= read -r line
if [ $? -ne 0 ]; then
 
  +
do
# The server could not be reached, unmount the shares
 
  +
SERVER=$(echo $line | cut -f1 -d":")
for umntpnt in ${MOUNT_POINTS}; do
 
  +
MOUNT_POINT=$(echo $line | cut -f2 -d" ")
umount -l -f $umntpnt &>/dev/null
 
  +
done
 
  +
# Check if server already tested
else
 
  +
if [[ "${server_ok[@]}" =~ "${SERVER}" ]]; then
# The server is up, make sure the shares are mounted
 
  +
# The server is up, make sure the share are mounted
for mntpnt in ${MOUNT_POINTS}; do
 
  +
net_mount $MOUNT_POINT
mountpoint -q $mntpnt || mount $mntpnt
 
  +
elif [[ "${server_notok[@]}" =~ "${SERVER}" ]]; then
done
 
  +
# The server could not be reached, unmount the share
fi
 
  +
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
 
</nowiki>}}
 
</nowiki>}}
   
  +
スクリプトに実行権限を付与:
# chmod +x /root/bin/auto_share
 
   
  +
# chmod +x /usr/local/bin/auto_share
毎分 {{ic|auto_share}} を実行する root の cron エントリを作成:
 
  +
  +
[[cron]] エントリか [[systemd/タイマー|systemd タイマー]]を作成して、共有サーバーにアクセスできるか1分ごとに確認するようにしてください。
  +
  +
==== Cron ====
   
 
{{hc|# crontab -e|<nowiki>
 
{{hc|# crontab -e|<nowiki>
* * * * * /root/bin/auto_share
+
* * * * * /usr/local/bin/auto_share
 
</nowiki>}}
 
</nowiki>}}
  +
  +
==== systemd/タイマー ====
  +
  +
以下のユニットを作成:
  +
  +
{{hc|# /etc/systemd/system/auto_share.timer|<nowiki>
  +
[Unit]
  +
Description=Check the network mounts
  +
  +
[Timer]
  +
OnCalendar=*-*-* *:*:00
  +
  +
[Install]
  +
WantedBy=timers.target
  +
</nowiki>}}
  +
  +
{{hc|# /etc/systemd/system/auto_share.service|<nowiki>
  +
[Unit]
  +
Description=Check the network mounts
  +
  +
[Service]
  +
Type=simple
  +
ExecStart=/usr/local/bin/auto_share
  +
</nowiki>}}
  +
  +
作成したら {{ic|auto_share.timer}} を[[有効化]]してください。
  +
  +
==== systemd で起動時にマウント ====
   
 
systemd のユニットファイルを使って起動時に NFS 共有をマウントすることも可能です。クライアントに NetworkManager がインストール・設定されている場合はユニットファイルは必要ありません。[[#NetworkManager dispatcher]] を見て下さい。
 
systemd のユニットファイルを使って起動時に NFS 共有をマウントすることも可能です。クライアントに NetworkManager がインストール・設定されている場合はユニットファイルは必要ありません。[[#NetworkManager dispatcher]] を見て下さい。
286行目: 423行目:
 
[Unit]
 
[Unit]
 
Description=NFS automount
 
Description=NFS automount
  +
After=syslog.target network.target
   
 
[Service]
 
[Service]
 
Type=oneshot
 
Type=oneshot
 
RemainAfterExit=yes
 
RemainAfterExit=yes
ExecStart=/root/bin/auto_share
+
ExecStart=/usr/local/bin/auto_share
   
 
[Install]
 
[Install]
296行目: 434行目:
 
</nowiki>}}
 
</nowiki>}}
   
Now enable {{ic|auto_share}}.
+
{{ic|auto_share.service}} を[[有効化]]してください。
   
==== NetworkManager dispatcher ====
+
==== NetworkManager dispatcher を使う ====
   
 
上で説明している方法に加えて、ネットワークの状態が変わった時にスクリプトを実行するよう NetworkManager を設定することもできます。
 
上で説明している方法に加えて、ネットワークの状態が変わった時にスクリプトを実行するよう NetworkManager を設定することもできます。
306行目: 444行目:
 
ネットワーク状態の変化にあわせてネットワーク上の共有をマウントする一番簡単な方法は {{ic|auto_share}} スクリプトにシンボリックリンクを作成することです:
 
ネットワーク状態の変化にあわせてネットワーク上の共有をマウントする一番簡単な方法は {{ic|auto_share}} スクリプトにシンボリックリンクを作成することです:
   
# ln -s /root/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 アレッがフリーズしたりすることがあります。
   
  +
以下のスクリプトを使うことでネットワーク接続が切れる前に NFS 共有を安全にアンマウントすることができます:
{{hc|/etc/NetworkManager/dispatcher.d/30_nfs.sh|<nowiki>
 
  +
  +
{{hc|/etc/NetworkManager/dispatcher.d/30-nfs.sh|<nowiki>
 
#!/bin/bash
 
#!/bin/bash
   
  +
# Find the connection UUID with "nmcli con show" in terminal.
SSID="CHANGE_ME"
 
  +
# 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
MOUNT_POINTS=$(sed -e '/^.*#/d' -e '/^.*:/!d' -e 's/\t/ /g' /etc/fstab | tr -s " " | cut -f2 -d" ")
 
   
  +
# Script parameter $1: NetworkManager connection name, not used
ISNETUP=$(nmcli dev wifi | \grep $SSID | tr -s ' ' | cut -f 10 -d ' ') 2>/dev/null
 
  +
# Script parameter $2: dispatched event
 
  +
# echo "$ISNETUP" >> /tmp/nm_dispatch_log
 
  +
case "$2" in
 
  +
"up")
if [[ "$ISNETUP" == "yes" ]]; then
 
  +
mount -a -t nfs4,nfs
for mntpnt in ${MOUNT_POINTS}; do
 
mountpoint -q $mntpnt || mount $mntpnt
+
;;
  +
"pre-down");&
done
 
  +
"vpn-pre-down")
else
 
  +
umount -l -a -t nfs4,nfs >/dev/null
for srvexp in ${MOUNT_POINTS}; do
 
umount -l -f $srvexp &>/dev/null
+
;;
done
+
esac
 
fi
 
fi
 
</nowiki>}}
 
</nowiki>}}
  +
スクリプトに実行可能属性を付与:
  +
# chmod +x /etc/NetworkManager/dispatcher.d/30-nfs.sh
  +
{{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
   
ワイヤレス SSID "CHANGE_ME" が立ちがったり落ちたりする度に、{{ic|nfs.sh}} スクリプトが実行され素早く共有をマウント・アンマウントします。
+
記のスクリプトは別の接続で別の共有をマウントするように修正することができます。
  +
  +
[[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 Troubleshooting]] を参照してください。
+
[[NFS/トラブルシューティング]]を参照してください。
   
 
== 参照 ==
 
== 参照 ==
   
* [[Avahi|Avahi]], NFS 共有の自動検出が出来る Zeroconf 実装
+
* NFS 共有の自動検出を可能にする Zeroconf 実装である [[Avahi]] も参照してください。
* HOWTO: [[Diskless network boot NFS root]]
+
* HOWTO: [[ディスクレスシステム]]
  +
* [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]
* [http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.prftungd/doc/prftungd/nfs_perf.htm NFS Performance Management]
 
  +
* [https://web.archive.org/web/20151212160906/https://blogs.oracle.com/jag/entry/nfs_on_snow_leopard NFS on Snow Leopard]
* [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]
 
  +
* http://chschneider.eu/linux/server/nfs.shtml
* [https://blogs.oracle.com/jag/entry/nfs_on_snow_leopard NFS on Snow Leopard]
 
  +
* [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 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。