「NFS」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(文字列「Tips and tricks」を「ヒントとテクニック」に置換)
(同期)
1行目: 1行目:
 
[[Category:ファイルシステム]]
 
[[Category:ファイルシステム]]
[[Category:ネットワーク]]
+
[[Category:ネットワーク共有]]
 
[[ar:NFS]]
 
[[ar:NFS]]
 
[[cs:NFS]]
 
[[cs:NFS]]
17行目: 17行目:
 
[[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 アドレスや[[ホストネーム]]で制限します。
  +
}}
   
 
== インストール ==
 
== インストール ==
28行目: 33行目:
 
===サーバー===
 
===サーバー===
   
NFS は共有のリスト (以下 "exports" と呼称ます) を確認する必要があります。exports は {{ic|/etc/exports}} に定義ます。ファイルシステムののディレクトリでもかまいません。セキュティ上、ユーザーのアクセスられ NFS export root を使うこが推奨されます。以下はこの考え例証してます。
+
NFS サーバーにエクスポート (共有ディレクトリ) のリストが必要で、{{ic|/etc/exports}} に定義します。{{ic|/etc/exports}} に定義する NFS 共有はいわゆる NFS ルートからの相対パスになります。セキュリティ上、NFS ルートを定義するときはサーバーのルートファイルシステム専用のディレクトリーを使用して、ユーザーからマウントポイントへのアクセスを制ると良いしょう。バインドマウント使用して共有マウントポイントから実際のファイルシステム上のディレクトリにリンクします。
   
  +
下の例では以下の設定を使用します:
{{ic|/etc/exports}} に NFS ルートの相対パスで NFS 共有を定義します。ここでは、NFS ルートは {{ic|/srv/nfs4}} とし、{{ic|/mnt/music}} を共有させます。
 
  +
# NFS ルートは {{ic|/srv/nfs}}。
  +
# エクスポートは {{ic|/srv/nfs/music}} で {{ic|/mnt/music}} にバインドマウントする。
   
# mkdir -p /srv/nfs4/music /mnt/music
+
# mkdir -p /srv/nfs/music /mnt/music
  +
# mount --bind /mnt/music /srv/nfs/music
   
  +
サーバーを再起動してもマウントされるように、バインドマウントを [[fstab]] に追加:
クライアントが書き込めるように music ディレクトリには読み書きの権限を設定しておきます。
 
   
  +
{{hc|/etc/fstab|/mnt/music /srv/nfs/music none bind 0 0}}
そして実際の対象の共有である {{ic|/mnt/music}} を NFS 共有に mount コマンドでマウントします:
 
   
  +
{{Note|
# mount --bind /mnt/music /srv/nfs4/music
 
  +
* NFS にはサーバーのファイルシステムのパーミッションが適用されるため、接続するユーザーに適当な権限があることを確認してください。
  +
* [[ZFS]] ファイルシステムの場合、バインドマウントの使い方が特殊です。[[ZFS#バインドマウント]]を見てください。}}
   
サーバーを再起動しマウントされように、bind マウントを {{ic|fstab}} に追加:
+
CIDR によるアドレス指定またはホストネ使ってマウントを許可すクライアントマシン制限するには {{ic|/etc/exports}} に以下のように共有ディレクトリを追加:
{{hc|/etc/fstab|
 
/mnt/music /srv/nfs4/music none bind 0 0
 
}}
 
   
共有するディレクトリと、マウントを許可するクライアントマシンの ip アドレスまたはホスト名を {{ic|exports}} に追加します:
 
 
{{hc|/etc/exports|<nowiki>
 
{{hc|/etc/exports|<nowiki>
/srv/nfs4/ 192.168.1.0/24(rw,fsid=root,no_subtree_check)
+
/srv/nfs 192.168.1.0/24(rw,fsid=root,crossmnt)
/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.
+
/srv/nfs/music 192.168.1.0/24(rw) # Use whatever export options you see fit
 
</nowiki>}}
 
</nowiki>}}
   
  +
サーバー実行中に {{ic|/etc/exports}} を変更した場合は再度エクスポートしないと変更が適用されないので注意してください:
共有をサブネット全体で開く必要はありません。単一の IP アドレスまたはホスト名だけを指定することも可能です。
 
  +
# exportfs -rav
   
利用可能なオプションについては {{ic|man 5 exports}} をさい。
+
利用可能なオプションについて詳しくは {{man|5|exports}} を参照しください。
  +
{{Tip|IP の範囲を CIDR 表記に変換するツールとして [http://ip2cidr.com/ ip2cidr] が存在します。}}
 
  +
{{Note|エクスポート先が tmpfs ファイルシステムの場合、{{ic|1=fsid=1}} オプションが必要です。}}
{{Note|Modifying {{ic|/etc/exports}} while the server is running will require a re-export for changes to take effect: {{ic|# exportfs -rav}}.}}
 
   
 
==== サーバーを起動する ====
 
==== サーバーを起動する ====
   
{{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=
+
{{ic|nfs-server.service}} を[[起動]]・[[有効化]]してください。
NFSD_OPTS="-N 2 -N 3"
 
}}
 
上記の設定をしない場合 {{ic|rpcbind.service}} が必要になります。
 
   
 
==== その他 ====
 
==== その他 ====
   
 
===== 任意のサーバー設定 =====
 
===== 任意のサーバー設定 =====
{{ic|/etc/conf.d/nfs-server.conf}} には rpc.nfsd, rpc.mountd, rpc.svcgssd のオプションを任意で記述します。シンプルな設定をする場合はこのファイルを編集する必要はありません。
 
   
  +
高度な設定オプションは {{ic|/etc/nfs.conf}} で設定できます。単純な構成の場合はファイルを編集する必要はありません。
===== 固定ポート =====
 
NFSv3 クライアントのサポートが必要な場合、固定ポートを使うのが良いでしょう。デフォルトでは、NFSv3 による {{ic|rpc.statd}} や {{ic|lockd}} の制御にはランダムな一時的なポートが使われます。ファイアウォールを通して NFSv3 の制御ができるようにするには固定ポートを定義する必要があります。{{ic|/etc/conf.d/nfs-common.conf}} を編集して {{ic|STATD_OPTS}} を設定してください:
 
   
  +
===== 特定のインターフェイスあるいは IP からのアクセスに NFS を制限 =====
{{hc|/etc/conf.d/nfs-common.conf|2=
 
  +
STATD_OPTS="-p 32765 -o 32766 -T 32803"
 
  +
デフォルトでは {{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
 
}}
 
}}
   
  +
変更を適用するには {{ic|nfs-server.service}} を[[再起動]]してください。
{{ic|rpc.mountd}} は {{ic|/etc/services}} を読み込んで通常の状態では同じ固定ポート 2048 に bind されます。しかしながら、明示的に定義する必要があるときは {{ic|/etc/conf.d/nfs-server.conf}} を編集して MOUNTD_OPTS を設定してください:
 
   
  +
===== NFSv4 の ID マッピングが有効になっていることを確認 =====
{{hc|/etc/conf.d/nfs-server.conf|2=
 
  +
MOUNTD_OPTS="-p 20048"
 
  +
idmapd が動作していても、マッピングが完全には有効になっていないことがあります。{{ic|/sys/module/nfsd/parameters/nfs4_disable_idmapping}} が {{ic|N}} になっている場合、以下のコマンドを実行することで有効にできます:
  +
  +
# echo "N" | sudo tee /sys/module/nfsd/parameters/nfs4_disable_idmapping
  +
  +
変更を永続化するには[[カーネルモジュール#モジュールオプションを設定する|モジュールオプション]]で設定してください:
  +
  +
{{hc|/etc/modprobe.d/nfsd.conf|<nowiki>
  +
options nfsd nfs4_disable_idmapping=0
  +
</nowiki>}}
  +
  +
===== NFSv3 の固定ポート =====
  +
NFSv3 クライアントのサポートが必要な場合、固定ポートを使うのが良いでしょう。デフォルトでは NFSv3 による {{ic|rpc.statd}} や {{ic|lockd}} の制御にはランダムな一時ポートが使われます。ファイアウォールを通して NFSv3 の制御ができるようにするには固定ポートを定義する必要があります。{{ic|/etc/sysconfig/nfs}} を編集して {{ic|STATDARGS}} を設定してください:
  +
  +
{{hc|/etc/sysconfig/nfs|2=
  +
STATDARGS="-p 32765 -o 32766 -T 32803"
 
}}
 
}}
   
  +
{{ic|rpc.mountd}} は {{ic|/etc/services}} を読み込んで通常の状態では同じ固定ポート 2048 に bind されます。しかしながら、明示的に定義する必要があるときは {{ic|/etc/sysconfig/nfs}} を編集して {{ic|RPCMOUNTDARGS}} を設定してください:
これらの変更を加えたら、複数のサービスを再起動してください。最初に設定オプションを {{ic|/run/sysconfig/nfs-utils}} (参照: {{ic|/usr/lib/systemd/scripts/nfs-utils_env.sh}}) に書き出して、二番目に新しいポートで {{ic|rpc.statd}} を再起動し、最後に新しいポートで lockd (カーネルモジュール) をリロードします。
 
  +
  +
{{hc|/etc/sysconfig/nfs|2=
  +
RPCMOUNTDARGS="-p 20048"
  +
}}
   
  +
上記の変更を加えたら、複数のサービスを再起動してください。最初に設定オプションを {{ic|/run/sysconfig/nfs-utils}} (参照: {{ic|/usr/lib/systemd/scripts/nfs-utils_env.sh}}) に書き出して、二番目に新しいポートで {{ic|rpc.statd}} を再起動し、最後に新しいポートで {{ic|lockd}} (カーネルモジュール) をリロードします。次のサービスを[[再起動]]してください: {{ic|nfs-config}}, {{ic|rpcbind}}, {{ic|rpc-statd}}, {{ic|nfs-server}}。
# systemctl restart nfs-config
 
# systemctl restart rpcbind
 
# systemctl restart rpc-statd
 
# systemctl restart nfs-server
 
   
 
再起動後、サーバーで {{ic|rpcinfo -p}} を使って固定ポートが思い通りにいってるか確認してください。クライアントから {{ic|rpcinfo -p <server IP>}} を使えば本当に同じ固定ポートを使っているか明らかになります。
 
再起動後、サーバーで {{ic|rpcinfo -p}} を使って固定ポートが思い通りにいってるか確認してください。クライアントから {{ic|rpcinfo -p <server IP>}} を使えば本当に同じ固定ポートを使っているか明らかになります。
93行目: 118行目:
 
===== NFSv2 との互換性 =====
 
===== NFSv2 との互換性 =====
   
NFSv2 を使用するクライアント (例えば U-Boot) のサポートが必要な場合、{{ic|/etc/conf.d/nfs-server.conf}} に {{ic|1=NFSD_OPTS="-V 2"}} を設定してください。
+
NFSv2 を使用するクライアント (例えば U-Boot) のサポートが必要な場合、{{ic|/etc/sysconfig/nfs}} に {{ic|1=RPCNFSDARGS="-V 2"}} を設定してください。
   
 
===== ファイアウォール設定 =====
 
===== ファイアウォール設定 =====
127行目: 152行目:
 
=== クライアント ===
 
=== クライアント ===
   
  +
NFSv4 で [[Kerberos]] を使用するばあい、{{ic|nfs-client.target}} も[[起動]]・[[有効化]]する必要があります。{{ic|rpc-gssd.service}} が起動します。しかしながら、glibc のバグ ({{Bug|50663}}) が原因で、現在 {{ic|rpc-gssd.service}} は起動に失敗します。サービスに "-f" (foreground) フラグを追加することで起動できます:
[[systemd#ユニットを使う|systemd]] を使って {{ic|rpcbind.service}}, {{ic|nfs-client.target}}, {{ic|remote-fs.target}} を起動して下さい。また、サービスを有効にして起動時に systemd がクライアントを起動するように設定することも推奨されています。このユニットは他のサービスも必要としますが、それらは [[systemd]] によって自動的に起動されます。
 
   
  +
{{hc|# systemctl edit rpc-gssd.service|2=
3.12.7-2 以前のカーネルバージョン (例えば現在の {{pkg|linux-lts}}) のクライアントは {{ic|rpc-gssd.service}} を起動しなくてはなりません。そうしないとカーネルバグによって約15秒の遅延が発生して dmesg に "RPC: AUTH_GSS upcall timed out" というエラーが表示されます。
 
  +
[Unit]
  +
Requires=network-online.target
  +
After=network-online.target
   
  +
[Service]
{{Note|サーバーはこのサービスを実行することを必要としません。}}
 
  +
Type=simple
 
  +
ExecStart=
{{Warning|正しく設定を行わずにこのサービスを実行すると以下のようなエラーメッセージが表示されます:
 
  +
ExecStart=/usr/sbin/rpc.gssd -f
rpc.gssd[30473]: ERROR: Key table file '/etc/krb5.keytab' not found while beginning keytab scan for keytab 'FILE:/etc/krb5.keytab'
 
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
 
 
==== systemd のエラー ====
 
 
起動時に "Dependency failed for pNFS block layout mapping daemon" という警告が表示されることがあります。親切な警告ですが起動するたびに systemd のメッセージが表示されてしまいます (基本的に NFS は問題なく動作します)。サービスが必要ない場合、systemd のサービスをマスクすることで無効にできます。
 
 
# systemctl mask nfs-blkmap.service
 
   
 
==== Linux からマウントする ====
 
==== Linux からマウントする ====
157行目: 171行目:
   
 
NFSv4 の場合、root NFS ディレクトリをマウントして利用できるマウントを確認:
 
NFSv4 の場合、root NFS ディレクトリをマウントして利用できるマウントを確認:
$ mount server:/ /mountpoint/on/client
+
# mount server:/ /mountpoint/on/client
   
 
そしてサーバーの NFS エクスポートルートは省略してマウント:
 
そしてサーバーの NFS エクスポートルートは省略してマウント:
163行目: 177行目:
   
 
マウントが失敗する場合はサーバーのエクスポートルートを含めて見て下さい (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 アドレスではなく) ホストネームを指定する必要があります。それ以外だとリモート共有がハングアップします。}}
172行目: 186行目:
   
 
{{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行目: 201行目:
 
; 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 を使う =====
203行目: 217行目:
 
* {{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>}} マウントオプションを追加してみてください。
 
}}
 
}}
   
236行目: 250行目:
 
# mount -t nfs -o resvport,nolocks,locallocks servername:/srv/nfs4 /Volumes/servername
 
# 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 を見てさい。
+
{{ic|nolocks}} と {{ic|locallocks}} オプションを使う理由については [https://web.archive.org/web/20151212160906/https://blogs.oracle.com/jag/entry/nfs_on_snow_leopard NFS on Snow Leopard] を見てください。
   
 
== ヒントとテクニック ==
 
== ヒントとテクニック ==
242行目: 256行目:
 
=== パフォーマンスチューニング ===
 
=== パフォーマンスチューニング ===
   
NFS を使い倒つもりならば、ネットワーク設定の要件を満たすように {{ic|rsize}} や {{ic|wsize}} マウントオプションを調整してする必須になります。
+
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
  +
  +
変更を永続化するには [[Systemd#一時ファイル|systemd-tmpfile]] を作成してください:
  +
  +
{{hc|/etc/tmpfiles.d/nfsd-block-size.conf|
  +
w /proc/fs/nfsd/max_block_size - - - - 32768}}
   
 
=== systemd-networkd で共有を自動マウント ===
 
=== systemd-networkd で共有を自動マウント ===
257行目: 280行目:
 
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行目: 332行目:
 
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行目: 346行目:
   
 
==== systemd/タイマー ====
 
==== systemd/タイマー ====
  +
  +
以下のユニットを作成:
   
 
{{hc|# /etc/systemd/system/auto_share.timer|<nowiki>
 
{{hc|# /etc/systemd/system/auto_share.timer|<nowiki>
342行目: 369行目:
 
</nowiki>}}
 
</nowiki>}}
   
# systemctl enable auto_share.timer
+
作成したら {{ic|auto_share.timer}} を[[有効化]]してください。
   
 
==== systemd で起動時にマウント ====
 
==== systemd で起動時にマウント ====
372行目: 399行目:
 
ネットワーク状態の変化にあわせてネットワーク上の共有をマウントする一番簡単な方法は {{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行目: 405行目:
 
以下のスクリプトを使うことでネットワーク接続が切れる前に 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行目: 429行目:
 
</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 共有のマウントを処理]]を参照。
   
 
== トラブルシューティング ==
 
== トラブルシューティング ==
   
[[NFS/トラブルシューティング]] を参照してください。
+
[[NFS/トラブルシューティング]]を参照してください。
   
 
== 参照 ==
 
== 参照 ==
418行目: 445行目:
 
* [http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.prftungd/doc/prftungd/nfs_perf.htm NFS Performance Management]
 
* [http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.prftungd/doc/prftungd/nfs_perf.htm NFS Performance Management]
 
* [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://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://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]

2017年11月6日 (月) 21:46時点における版

関連記事

Wikipedia より:

Network File System (NFS) はローカルストレージにアクセスするのと同じようにネットワーク上のファイルにクライアントコンピュータでアクセスできるようにする分散ファイルシステムおよびそのプロトコルである。1984年に Sun Microsystems によって開発された。
ノート:
  • NFS は暗号化されません。機密情報を扱うときは KerberosTinc などの暗号化プロトコルを使って NFS をトンネル化してください。
  • Samba とは異なり、NFS にはデフォルトでユーザー認証がありません。クライアントのアクセスは IP アドレスやホストネームで制限します。

インストール

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

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

設定

サーバー

NFS サーバーにはエクスポート (共有ディレクトリ) のリストが必要で、/etc/exports に定義します。/etc/exports に定義する NFS 共有はいわゆる NFS ルートからの相対パスになります。セキュリティ上、NFS ルートを定義するときはサーバーのルートファイルシステム下の専用のディレクトリツリーを使用して、ユーザーからマウントポイントへのアクセスを制限すると良いでしょう。バインドマウントを使用して共有マウントポイントから実際のファイルシステム上のディレクトリにリンクします。

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

  1. NFS ルートは /srv/nfs
  2. エクスポートは /srv/nfs/music/mnt/music にバインドマウントする。
# mkdir -p /srv/nfs/music /mnt/music
# mount --bind /mnt/music /srv/nfs/music

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

/etc/fstab
/mnt/music /srv/nfs/music  none   bind   0   0
ノート:
  • NFS にはサーバーのファイルシステムのパーミッションが適用されるため、接続するユーザーに適当な権限があることを確認してください。
  • ZFS ファイルシステムの場合、バインドマウントの使い方が特殊です。ZFS#バインドマウントを見てください。

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

/etc/exports
/srv/nfs       192.168.1.0/24(rw,fsid=root,crossmnt)
/srv/nfs/music 192.168.1.0/24(rw) # Use whatever export options you see fit

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

# exportfs -rav

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

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

サーバーを起動する

nfs-server.service起動有効化してください。

その他

任意のサーバー設定

高度な設定オプションは /etc/nfs.conf で設定できます。単純な構成の場合はファイルを編集する必要はありません。

特定のインターフェイスあるいは 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再起動してください。

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
NFSv3 の固定ポート

NFSv3 クライアントのサポートが必要な場合、固定ポートを使うのが良いでしょう。デフォルトでは NFSv3 による rpc.statdlockd の制御にはランダムな一時ポートが使われます。ファイアウォールを通して NFSv3 の制御ができるようにするには固定ポートを定義する必要があります。/etc/sysconfig/nfs を編集して STATDARGS を設定してください:

/etc/sysconfig/nfs
STATDARGS="-p 32765 -o 32766 -T 32803"

rpc.mountd/etc/services を読み込んで通常の状態では同じ固定ポート 2048 に bind されます。しかしながら、明示的に定義する必要があるときは /etc/sysconfig/nfs を編集して RPCMOUNTDARGS を設定してください:

/etc/sysconfig/nfs
RPCMOUNTDARGS="-p 20048"

上記の変更を加えたら、複数のサービスを再起動してください。最初に設定オプションを /run/sysconfig/nfs-utils (参照: /usr/lib/systemd/scripts/nfs-utils_env.sh) に書き出して、二番目に新しいポートで rpc.statd を再起動し、最後に新しいポートで lockd (カーネルモジュール) をリロードします。次のサービスを再起動してください: nfs-config, rpcbind, rpc-statd, nfs-server

再起動後、サーバーで rpcinfo -p を使って固定ポートが思い通りにいってるか確認してください。クライアントから rpcinfo -p <server IP> を使えば本当に同じ固定ポートを使っているか明らかになります。

NFSv2 との互換性

NFSv2 を使用するクライアント (例えば U-Boot) のサポートが必要な場合、/etc/sysconfig/nfsRPCNFSDARGS="-V 2" を設定してください。

ファイアウォール設定

ファイアウォールを通過してアクセスできるようにするには、デフォルト設定の場合 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 で Kerberos を使用するばあい、nfs-client.target起動有効化する必要があります。rpc-gssd.service が起動します。しかしながら、glibc のバグ (FS#50663) が原因で、現在 rpc-gssd.service は起動に失敗します。サービスに "-f" (foreground) フラグを追加することで起動できます:

# systemctl edit rpc-gssd.service
[Unit]
Requires=network-online.target
After=network-online.target

[Service]
Type=simple
ExecStart=
ExecStart=/usr/sbin/rpc.gssd -f

Linux からマウントする

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 共有を自動マウントすると、データの量が多かった場合にフリーズする可能性があります。
autofs を使う

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

Windows からマウントする

ノート: "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") を両方有効にします。

"Services for Network File System" (検索ボックスで探して下さい) を開いて client > properties を右クリックすることでグローバルオプションを設定できます。

警告: パフォーマンスに深刻な問題が発生することがありますが (ギガビット LAN でもフォルダを表示するのに30から60秒ほどかかったり、ファイルのコピー速度が 2 MB/s になったりします)、Microsoft はまだ解決方法を用意できていません [1]

エクスプローラーを使って共有をマウントするには:

Computer > Map network drive > servername:/srv/nfs4/music

OS X からマウントする

ノート: OS X はデフォルトでセキュアでない (>1024) ポートを使って共有をマウントしません。

insecure フラグを使って共有をエクスポートし、Finder でマウントする:

Go > Connect to Server > nfs://servername/

またはターミナルでセキュアなポートを使って共有をマウント:

# mount -t nfs -o resvport,nolocks,locallocks servername:/srv/nfs4 /Volumes/servername

nolockslocallocks オプションを使う理由については NFS on Snow Leopard を見てください。

ヒントとテクニック

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

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

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

# echo 32767 > /proc/fs/nfsd/max_block_size

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

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

systemd-networkd で共有を自動マウント

systemd-networkd を使っている場合、起動時に nfs がマウントされないことがあります。以下のようなエラーが表示されます:

mount[311]: mount.nfs4: Network is unreachable

解決方法は簡単です。systemd-networkd-wait-online.service有効化して、ネットワークが完全に設定されるまで待機するように systemd を設定してください。サービスが平行して起動しなくなるので起動時間は多少長くなります。

自動マウントの処理

ローカルのワイヤレスネットワークから 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=timer.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 共有のマウントを処理を参照。

トラブルシューティング

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

参照