2010-08-04 19 views
9

Quando nel kernel Linux 2.6 e in NFSv3 è diventato valido open("fname", O_CREAT|O_EXCL)? L'attuale documentazione canonica chiamata di sistema open(2) (http://www.kernel.org/doc/man-pages/online/pages/man2/open.2.html) dice che è tutto a posto:open O_CREAT | O_EXCL su NFS in Linux?

- 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 ... 

Questa legge come se tutti i kernel 2.6 sono OK, ma la pagina man changelog (ca fine del kernel 2.6.23) ha inizio validità indicando quattro anni dopo 2.6.0 sono stati pubblicati e il Web è pieno di utenti che censurano questo utilizzo negli ultimi due anni. Mi piacerebbe usare questa configurazione sui sistemi RHEL 5 (2.6.18), ma non sono riuscito a stabilire quando è diventato veramente sicuro. Qualcuno ha una risposta definitiva?

+0

C'è una questione di programmazione da qualche parte? – Gabe

+0

L'avevo inteso tanto nella prima frase. Poiché la gente può fare domande su cose come 'std :: fstream :: fstream (char const *, ios_base :: openmode)' nella libreria standard C++, speravo che la libreria standard C fosse aperta, anche per quanto riguarda i non POSIX opzioni. – Jeff

+0

Il testo di accompagnamento è stato sostanzialmente ridotto per maggiore chiarezza se si trattava della preoccupazione iniziale. – Jeff

risposta

7

A quanto pare, i ragazzi NFS sostengono che qualsiasi cosa, da NFSv3 e Linux 2.6.5 su è OK.

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

  • D10. Sto cercando di usare i lock flock()/BSD per bloccare i file usati su più client, ma i file sono corrotti. Come mai?
    • A. I blocchi flock()/BSD funzionano solo localmente su client Linux NFS precedenti alla 2.6.12. Utilizzare i blocchi Fcntl()/POSIX per assicurarsi che i blocchi dei file siano visibili ad altri client.
    • Ecco alcuni modi per serializzare l'accesso a un file NFS.
      • Utilizzare l'API di blocco fcntl()/POSIX. Questo tipo di blocco consente il blocco dell'intervallo di byte su più client tramite il protocollo NLM o tramite NFSv4.
      • Utilizzare un file di blocco separato e creare collegamenti rigidi su di esso. Vedi la descrizione nella sezione O_EXCL della pagina man di creat (2).
    • Vale la pena notare che fino all'inizio del kernel 2.6, O_EXCL non era atomico sui client NFS di Linux. Non utilizzare O_EXCL per creare e prevedere un comportamento atomico tra più client NFS a meno che non si stia utilizzando un kernel più recente di 2.6.5.
    • ...