2010-08-04 13 views
9

Cuando estaba en el núcleo de Linux 2.6 y en NFSv3 ¿se volvió válido el open("fname", O_CREAT|O_EXCL)? La documentación canónica llamada open(2) sistema actual (http://www.kernel.org/doc/man-pages/online/pages/man2/open.2.html) dice que todo está bien:abierto O_CREAT | O_EXCL en NFS en 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 ... 

Esto lee como si todos los núcleos 2.6 están bien, pero la página del manual changelog (ca tardío de grano 2.6.23) comienza validez que indica cuatro años después de la versión 2.6.0, y la web está plagada de usuarios de tableros que censuran este uso en el último año o dos. Me gustaría utilizar esta configuración en los sistemas RHEL 5 (2.6.18), pero no pude precisar cuándo realmente se volvió segura. ¿Alguien tiene una respuesta definitiva?

+0

¿Existe una cuestión de programación en alguna parte? – Gabe

+0

Lo intenté tanto en la primera oración. En la medida en que la gente puede hacer preguntas sobre cosas como 'std :: fstream :: fstream (char const *, ios_base :: openmode)' en la biblioteca estándar de C++, esperaba que la biblioteca estándar de C fuera un juego abierto, incluso con respecto a no-POSIX opciones. – Jeff

+0

El texto adjunto se ha reducido sustancialmente para ayudar a la claridad si esa era la preocupación original. – Jeff

Respuesta

7

Al parecer, los chicos NFS afirman que nada de NFSv3 y Linux 2.6.5 en está bien.

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

  • D10. Estoy tratando de usar bloqueos flock()/BSD para bloquear archivos usados ​​en varios clientes, pero los archivos se corrompen. ¿Cómo?
    • A. flock()/Los bloqueos BSD actúan solo localmente en clientes Linux NFS anteriores a 2.6.12. Use los bloqueos fcntl()/POSIX para asegurarse de que los bloqueos de archivos sean visibles para otros clientes.
    • Aquí hay algunas formas de serializar el acceso a un archivo NFS.
      • Usar la fcntl()/POSIX API de bloqueo. Este tipo de bloqueo proporciona un bloqueo de rango de bytes en varios clientes a través del protocolo NLM, o mediante NFSv4.
      • Utilice un archivo de bloqueo por separado y cree enlaces duros a él. Consulte la descripción en la sección O_EXCL de la página man de creat (2).
    • Vale la pena señalar que hasta los kernels de la versión 2.6, las creaciones de O_EXCL no eran atómicas en los clientes Linux NFS. No utilice O_EXCL crea y espera un comportamiento atómico entre múltiples clientes NFS a menos que esté ejecutando un kernel más nuevo que 2.6.5.
    • ...
Cuestiones relacionadas