Я намагаюся використовувати блоки flock () / BSD для блокування файлів, які використовуються для декількох клієнтів, але файли пошкоджуються. Як це? A. блоки flock () / BSD діють лише локально на клієнтах Linux NFS до 2.6.12. Використовуйте блоки fcntl () / POSIX, щоб переконатися, що блокування файлів видимі інші клієнти.
Ось кілька способів серіалізації доступу до файлу NFS.
Використовуйте API блокування fcntl () / POSIX. Цей тип блокування забезпечує блокування байтового діапазону для декількох клієнтів через протокол NLM або через NFSv4. Використовуйте окремий файл блокування та створіть жорсткі посилання на нього. Ознайомтесь з описом у розділі O_EXCL сторінки man create (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-блоки не помітні один одному. Таким чином, завдяки цій емуляції програми, запущені на сервері Linux NFS, як і раніше, побачать файли, заблоковані клієнтами NFS, як заблоковані блокуванням fcntl () / POSIX, незалежно від того, чи програма на клієнті використовує BSD-стиль чи POSIX- замок стилю. Якщо серверне додаток використовує блоки BSD flock (), воно не побачить блокування, якими користуються клієнти NFS.