На моем сервере 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
имеют разное значение для двух разных ситуаций.
sync
в контексте клиента все записи в файл передаются на сервер. async
вызывает все записи в файл в не передаваться на сервер немедленно, обычно только после закрытия файла. Таким образом, другой хост, открывающий тот же файл, не увидит изменений, внесенных первым хостом.
Обратите внимание, что NFS предлагает согласованность "близко к открытию", что означает, что другие клиенты не могут тем не мение предполагать, что данные в файле, открытом другими, согласованы (или, откровенно говоря, согласованы вообще, если вы не используете nfslock
чтобы добавить некоторую форму синхронизации между клиентами).
sync
в контексте сервера (по умолчанию) заставляет сервер отвечать только о том, что данные были записаны, когда серверная часть хранилища фактически сообщает ему данные был написано. async
в контексте сервера заставляет сервер просто отвечать, как если бы файл был записан на сервере, независимо от того, действительно ли он его записал. Это намного быстрее, но также очень опасно, поскольку при фиксации данных могут возникнуть проблемы!
В большинстве случаев, async
на стороне клиента и sync
на стороне сервера. Это предлагает довольно последовательное поведение в отношении того, как должен работать NFS.
В основном то, что сказал Майфе; эти параметры зависят от контекста. Важная часть находится на страницах руководства:
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)
заявляет, что async
вариант будет учитываться, только если nfs.client.allow_async
вариант в nfs.conf(5)
также включен (также может быть установлен через sysctl(8)
)
Итак, вы можете запросить async
на клиенте и запросы на запись будут предполагать, что они достигли другого сервера. Поскольку вы указали sync
на сервере он будет выполнять запросы от клиента, когда данные будут фактически записаны на диск. (Конечно, ваши локальные файловые системы на сервере также могут быть смонтированы с помощью "синхронизации", хотя по умолчанию используется "асинхронный")
Несколько слов о параметрах монтирования на клиенте: * rsize и wsize по умолчанию установлены на 32768 для монтирования TCP. * proto = tcp - по умолчанию, вернется к udp, если не поддерживается сервером * vers = 3 - по умолчанию, вернется к 2, если не поддерживается сервером