「NFS」の版間の差分
Kusanaginoturugi (トーク | 投稿記録) (→サーバーを起動する: 不要なスペースを削除) |
|||
(6人の利用者による、間の46版が非表示) | |||
1行目: | 1行目: | ||
[[Category:ファイルシステム]] |
[[Category:ファイルシステム]] |
||
− | [[Category:ネットワーク]] |
+ | [[Category:ネットワーク共有]] |
+ | [[Category:サーバー]] |
||
[[ar:NFS]] |
[[ar:NFS]] |
||
[[cs:NFS]] |
[[cs:NFS]] |
||
9行目: | 10行目: | ||
[[it:NFS]] |
[[it:NFS]] |
||
[[ru:NFS]] |
[[ru:NFS]] |
||
− | [[zh- |
+ | [[zh-hans:NFS]] |
{{Related articles start}} |
{{Related articles start}} |
||
{{Related|NFS/トラブルシューティング}} |
{{Related|NFS/トラブルシューティング}} |
||
− | {{Related|Avahi}} |
||
− | {{Related|ディスクレスシステム}} |
||
{{Related articles end}} |
{{Related articles end}} |
||
[[Wikipedia:ja:Network File System|Wikipedia]] より: |
[[Wikipedia:ja:Network File System|Wikipedia]] より: |
||
: ''Network File System (NFS) はローカルストレージにアクセスするのと同じようにネットワーク上のファイルにクライアントコンピュータでアクセスできるようにする分散ファイルシステムおよびそのプロトコルである。1984年に Sun Microsystems によって開発された。'' |
: ''Network File System (NFS) はローカルストレージにアクセスするのと同じようにネットワーク上のファイルにクライアントコンピュータでアクセスできるようにする分散ファイルシステムおよびそのプロトコルである。1984年に Sun Microsystems によって開発された。'' |
||
+ | |||
+ | {{Note| |
||
+ | *NFS は暗号化されません。機密情報を扱うときは [[Kerberos]] や [[Tinc]] などの暗号化プロトコルを使って NFS をトンネル化してください。 |
||
+ | *[[Samba]] とは異なり、NFS にはデフォルトでユーザー認証がありません。クライアントのアクセスは IP アドレスや[[ホストネーム]]で制限します。 |
||
+ | * NFS では、クライアントとサーバーの両方で [[ユーザー]] および/または [[ユーザーグループ]] ID が同じであることを期待しています(Kerberos を使用していない場合)。[[#idmapping を有効化]]するか、{{ic|/etc/exports}} で {{ic|anonuid}}/{{ic|anongid}} と {{ic|all_squash}} を一緒に使用して UID/GID を手動で上書きしてください。 |
||
+ | * NFS は [[アクセス制御リスト|POSIX ACLs]] をサポートしていません。NFS サーバーは引き続き ACL を強制しますが、クライアントはそれらを見たり変更したりすることができません。 |
||
+ | |||
+ | }} |
||
== インストール == |
== インストール == |
||
22行目: | 29行目: | ||
クライアントとサーバーどちらでも必要なのは {{Pkg|nfs-utils}} パッケージの[[pacman|インストール]]だけです。 |
クライアントとサーバーどちらでも必要なのは {{Pkg|nfs-utils}} パッケージの[[pacman|インストール]]だけです。 |
||
− | + | クライアント・サーバーの時計を一致させるために全てのノードで[[時刻同期]]デーモンを使うことが強く推奨されます。全てのノードで時計が正確でないと、NFS は望ましくない遅延を生じさせる可能性があります。 |
|
− | ==設定== |
+ | ==サーバー設定== |
+ | グローバル設定オプションは {{ic|/etc/nfs.conf}} で設定されます。単純な設定を使用するユーザーはこのファイルを編集する必要はありません。 |
||
− | ===サーバー=== |
||
− | NFS は共有のリスト |
+ | NFS サーバーは、共有するディレクトリのリストが必要で、{{ic|/etc/exports}} または {{ic|/etc/exports.d/*.exports}} に定義する必要があります(詳細は {{man|5|exports}} を参照)。デフォルトでは、ディレクトリはそのパスのままエクスポートされます。例えば: |
+ | {{hc|/etc/exports|2= |
||
− | {{ic|/etc/exports}} に NFS ルートの相対パスで NFS 共有を定義します。ここでは、NFS ルートは {{ic|/srv/nfs4}} とし、{{ic|/mnt/music}} を共有させます。 |
||
+ | /data/music 192.168.1.0/24(rw) |
||
+ | }} |
||
+ | 上記の設定により、ディレクトリ {{ic|/data/music}} は NFSv3 および NFSv4 で {{ic|MyServer:/data/music}} としてマウント可能になります。 |
||
− | # mkdir -p /srv/nfs4/music |
||
+ | === カスタムエクスポートルート === |
||
− | クライアントが書き込めるように music ディレクトリには読み書きの権限を設定しておきます。 |
||
+ | 共有はいわゆる NFS ルートからの相対パスになります。セキュリティ上、NFS ルートを定義するときはサーバーのルートファイルシステム下の専用のディレクトリツリーを使用して、ユーザーからマウントポイントへのアクセスを制限すると良いでしょう。バインドマウントは、共有マウントポイントを [[ファイルシステム]] 上の実際のディレクトリにリンクするために使用されます。過去には NFSv4 で NFS ルートが必須でしたが、現在はオプションです(カーネル 2.6.33 および nfs-utils 1.2.2 から、仮想ルートが実装されています)。 |
||
− | そして実際の対象の共有である {{ic|/mnt/music}} を NFS 共有に mount コマンドでマウントします: |
||
+ | 下の例では以下の設定を使用します: |
||
− | # mount --bind /mnt/music /srv/nfs4/music |
||
+ | # NFS ルートは {{ic|/srv/nfs}}。 |
||
− | サーバーを再起動してもマウントされるように、bind マウントを {{ic|fstab}} に追加: |
||
+ | # エクスポートは {{ic|/srv/nfs/music}} で {{ic|/mnt/music}} にバインドマウントする。 |
||
− | {{hc|/etc/fstab| |
||
− | /mnt/music /srv/nfs4/music none bind 0 0 |
||
− | }} |
||
+ | # mkdir -p /srv/nfs/music /mnt/music |
||
− | 共有するディレクトリと、マウントを許可するクライアントマシンの ip アドレスまたはホスト名を {{ic|exports}} に追加します: |
||
+ | # mount --bind /mnt/music /srv/nfs/music |
||
− | {{hc|/etc/exports|<nowiki> |
||
− | /srv/nfs4/ 192.168.1.0/24(rw,fsid=root,no_subtree_check) |
||
− | /srv/nfs4/music 192.168.1.0/24(rw,no_subtree_check,nohide) # note the nohide option which is applied to mounted directories on the file system. |
||
− | </nowiki>}} |
||
+ | {{Note|[[ZFS]] ファイルシステムの場合、バインドマウントの使い方が特殊です。[[ZFS#バインドマウント]]を見てください。}} |
||
− | 共有をサブネット全体で開く必要はありません。単一の IP アドレスまたはホスト名だけを指定することも可能です。 |
||
+ | サーバーを再起動してもマウントされるように、バインドマウントを [[fstab]] に追加: |
||
− | 利用可能なオプションについての詳細は {{ic|man 5 exports}} を見て下さい。 |
||
+ | {{hc|/etc/fstab|/mnt/music /srv/nfs/music none bind 0 0}} |
||
− | {{Note|Modifying {{ic|/etc/exports}} while the server is running will require a re-export for changes to take effect: {{ic|# exportfs -rav}}.}} |
||
+ | CIDR によるアドレス指定またはホストネームを使ってマウントを許可するクライアントマシンを制限するには {{ic|/etc/exports}} に以下のように共有ディレクトリを追加: |
||
− | ==== サーバーを起動する ==== |
||
+ | {{hc|/etc/exports|2= |
||
− | {{ic|nfs-server.service}} を[[起動]]・[[有効化]]してください。昔の V2 や V3 のエクスポートを使うには {{ic|rpcbind.service}} も必要になります。V4 だけを使う場合は、V2 と V3 を明示的に無効化してください [https://bbs.archlinux.org/viewtopic.php?id=193629]: {{hc|/etc/conf.d/nfs-server.conf|2= |
||
+ | /srv/nfs 192.168.1.0/24(rw,fsid=root) |
||
− | NFSD_OPTS="-N 2 -N 3" |
||
+ | /srv/nfs/music 192.168.1.0/24(rw,sync) |
||
+ | /srv/nfs/home 192.168.1.0/24(rw,sync) |
||
+ | /srv/nfs/public 192.168.1.0/24(ro,all_squash,insecure) desktop(rw,sync,all_squash,anonuid=99,anongid=99) # map to user/group - in this case ''nobody'' |
||
}} |
}} |
||
− | 上記の設定をしない場合 {{ic|rpcbind.service}} が必要になります。 |
||
+ | NFSv4 を使用する場合、オプション {{ic|1=fsid=root}} または {{ic|1=fsid=0}} は「ルート」エクスポートを示します。そのようなエクスポートが存在する場合、他のすべてのディレクトリはそれ以下でなければなりません。{{ic|/etc/nfs.conf}} ファイルの {{ic|rootdir}} オプションはこれに影響しません。{{ic|1=fsid=0}} エクスポートがない場合のデフォルトの動作は、NFSv3 と同じように動作することです。 |
||
− | ==== その他 ==== |
||
+ | 上記の例では、{{ic|/srv/nfs}} がルートとして指定されているため、エクスポート {{ic|/srv/nfs/music}} は NFSv4 を介して {{ic|MyServer:/music}} としてマウント可能になります - ルートプレフィックスは省略されることに注意してください。 |
||
− | ===== 任意のサーバー設定 ===== |
||
− | {{ic|/etc/conf.d/nfs-server.conf}} には rpc.nfsd, rpc.mountd, rpc.svcgssd のオプションを任意で記述します。シンプルな設定をする場合はこのファイルを編集する必要はありません。 |
||
+ | {{Tip| |
||
− | ===== 固定ポート ===== |
||
+ | * NFSv3 には必要ですが NFSv4 には必要ない {{ic|crossmnt}} オプションは、{{ic|crossmnt}} でマークされたファイルシステム上にマウントされた '''全ての''' ファイルシステムにクライアントがアクセスできるようにします。クライアントはすべての子エクスポートを別々にマウントする必要がありません。ただし、異なるアドレス範囲で子が共有されている場合、これは望ましくないかもしれません。 |
||
− | NFSv3 クライアントのサポートが必要な場合、固定ポートを使うのが良いでしょう。デフォルトでは、NFSv3 による {{ic|rpc.statd}} や {{ic|lockd}} の制御にはランダムな一時的なポートが使われます。ファイアウォールを通して NFSv3 の制御ができるようにするには固定ポートを定義する必要があります。{{ic|/etc/conf.d/nfs-common.conf}} を編集して {{ic|STATD_OPTS}} を設定してください: |
||
+ | * {{ic|crossmnt}} の代わりに、子エクスポートに {{ic|nohide}} オプションを使用すると、クライアントがルートエクスポートをマウントするときに自動的にマウントされます。{{ic|crossmnt}} と異なり、{{ic|nohide}} は子エクスポートのアドレス範囲を尊重します。このオプションも NFSv3 固有であり、NFSv4 は常に nohide が有効であるかのように振る舞います。 |
||
− | |||
+ | * {{ic|insecure}} オプションは、クライアントが 1023 番以上のポートから接続できるようにします。(通常、ルートユーザーのみが低番号ポートを使用できるため、デフォルトで他のポートをブロックすることはアクセスへの表面的な障壁を作ります。実際には {{ic|insecure}} オプションを省略しても含めても、セキュリティに有意な改善または悪化はありません。) |
||
− | {{hc|/etc/conf.d/nfs-common.conf|2= |
||
+ | * アスタリスク ({{ic|*}}) を使用して、任意のインターフェースからのアクセスを許可します。 |
||
− | STATD_OPTS="-p 32765 -o 32766 -T 32803" |
||
}} |
}} |
||
+ | サーバー実行中に {{ic|/etc/exports}} を変更した場合は再度エクスポートしないと変更が適用されないので注意してください: |
||
− | {{ic|rpc.mountd}} は {{ic|/etc/services}} を読み込んで通常の状態では同じ固定ポート 2048 に bind されます。しかしながら、明示的に定義する必要があるときは {{ic|/etc/conf.d/nfs-server.conf}} を編集して MOUNTD_OPTS を設定してください: |
||
+ | # exportfs -rav |
||
+ | 現在ロードされているエクスポートの状態をより詳細に見るには、以下を使用する: |
||
− | {{hc|/etc/conf.d/nfs-server.conf|2= |
||
− | MOUNTD_OPTS="-p 20048" |
||
− | }} |
||
+ | # exportfs -v |
||
− | これらの変更を加えたら、複数のサービスを再起動してください。最初に設定オプションを {{ic|/run/sysconfig/nfs-utils}} (参照: {{ic|/usr/lib/systemd/scripts/nfs-utils_env.sh}}) に書き出して、二番目に新しいポートで {{ic|rpc.statd}} を再起動し、最後に新しいポートで lockd (カーネルモジュール) をリロードします。 |
||
+ | 利用可能なオプションについて詳しくは {{man|5|exports}} を参照してください。 |
||
− | # systemctl restart nfs-config |
||
+ | {{Tip|IP の範囲を CIDR 表記に変換するツールとして [http://ip2cidr.com/ ip2cidr] が存在します。}} |
||
− | # systemctl restart rpcbind |
||
+ | {{Note|エクスポート先が tmpfs ファイルシステムの場合、{{ic|1=fsid=1}} オプションが必要です。}} |
||
− | # systemctl restart rpc-statd |
||
− | # systemctl restart nfs-server |
||
+ | === サーバーを起動する === |
||
− | 再起動後、サーバーで {{ic|rpcinfo -p}} を使って固定ポートが思い通りにいってるか確認してください。クライアントから {{ic|rpcinfo -p <server IP>}} を使えば本当に同じ固定ポートを使っているか明らかになります。 |
||
+ | * NFSv3 および NFSv4 サービスを提供するには、{{ic|nfs-server.service}} を[[開始]]して[[有効化]]します。 |
||
− | ===== NFSv2 との互換性 ===== |
||
+ | * NFSv4 サービスのみを提供するには、{{ic|nfsv4-server.service}} を[[開始]]して[[有効化]]します。 |
||
+ | プロトコルバージョン 4 のエクスポートを使用するユーザーは、不要なサービスが実行されないように、最低限 {{ic|rpcbind.service}} と {{ic|rpcbind.socket}} を[[マスク]]することを望むでしょう。詳細は {{Bug|76453}} を参照してください。また、何らかの理由で引き込まれた {{ic|nfs-server.service}} もマスクすることを検討してください。 |
||
− | NFSv2 を使用するクライアント (例えば U-Boot) のサポートが必要な場合、{{ic|/etc/conf.d/nfs-server.conf}} に {{ic|1=NFSD_OPTS="-V 2"}} を設定してください。 |
||
+ | {{Note|ZFS シェアをエクスポートする場合は、{{ic|zfs-share.service}} も [[開始]]/[[有効化]] してください。これを行わないと、再起動後に ZFS シェアがエクスポートされなくなります。詳細は [[ZFS#NFS]] を参照してください。}} |
||
− | ===== ファイアウォール設定 ===== |
||
+ | |||
+ | === 特定のインターフェイスあるいは IP からのアクセスに NFS を制限 === |
||
+ | |||
+ | デフォルトでは {{ic|nfs-server.service}} を起動すると {{ic|/etc/exports}} とは関係なく全てのネットワークインターフェイスから接続を待機します。待機する IP あるいはホストネームを定義することで挙動を変更できます: |
||
+ | |||
+ | {{hc|/etc/nfs.conf|2= |
||
+ | [nfsd] |
||
+ | host=192.168.1.123 |
||
+ | # Alternatively, you can use your hostname. |
||
+ | # host=myhostname |
||
+ | }} |
||
+ | |||
+ | 変更を適用するには {{ic|nfs-server.service}} を[[再起動]]してください。 |
||
+ | |||
+ | === ファイアウォール設定 === |
||
ファイアウォールを通過してアクセスできるようにするには、デフォルト設定の場合 tcp と udp のポート 111, 2049, 20048 を開放する必要があります。{{ic|rpcinfo -p}} を使ってサーバーで使用しているポートを確認してください。この設定を [[iptables]] でするには、{{ic|/etc/iptables/iptables.rules}} を編集して以下の行を含めるようにしてください: |
ファイアウォールを通過してアクセスできるようにするには、デフォルト設定の場合 tcp と udp のポート 111, 2049, 20048 を開放する必要があります。{{ic|rpcinfo -p}} を使ってサーバーで使用しているポートを確認してください。この設定を [[iptables]] でするには、{{ic|/etc/iptables/iptables.rules}} を編集して以下の行を含めるようにしてください: |
||
117行目: | 136行目: | ||
</nowiki>}} |
</nowiki>}} |
||
+ | v4 以上だけを使う構成の場合、開く必要があるのは tcp ポート 2049 だけです。したがって、必要な行は一行だけになります: |
||
− | 変更を適用するために、{{ic|iptables}} サービスを再起動してください。 |
||
+ | {{hc|/etc/iptables/iptables.rules|<nowiki> |
||
− | === クライアント === |
||
+ | -A INPUT -p tcp -m tcp --dport 2049 -j ACCEPT |
||
+ | </nowiki>}} |
||
+ | 変更を適用するために、{{ic|iptables}} サービスを再起動してください。 |
||
− | [[systemd#ユニットを使う|systemd]] を使って {{ic|rpcbind.service}} と {{ic|nfs-client.target}} を起動して下さい。また、サービスを有効にして起動時に systemd がクライアントを起動するように設定することも推奨されています。このユニットは他のサービスも必要としますが、それらは [[systemd]] によって自動的に起動されます。 |
||
+ | === NFSv4 の ID マッピングが有効になっていることを確認 === |
||
− | 3.12.7-2 以前のカーネルバージョン (例えば現在の {{pkg|linux-lts}}) のクライアントは {{ic|rpc-gssd.service}} を起動しなくてはなりません。そうしないとカーネルバグによって約15秒の遅延が発生して dmesg に "RPC: AUTH_GSS upcall timed out" というエラーが表示されます。 |
||
+ | idmapd が動作していても、マッピングが完全には有効になっていないことがあります。{{ic|/sys/module/nfsd/parameters/nfs4_disable_idmapping}} が {{ic|N}} になっている場合、以下のコマンドを実行することで有効にできます: |
||
− | {{Note|サーバーはこのサービスを実行することを必要としません。}} |
||
+ | # echo "N" | sudo tee /sys/module/nfsd/parameters/nfs4_disable_idmapping |
||
− | {{Warning|正しく設定を行わずにこのサービスを実行すると以下のようなエラーメッセージが表示されます: |
||
− | 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 |
||
− | 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}} をブラックリストに入れます。 |
||
− | + | {{hc|/etc/modprobe.d/nfsd.conf|<nowiki> |
|
+ | options nfsd nfs4_disable_idmapping=0 |
||
− | # reboot |
||
+ | </nowiki>}} |
||
− | |||
− | ==== systemd のエラー ==== |
||
+ | == クライアント設定 == |
||
− | 起動時に "Dependency failed for pNFS block layout mapping daemon" という警告が表示されることがあります。親切な警告ですが起動するたびに systemd のメッセージが表示されてしまいます (基本的に NFS は問題なく動作します)。サービスが必要ない場合、systemd のサービスをマスクすることで無効にできます。 |
||
+ | NFSv4 で [[Kerberos]] を使用する場合、{{ic|nfs-client.target}} も[[起動]]・[[有効化]]する必要があります。 |
||
− | # systemctl mask nfs-blkmap.service |
||
− | + | === 手動マウント === |
|
NFSv3 の場合、次のコマンドを使ってサーバーのエクスポートされたファイルシステムを表示: |
NFSv3 の場合、次のコマンドを使ってサーバーのエクスポートされたファイルシステムを表示: |
||
151行目: | 166行目: | ||
NFSv4 の場合、root NFS ディレクトリをマウントして利用できるマウントを確認: |
NFSv4 の場合、root NFS ディレクトリをマウントして利用できるマウントを確認: |
||
− | + | # mount server:/ /mountpoint/on/client |
|
そしてサーバーの NFS エクスポートルートは省略してマウント: |
そしてサーバーの NFS エクスポートルートは省略してマウント: |
||
− | # mount -t nfs servername:/music /mountpoint/on/client |
+ | # 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:/ |
+ | # 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 を使う === |
|
クライアントを立ち上げたときにいつでも NFS 共有が使えるように、常に稼働させているサーバーでは [[fstab]] を利用すると便利です。{{ic|/etc/fstab}} ファイルを編集して、設定に合わせて適切な行を追加してください。また、サーバーの NFS エクスポートルートは省略します。 |
クライアントを立ち上げたときにいつでも NFS 共有が使えるように、常に稼働させているサーバーでは [[fstab]] を利用すると便利です。{{ic|/etc/fstab}} ファイルを編集して、設定に合わせて適切な行を追加してください。また、サーバーの NFS エクスポートルートは省略します。 |
||
{{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秒になるか正式なタイムアウトになります。遅いサーバーやトラフィックの多いネットワークに接続する場合、このタイムアウトの値を増やすことでパフォーマンスが改善されるかもしれません。 |
||
181行目: | 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 の {{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 noauto,x-systemd.automount,x-systemd.device-timeout=10,timeo=14 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 |
}} |
}} |
||
196行目: | 211行目: | ||
* 上記の {{ic|noauto}} はアクセスされるまで NFS 共有をマウントしません: いますぐに利用できるようにしたいときは {{ic|auto}} を使って下さい。<br>ネットワークが立ち上がってなかったり利用できないことが理由でマウントが失敗する問題が発生するときは、{{ic|NetworkManager-wait-online.service}} を [[systemd#ユニットを使う|有効]]にします: このサービスは有効化される前に {{ic|network.target}} の全てのリンクが利用可能になることを保証します。 |
* 上記の {{ic|noauto}} はアクセスされるまで NFS 共有をマウントしません: いますぐに利用できるようにしたいときは {{ic|auto}} を使って下さい。<br>ネットワークが立ち上がってなかったり利用できないことが理由でマウントが失敗する問題が発生するときは、{{ic|NetworkManager-wait-online.service}} を [[systemd#ユニットを使う|有効]]にします: このサービスは有効化される前に {{ic|network.target}} の全てのリンクが利用可能になることを保証します。 |
||
* {{ic|users}} マウントオプションはユーザーによるマウントを許可しますが、{{ic|noexec}} などのオプションも含まれているので注意してください。 |
* {{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 共有を自動マウントすると、データの量が多かった場合にフリーズする可能性があります。}} |
||
− | {{Note|Users trying to automount a NFS-share via systemd which is mounted the same way on the server may experience a freeze when handling larger amounts of data.}} |
||
− | + | === systemd ユニットとして === |
|
+ | {{ic|/etc/systemd/system}} 内に新しい {{ic|.mount}} ファイルを作成します。例:{{ic|mnt-home.mount}}。詳細は {{man|5|systemd.mount}} を参照してください。 |
||
− | 複数のマシンを NFS で接続したい場合は [[autofs]] を使うのが便利です。サーバーだけでなくクライアントにもなることができます。他の簡単な方法よりもこの方法が推奨される理由は、サーバーの電源が落とされた時に、クライアントがNFS 共有を見つけられないことについてエラーを投げないからです。詳しくは [[autofs#NFS ネットワークマウント]] を見て下さい。 |
||
+ | {{Note|ファイル名が使用したいマウントポイントに対応していることを確認してください。 |
||
− | ==== Windows からマウントする ==== |
||
+ | 例えば、ユニット名 {{ic|mnt-home.mount}} は {{ic|/mnt/home}} の下に共有をマウントする場合にのみ使用できます。それ以外の場合、次のエラーが発生する可能性があります:{{ic|1=systemd[1]: mnt-home.mount: Where= setting does not match unit name. Refusing.}}。マウントポイントに非ASCII文字が含まれている場合は、[[Systemd#Writing unit files|systemd-escape]] を使用してください。}} |
||
+ | {{ic|1=What=}} 共有へのパス |
||
− | {{Note|Only the Ultimate and Enterprise editions of Windows 7 and the Enterprise edition of Windows 8 include "Client for NFS".}} |
||
− | "Client for NFS" サービスが有効になっていれば Windows から NFS 共有をマウントできます (デフォルトでは有効になっていません)。 |
||
− | サービスをインストールするにはコントロールパネルの "Programs and features" から "Turn Windows features on or off" をクリックしてください。"Services for NFS" と副サービス ("Administrative tools" と "Client for NFS") を両方有効にします。 |
||
+ | {{ic|1=Where=}} 共有をマウントするパス |
||
− | "Services for Network File System" (検索ボックスで探して下さい) を開いて ''client > properties'' を右クリックすることでグローバルオプションを設定できます。 |
||
+ | {{ic|1=Options=}} 共有のマウントオプション |
||
− | {{Warning|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]}} |
||
+ | {{Note| |
||
− | エクスプローラーを使って共有をマウントするには: |
||
+ | * ネットワークマウントユニットは自動的に {{ic|remote-fs-pre.target}}、{{ic|network.target}}、および {{ic|network-online.target}} に対して {{ic|After}} 依存関係を取得し、{{ic|nofail}} マウントオプションが設定されていない限り {{ic|remote-fs.target}} に対して {{ic|Before}} 依存関係を取得します。後者には {{ic|Wants}} ユニットも追加されます。 |
||
+ | * {{ic|Options}} に {{ic|noauto}} を [[追加]] して、ブート時の自動マウントを防ぎます(他のユニットによって引き込まれない限り)。 |
||
+ | * サーバーの IP アドレスではなくホスト名を使用したい場合、{{ic|1=After}} に {{ic|1=nss-lookup.target}} を追加します。これにより、ユニットのテスト時には発生しないブート時のマウントエラーを回避できるかもしれません。 |
||
+ | }} |
||
+ | {{hc|/etc/systemd/system/mnt-home.mount|2= |
||
− | {{ic|Computer}} > {{ic|Map network drive}} > {{ic|servername:/srv/nfs4/music}} |
||
+ | [Unit] |
||
+ | Description=Mount home at boot |
||
+ | [Mount] |
||
− | ==== OS X からマウントする ==== |
||
+ | What=172.16.24.192:/home |
||
+ | Where=/mnt/home |
||
+ | Options=vers=4 |
||
+ | Type=nfs |
||
+ | TimeoutSec=30 |
||
+ | [Install] |
||
− | {{Note|OS X はデフォルトでセキュアでない (>1024) ポートを使って共有をマウントしません。}} |
||
+ | WantedBy=multi-user.target |
||
− | {{ic|insecure}} フラグを使って共有をエクスポートし、Finder でマウントする: |
||
+ | }} |
||
+ | {{Tip|システムが到達不能な場合、{{ic|1=ForceUnmount=true}} を {{ic|[Mount]}} に[[追加]]して、エクスポートを(強制的に)アンマウントできるようにします。}} |
||
− | {{ic|Go}} > {{ic|Connect to Server}} > {{ic|nfs://servername/}} |
||
+ | {{ic|mnt-home.mount}} を使用するには、ユニットを[[開始]]し、システムブート時に実行するように[[有効化]]します。 |
||
− | またはターミナルでセキュアなポートを使って共有をマウント: |
||
− | # mount -t nfs -o resvport,nolocks,locallocks servername:/srv/nfs4 /Volumes/servername |
||
+ | ==== オートマウント ==== |
||
− | {{ic|nolocks}} と {{ic|locallocks}} オプションを使う理由については https://blogs.oracle.com/jag/entry/nfs_on_snow_leopard を見て下さい。 |
||
+ | 共有を自動的にマウントするには、次のオートマウントユニットを使用できます: |
||
− | == 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」やそれ以上に増やすことができます。これはサーバー/ネットワークの要件に応じて変わります: |
||
− | === systemd-networkd で共有を自動マウント === |
||
+ | {{hc|/etc/nfs.conf|2= |
||
− | systemd-networkd を使っている場合、起動時に nfs がマウントされないことがあります。以下のようなエラーが表示されます: |
||
+ | [nfsd] |
||
− | mount[311]: mount.nfs4: Network is unreachable |
||
+ | threads=16 |
||
+ | }} |
||
+ | NFS の性能を完全に発揮するには、ネットワーク設定にあわせて {{ic|rsize}} や {{ic|wsize}} マウントオプションを調整する必要があります。 |
||
− | 解決方法は簡単です。{{ic|systemd-networkd-wait-online.service}} を[[有効化]]して、ネットワークが完全に設定されるまで待機するように systemd を設定してください。サービスが平行して起動しなくなるので起動時間は多少長くなります。 |
||
+ | |||
+ | 最近の 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}} を使用すると、サーバーがクラッシュするか不正な再起動をすると、データの損失や破損のリスクがあります。}} |
||
=== 自動マウントの処理 === |
=== 自動マウントの処理 === |
||
249行目: | 325行目: | ||
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> |
||
301行目: | 377行目: | ||
done |
done |
||
</nowiki>}} |
</nowiki>}} |
||
+ | |||
+ | スクリプトに実行権限を付与: |
||
# chmod +x /usr/local/bin/auto_share |
# chmod +x /usr/local/bin/auto_share |
||
− | cron エントリか systemd/タイマーを作成して、共有サーバーにアクセスできるか1分ごとに確認するようにしてください。 |
+ | [[cron]] エントリか [[systemd/タイマー|systemd タイマー]]を作成して、共有サーバーにアクセスできるか1分ごとに確認するようにしてください。 |
==== Cron ==== |
==== Cron ==== |
||
313行目: | 391行目: | ||
==== systemd/タイマー ==== |
==== systemd/タイマー ==== |
||
+ | |||
+ | 以下のユニットを作成: |
||
{{hc|# /etc/systemd/system/auto_share.timer|<nowiki> |
{{hc|# /etc/systemd/system/auto_share.timer|<nowiki> |
||
322行目: | 402行目: | ||
[Install] |
[Install] |
||
− | WantedBy= |
+ | WantedBy=timers.target |
</nowiki>}} |
</nowiki>}} |
||
334行目: | 414行目: | ||
</nowiki>}} |
</nowiki>}} |
||
− | + | 作成したら {{ic|auto_share.timer}} を[[有効化]]してください。 |
|
==== systemd で起動時にマウント ==== |
==== systemd で起動時にマウント ==== |
||
356行目: | 436行目: | ||
{{ic|auto_share.service}} を[[有効化]]してください。 |
{{ic|auto_share.service}} を[[有効化]]してください。 |
||
− | ==== NetworkManager dispatcher ==== |
+ | ==== NetworkManager dispatcher を使う ==== |
上で説明している方法に加えて、ネットワークの状態が変わった時にスクリプトを実行するよう NetworkManager を設定することもできます。 |
上で説明している方法に加えて、ネットワークの状態が変わった時にスクリプトを実行するよう NetworkManager を設定することもできます。 |
||
364行目: | 444行目: | ||
ネットワーク状態の変化にあわせてネットワーク上の共有をマウントする一番簡単な方法は {{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 アプレットがフリーズしたりすることがあります。 |
||
370行目: | 450行目: | ||
以下のスクリプトを使うことでネットワーク接続が切れる前に NFS 共有を安全にアンマウントすることができます: |
以下のスクリプトを使うことでネットワーク接続が切れる前に NFS 共有を安全にアンマウントすることができます: |
||
− | {{hc|/etc/NetworkManager/dispatcher.d/ |
+ | {{hc|/etc/NetworkManager/dispatcher.d/30-nfs.sh|<nowiki> |
#!/bin/bash |
#!/bin/bash |
||
378行目: | 458行目: | ||
if [[ "$CONNECTION_UUID" == "$WANTED_CON_UUID" ]]; then |
if [[ "$CONNECTION_UUID" == "$WANTED_CON_UUID" ]]; then |
||
− | |||
− | # Determine all NFS mountpoints from /etc/fstab |
||
− | MOUNT_POINTS=$(sed -e '/^.*#/d' -e '/^.*:/!d' -e 's/\t/ /g' /etc/fstab | tr -s " " | cut -f2 -d" ") |
||
− | |||
− | # or manually list the space-separated mountpoints |
||
− | # MOUNT_POINTS="/mnt/nfs_share /mnt/other_nfs_storage" |
||
# Script parameter $1: NetworkManager connection name, not used |
# Script parameter $1: NetworkManager connection name, not used |
||
390行目: | 464行目: | ||
case "$2" in |
case "$2" in |
||
"up") |
"up") |
||
− | + | mount -a -t nfs4,nfs |
|
− | mountpoint -q $mntpnt || mount $mntpnt |
||
− | done |
||
;; |
;; |
||
"pre-down");& |
"pre-down");& |
||
"vpn-pre-down") |
"vpn-pre-down") |
||
− | + | umount -l -a -t nfs4,nfs >/dev/null |
|
− | umount -l -f $srvexp >/dev/null |
||
− | done |
||
;; |
;; |
||
esac |
esac |
||
404行目: | 474行目: | ||
</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 共有のマウントを処理]]を参照。 |
+ | |||
+ | === TLS 暗号化 === |
||
+ | |||
+ | Linux 6.5 からは、{{ic|1=xprtsec=tls}} マウントオプションを使用して NFS トラフィックを TLS で暗号化することができます。始めるには、クライアントとサーバーに {{AUR|ktls-utils}} パッケージをインストールし、以下の設定手順に従ってください。 |
||
+ | |||
+ | ==== サーバー ==== |
||
+ | |||
+ | プライベートキーを作成し、サーバーの DNS 名を含む証明書を取得します(詳細は [[Transport Layer Security#証明書を取得|Transport Layer Security]] を参照)。これらのファイルをシステムの信頼ストアに追加する必要はありません。 |
||
+ | |||
+ | {{Note|自己署名証明書を暗号化したものは現在サポートされておらず、マウント失敗の原因となります。}} |
||
+ | |||
+ | {{ic|/etc/tlshd.conf}} を編集して、{{ic|x509.certificate}} と {{ic|x509.private_key}} に自分の値を使用してこれらのファイルを利用します。 |
||
+ | {{hc|/etc/tlshd.conf|2= |
||
+ | [authenticate.server] |
||
+ | x509.certificate= /etc/nfsd-certificate.pem |
||
+ | x509.private_key= /etc/nfsd-private-key.pem |
||
+ | }} |
||
+ | |||
+ | そして、{{ic|tlshd.service}} を[[開始]]して[[有効化]]します。 |
||
+ | |||
+ | ==== クライアント ==== |
||
+ | |||
+ | 前の手順で生成したサーバーの TLS 証明書をシステムの信頼ストアに追加します(詳細は [[Transport Layer Security#Add a certificate to a trust store|トランスポート層セキュリティ]] を参照)。 |
||
+ | |||
+ | {{ic|tlshd.service}} を[[開始]]して[[有効化]]します。 |
||
+ | |||
+ | これで、サーバーの DNS 名を使用してサーバーをマウントすることができるはずです: |
||
+ | |||
+ | # mount -o xprtsec=tls ''servername.domain'':/ ''/mountpoint/on/client'' |
||
+ | |||
+ | クライアント上の journalctl を確認すると、TLS ハンドシェイクが成功したことが表示されるはずです: |
||
+ | |||
+ | {{hc|$ journalctl -b -u tlshd.service| |
||
+ | Sep 28 11:14:46 client tlshd[227]: Built from ktls-utils 0.10 on Sep 26 2023 14:24:03 |
||
+ | Sep 28 11:15:37 client tlshd[571]: Handshake with servername.domain (192.168.122.100) was successful |
||
+ | }} |
||
== トラブルシューティング == |
== トラブルシューティング == |
||
− | [[NFS/トラブルシューティング]] |
+ | [[NFS/トラブルシューティング]]を参照してください。 |
== 参照 == |
== 参照 == |
||
+ | * NFS 共有の自動検出を可能にする Zeroconf 実装である [[Avahi]] も参照してください。 |
||
− | * [http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.prftungd/doc/prftungd/nfs_perf.htm NFS Performance Management] |
||
+ | * HOWTO: [[ディスクレスシステム]] |
||
− | * [http://blogs.msdn.com/sfu/archive/2008/04/14/all-well-almost-about-client-for-nfs-configuration-and-performance.aspx Microsoft Services for Unix NFS Client info] |
||
+ | * [https://web.archive.org/web/20201111215940/https://docs.microsoft.com/en-us/archive/blogs/msdn/sfu/all-well-almost-about-client-for-nfs-configuration-and-performance/ Microsoft Services for Unix NFS Client info] |
||
− | * [https://blogs.oracle.com/jag/entry/nfs_on_snow_leopard NFS on Snow Leopard] |
||
+ | * [https://web.archive.org/web/20151212160906/https://blogs.oracle.com/jag/entry/nfs_on_snow_leopard NFS on Snow Leopard] |
||
+ | * http://chschneider.eu/linux/server/nfs.shtml |
||
+ | * [https://www.slashroot.in/how-do-linux-nfs-performance-tuning-and-optimization How to do Linux NFS Performance Tuning and Optimization] |
||
+ | * [https://www.cyberciti.biz/faq/linux-unix-tuning-nfs-server-client-performance/ Linux: Tune NFS Performance] |
||
+ | * [https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/storage_administration_guide/nfs-serverconfig#nfs4-only Configuring an NFSv4-only Server] |
||
+ | |||
+ | {{TranslationStatus|NFS|2024-04-19|805216}} |
2024年4月19日 (金) 19:55時点における最新版
関連記事
Wikipedia より:
- Network File System (NFS) はローカルストレージにアクセスするのと同じようにネットワーク上のファイルにクライアントコンピュータでアクセスできるようにする分散ファイルシステムおよびそのプロトコルである。1984年に Sun Microsystems によって開発された。
インストール
クライアントとサーバーどちらでも必要なのは nfs-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 から、仮想ルートが実装されています)。
下の例では以下の設定を使用します:
- 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) /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
としてマウント可能になります - ルートプレフィックスは省略されることに注意してください。
サーバー実行中に /etc/exports
を変更した場合は再度エクスポートしないと変更が適用されないので注意してください:
# exportfs -rav
現在ロードされているエクスポートの状態をより詳細に見るには、以下を使用する:
# exportfs -v
利用可能なオプションについて詳しくは exports(5) を参照してください。
サーバーを起動する
- NFSv3 および NFSv4 サービスを提供するには、
nfs-server.service
を開始して有効化します。 - NFSv4 サービスのみを提供するには、
nfsv4-server.service
を開始して有効化します。
プロトコルバージョン 4 のエクスポートを使用するユーザーは、不要なサービスが実行されないように、最低限 rpcbind.service
と rpcbind.socket
をマスクすることを望むでしょう。詳細は FS#76453 を参照してください。また、何らかの理由で引き込まれた nfs-server.service
もマスクすることを検討してください。
特定のインターフェイスあるいは 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.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 の 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
クライアント設定
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
/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
の設定を再読み込みしてください。
systemd ユニットとして
/etc/systemd/system
内に新しい .mount
ファイルを作成します。例:mnt-home.mount
。詳細は systemd.mount(5) を参照してください。
What=
共有へのパス
Where=
共有をマウントするパス
Options=
共有のマウントオプション
/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
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
を有効化/開始して、マウントパスにアクセスされた際に共有を自動マウントします。
autofs を使う
複数のマシンを NFS で接続したい場合は autofs を使うのが便利です。サーバーだけでなくクライアントにもなることができます。他の簡単な方法よりもこの方法が推奨される理由は、サーバーの電源が落とされた時に、クライアントがNFS 共有を見つけられないことについてエラーを投げないからです。詳しくは autofs#NFS ネットワークマウント を見て下さい。
ヒントとテクニック
パフォーマンスチューニング
クライアントの数が多いネットワークで NFS を使用する場合、デフォルトの NFS スレッド数を「8」から「16」やそれ以上に増やすことができます。これはサーバー/ネットワークの要件に応じて変わります:
/etc/nfs.conf
[nfsd] threads=16
NFS の性能を完全に発揮するには、ネットワーク設定にあわせて rsize
や wsize
マウントオプションを調整する必要があります。
最近の Linux カーネル (2.6.18 以上) ではメモリの容量によって NFS サーバーが使用できる I/O のサイズ (最大ブロックサイズ) が変わります。最大は 1M (1048576バイト) で、NFS クライアントがより大きな rsize
や wsize
を必要としている場合でもサーバーの最大ブロックサイズが使われます [1]。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
To mount with the increased rsize
and wsize
mount options:
rsize
と wsize
を増やしたマウントオプションでマウントするには:
# mount -t nfs -o rsize=32768,wsize=32768,vers=4 servername:/srv/nfs/music /mountpoint/on/client
さらに、NFS プロトコルに違反するにもかかわらず、sync
や sync,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)
自動マウントの処理
ローカルのワイヤレスネットワークから 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.certificate
と x509.private_key
に自分の値を使用してこれらのファイルを利用します。
/etc/tlshd.conf
[authenticate.server] x509.certificate= /etc/nfsd-certificate.pem x509.private_key= /etc/nfsd-private-key.pem
そして、tlshd.service
を開始して有効化します。
クライアント
前の手順で生成したサーバーの TLS 証明書をシステムの信頼ストアに追加します(詳細は トランスポート層セキュリティ を参照)。
これで、サーバーの 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/トラブルシューティングを参照してください。