Próbuję użyć blokad flock () / BSD, aby zablokować pliki używane na wielu klientach, ale pliki ulegają uszkodzeniu. Dlaczego? A. Blokady flock () / BSD działają tylko lokalnie na klientach Linux NFS przed wersją 2.6.12. Użyj blokad fcntl () / POSIX, aby upewnić się, że blokady plików są widoczne dla innych klientów.
Oto kilka sposobów serializacji dostępu do pliku NFS.
Użyj interfejsu API blokującego fcntl () / POSIX. Ten rodzaj blokowania zapewnia blokowanie zakresu bajtów na wielu klientach za pośrednictwem protokołu NLM lub NFSv4. Użyj osobnego pliku blokady i utwórz do niego twarde linki. Zobacz opis w sekcji O_EXCL strony podręcznika kreacji (2). Warto zauważyć, że do wczesnych jąder 2.6 tworzenie O_EXCL nie było atomowe na klientach Linux NFS. Nie używaj O_EXCL tworzy i oczekuje zachowania atomowego wśród wielu klientów NFS, chyba że używasz jądra nowszego niż 2.6.5.
Jest to znany problem polegający na tym, że Perl domyślnie używa blokowania flock () / BSD. Może to uszkodzić programy przeniesione z innych systemów operacyjnych, takich jak Solaris, które oczekują, że blokady flock / BSD będą działać jak blokady POSIX.
W systemie Linux stosowanie blokowania plików zamiast twardego łącza ma dodatkową zaletę polegającą na sprawdzaniu pamięci podręcznej klienta na serwerze. Po uzyskaniu blokady pliku klient opróżni pamięć podręczną strony dla tego pliku, aby wszelkie kolejne odczyty otrzymywały nowe dane z serwera. Po zwolnieniu blokady pliku wszelkie zmiany pliku na tym kliencie są usuwane z powrotem na serwer przed zwolnieniem blokady, aby inni klienci oczekujący na zablokowanie tego pliku mogli zobaczyć zmiany.
Klient NFS w wersji 2.6.12 zapewnia obsługę blokad flock () / BSD w plikach NFS poprzez emulowanie blokad typu BSD pod względem blokowania zakresu bajtów POSIX. Inni klienci NFS, którzy używają tego samego mechanizmu emulacji lub używają blokad fcntl () / POSIX, zobaczą te same blokady, które widzi klient NFS w systemie Linux.
W lokalnych systemach plików Linux blokady POSIX i BSD są niewidoczne dla siebie. Zatem dzięki tej emulacji aplikacje działające na serwerze NFS z systemem Linux nadal będą widzieć pliki zablokowane przez klientów NFS jako zablokowane za pomocą blokady fcntl () / POSIX, niezależnie od tego, czy aplikacja na kliencie używa stylu BSD, czy POSIX blokada stylu. Jeśli aplikacja serwera używa blokad BSD flock (), nie zobaczy blokad używanych przez klientów NFS.