Я пытаюсь использовать блокировки flock () / BSD для блокировки файлов, используемых на нескольких клиентах, но файлы становятся поврежденными. Как придешь? A. flock () / BSD блокировки действуют только локально на клиентах Linux NFS до 2.6.12. Используйте блокировки fcntl () / POSIX, чтобы гарантировать, что блокировки файлов видны другим клиентам.
Вот несколько способов сериализации доступа к файлу NFS.
Используйте API блокировки fcntl () / POSIX. Этот тип блокировки обеспечивает блокировку диапазона байтов для нескольких клиентов по протоколу NLM или через NFSv4. Используйте отдельный файл блокировки и создайте жесткие ссылки на него. См. Описание в разделе O_EXCL справочной страницы creat (2). Стоит отметить, что до ранних версий 2.6 ядра, создаваемые O_EXCL, не были атомарными на клиентах Linux NFS. Не используйте O_EXCL создает и ожидает атомарного поведения среди нескольких клиентов NFS, если вы не используете ядро новее, чем 2.6.5.
Известно, что Perl по умолчанию использует блокировку flock () / BSD. Это может сломать программы, перенесенные из других операционных систем, таких как Solaris, которые ожидают, что блокировки flock / BSD будут работать как блокировки POSIX.
В Linux использование блокировки файлов вместо жесткой ссылки дает дополнительное преимущество, заключающееся в наведении контрольной точки клиентского кэша на сервер. Когда блокировка файла получена, клиент очистит кэш страницы для этого файла, чтобы при любых последующих чтениях были получены новые данные с сервера. Когда блокировка файла снята, любые изменения в файле на этом клиенте передаются обратно на сервер до снятия блокировки, чтобы другие клиенты, ожидающие блокировки этого файла, могли видеть изменения.
Клиент NFS в 2.6.12 обеспечивает поддержку блокировок flock () / BSD для файлов NFS, эмулируя блокировки в стиле BSD в терминах блокировок диапазона байтов POSIX. Другие клиенты NFS, использующие тот же механизм эмуляции или использующие блокировки fcntl () / POSIX, увидят те же блокировки, что и клиент Linux NFS.
В локальных файловых системах Linux блокировки POSIX и BSD невидимы друг для друга. Таким образом, из-за этой эмуляции приложения, работающие на NFS-сервере Linux, по-прежнему будут видеть файлы, заблокированные клиентами NFS, заблокированными с помощью блокировки fcntl () / POSIX, независимо от того, использует ли приложение на клиенте BSD-стиль или POSIX- замок стиля. Если серверное приложение использует блокировки flock () BSD, оно не увидит блокировки, используемые клиентами NFS.