「NFS」の版間の差分
Kusakata.bot (トーク | 投稿記録) 細 (文字列「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 は共有のリスト |
+ | 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/ |
+ | # 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#バインドマウント]]を見てください。}} |
||
− | + | 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/ |
+ | /srv/nfs 192.168.1.0/24(rw,fsid=root,crossmnt) |
− | /srv/ |
+ | /srv/nfs/music 192.168.1.0/24(rw) # Use whatever export options you see fit |
</nowiki>}} |
</nowiki>}} |
||
+ | サーバー実行中に {{ic|/etc/exports}} を変更した場合は再度エクスポートしないと変更が適用されないので注意してください: |
||
− | 共有をサブネット全体で開く必要はありません。単一の IP アドレスまたはホスト名だけを指定することも可能です。 |
||
+ | # exportfs -rav |
||
− | 利用可能なオプションについて |
+ | 利用可能なオプションについて詳しくは {{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}} を[[起動]]・[[有効化]]してください。 |
+ | {{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/ |
+ | 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 |
|
そしてサーバーの 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:/ |
+ | # 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 |
+ | 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 を |
+ | 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| |
+ | {{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>}} |
||
− | + | 作成したら {{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/ |
+ | # 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/ |
+ | {{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 |
|
{{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 |
|
上記のスクリプトは別の接続で別の共有をマウントするように修正することができます。 |
上記のスクリプトは別の接続で別の共有をマウントするように修正することができます。 |
||
− | [[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-utils パッケージのインストールだけです。
設定
サーバー
NFS サーバーにはエクスポート (共有ディレクトリ) のリストが必要で、/etc/exports
に定義します。/etc/exports
に定義する NFS 共有はいわゆる NFS ルートからの相対パスになります。セキュリティ上、NFS ルートを定義するときはサーバーのルートファイルシステム下の専用のディレクトリツリーを使用して、ユーザーからマウントポイントへのアクセスを制限すると良いでしょう。バインドマウントを使用して共有マウントポイントから実際のファイルシステム上のディレクトリにリンクします。
下の例では以下の設定を使用します:
- NFS ルートは
/srv/nfs
。 - エクスポートは
/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
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) を参照してください。
サーバーを起動する
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_idmapping
が N
になっている場合、以下のコマンドを実行することで有効にできます:
# 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.statd
や lockd
の制御にはランダムな一時ポートが使われます。ファイアウォールを通して 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/nfs
に RPCNFSDARGS="-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.statd
や lockd
の固定ポートを使用している場合は、それらも設定に追加してください:
/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
/etc/fstab を使う
クライアントを立ち上げたときにいつでも NFS 共有が使えるように、常に稼働させているサーバーでは fstab を利用すると便利です。/etc/fstab
ファイルを編集して、設定に合わせて適切な行を追加してください。また、サーバーの NFS エクスポートルートは省略します。
/etc/fstab
servername:/music /mountpoint/on/client nfs rsize=8192,wsize=8192,timeo=14,_netdev 0 0
マウントオプションの説明は以下の通り:
- 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
を使います。
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
の設定を再読み込みしてください。
autofs を使う
複数のマシンを NFS で接続したい場合は autofs を使うのが便利です。サーバーだけでなくクライアントにもなることができます。他の簡単な方法よりもこの方法が推奨される理由は、サーバーの電源が落とされた時に、クライアントがNFS 共有を見つけられないことについてエラーを投げないからです。詳しくは autofs#NFS ネットワークマウント を見て下さい。
Windows からマウントする
"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 を右クリックすることでグローバルオプションを設定できます。
エクスプローラーを使って共有をマウントするには:
Computer
> Map network drive
> servername:/srv/nfs4/music
OS X からマウントする
insecure
フラグを使って共有をエクスポートし、Finder でマウントする:
Go
> Connect to Server
> nfs://servername/
またはターミナルでセキュアなポートを使って共有をマウント:
# mount -t nfs -o resvport,nolocks,locallocks servername:/srv/nfs4 /Volumes/servername
nolocks
と locallocks
オプションを使う理由については NFS on Snow Leopard を見てください。
ヒントとテクニック
パフォーマンスチューニング
NFS の性能を完全に発揮するには、ネットワーク設定にあわせて rsize
や wsize
マウントオプションを調整する必要があります。
最近の Linux カーネル (2.6.18 以上) ではメモリの容量によって NFS サーバーが使用できる I/O のサイズ (最大ブロックサイズ) が変わります。最大は 1M (1048576バイト) で、NFS クライアントがより大きな rsize
や wsize
を必要としている場合でもサーバーの最大ブロックサイズが使われます [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/トラブルシューティングを参照してください。