私のLinuxサーバーでは、/ etc/exportsに次のオプションがあります。
/home *(rw,sync,no_subtree_check,no_root_squash)
そして、私はMacからマウントして
mount -t nfs -o resvport,rw,noatime,soft,intr,rsize=32768,wsize=32768,timeo=900,retrans=3,proto=tcp,vers=3,async 192.168.1.121:/home /Volumes/home
ご覧のとおり、サーバーはsync
を指定していますが、私のマウントオプションはasync
を使用しているので、どちらを使用しますか?
sync
とasync
は、2つの異なる状況で異なる意味を持ちます。
クライアントコンテキストでsync
を使用すると、ファイルへのすべての書き込みがサーバーにコミットされます。 async
を指定すると、ファイルへのすべての書き込みnotがすぐにサーバーに送信されます。通常は、ファイルが閉じている場合のみです。そのため、同じファイルを開いている別のホストは、最初のホストによって行われた変更を認識しません。
NFSは「オープンに近い」一貫性を提供することに注意してください。つまり、他のクライアントは不可能ですとにかく他のユーザーが開いているファイルのデータは一貫している(または率直に言って、nfslock
を使用しない場合はまったく一貫している)クライアント間の何らかの同期を追加します)。
サーバーコンテキスト(デフォルト)でsync
を使用すると、サーバーは、ストレージバックエンドが実際にデータを通知したときに、データが書き込まれたことを伝えるためだけに応答しますあった書き込まれました。サーバーコンテキストのasync
は、ファイルが実際に書き込まれたかどうかに関係なく、サーバーにファイルが書き込まれたかのようにサーバーに応答させます。これはかなり高速ですが、データのコミットに問題がある可能性があるため、非常に危険です!
ほとんどの場合、クライアント側ではasync
、サーバー側ではsync
です。これにより、NFSの動作方法に関してかなり一貫した動作が提供されます。
基本的にMIfeの発言。これらのオプションは状況依存です。重要な部分はマンページにあります:
_exports(5)
async This option allows the NFS server to violate the NFS protocol and reply to
requests before any changes made by that request have been committed to
stable storage (e.g. disc drive).
_
(Mac)クライアント:
_mount_nfs(8)
async Assume that unstable write requests have actually been committed to stable
storage on the server, and thus will not require resending in the event
that the server crashes.
_
注:Macでは、mount_nfs(8)
は、nfs.conf(5)
の_nfs.client.allow_async
_オプションも有効になっている場合にのみ、async
オプションが受け入れられると述べています(また、 sysctl(8)
)を介して設定
したがって、クライアントでasync
を要求でき、書き込み要求は、それらがサーバーに到達したと想定します。サーバーでsync
を指定したため、データが実際にディスクに書き込まれたときに、クライアントからの要求を満たします。 (もちろん、サーバー上のローカルファイルシステムは、「sync」を使用してマウントすることもできますが、「async」がデフォルトのようです)
クライアントのマウントオプションに関するWord:* rsize&wsizeは、デフォルトでTCPマウント用に32768に設定されています。* proto = tcpがデフォルトで、サポートされていない場合はudpにフォールバックしますサーバー* vers = 3がデフォルトで、サーバーがサポートしていない場合は2にフォールバックします