2010-08-04 8 views
9

Kiedy w jądrze Linuksa w wersji 2.6 i NFSv3 wprowadzono poprawkę open("fname", O_CREAT|O_EXCL)? Obecna dokumentacja kanoniczny wywołanie systemowe open(2) (http://www.kernel.org/doc/man-pages/online/pages/man2/open.2.html) mówi, wszystko jest w porządku:otwórz O_CREAT | O_EXCL na NFS w Linuksie?

- O_EXCL 
    - ... 
     On NFS, O_EXCL is only supported when using NFSv3 or later on kernel 
     2.6 or later. In NFS environments where O_EXCL support is not 
     provided, programs that rely on it for performing locking tasks will 
     contain a race condition. Portable programs that want to perform 
     atomic file locking using a lockfile, and need to avoid reliance on NFS 
     support for O_EXCL, can ... 

To brzmi tak, jakby wszystkie 2.6 jądra są OK, ale strona człowiek changelog (ca późno kernel 2.6.23) zaczyna wskazujący ważność cztery lata po uruchomieniu wersji 2.6.0, a w sieci jest mnóstwo użytkowników tablic, którzy cenzurują to użycie w ciągu ostatniego roku lub dwóch. Chciałbym skorzystać z tej konfiguracji w systemach RHEL 5 (2.6.18), ale nie mogłem ustalić, kiedy naprawdę stało się to bezpieczne. Czy ktoś ma ostateczną odpowiedź?

+0

Czy jest to kwestia programowania gdzieś tam? – Gabe

+0

Zamierzałem tak samo w pierwszym zdaniu. Ponieważ ludzie mogą zadawać pytania dotyczące rzeczy takich jak 'std :: fstream :: fstream (char const *, ios_base :: openmode)' w standardowej bibliotece C++, miałem nadzieję, że standardowa biblioteka C była otwartą grą, nawet jeśli chodzi o nie-POSIX opcje. – Jeff

+0

Towarzyszący tekst został znacznie skrócony, aby pomóc w zrozumieniu, jeśli był to pierwotny problem. – Jeff

Odpowiedz

7

Podobno faceci NFS twierdzą, że nic z NFSv3 i Linux 2.6.5 sprawie jest OK.

Od http://nfs.sourceforge.net/#faq_d10:

  • D10. Próbuję użyć blokad flock()/BSD do blokowania plików używanych na wielu klientach, ale pliki stają się uszkodzone. Dlaczego?
    • A. Blokady flock()/BSD działają tylko lokalnie na klientach Linux NFS przed 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 serializowania dostępu do pliku NFS.
      • Użyj funkcji API blokowania fcntl()/POSIX. Ten rodzaj blokowania zapewnia blokowanie bajtów na wielu klientach za pośrednictwem protokołu NLM lub przez NFSv4.
      • Użyj oddzielnego pliku blokującego i utwórz do niego twarde linki. Zobacz opis w sekcji O_EXCL strony podręcznika creat (2).
    • Warto zauważyć, że do wczesnych wersji 2.6, O_EXCL tworzy nie były atomowe na klientach Linux NFS. Nie używaj O_EXCL do tworzenia i oczekiwania zachowania atomowego wśród wielu klientów NFS, chyba że używasz jądra nowszego niż 2.6.5.
    • ...