Estoy tratando de usar los bloqueos flock () / BSD para bloquear archivos utilizados en múltiples clientes, pero los archivos se corrompen. ¿Cómo? A. Los bloqueos flock () / BSD actúan solo localmente en clientes NFS de Linux anteriores a 2.6.12. Utilice los bloqueos fcntl () / POSIX para garantizar que los bloqueos de archivos sean visibles para otros clientes.
Aquí hay algunas formas de serializar el acceso a un archivo NFS.
Utilice la API de bloqueo fcntl () / POSIX. Este tipo de bloqueo proporciona un bloqueo de rango de bytes a través de múltiples clientes a través del protocolo NLM o NFSv4. Use un archivo de bloqueo separado y cree enlaces duros a él. Consulte la descripción en la sección O_EXCL de la página del comando man creat (2). Vale la pena señalar que hasta principios de 2.6 núcleos, las creaciones de O_EXCL no eran atómicas en los clientes NFS de Linux. No use O_EXCL crea y espera un comportamiento atómico entre múltiples clientes NFS a menos que esté ejecutando un núcleo más nuevo que 2.6.5.
Es un problema conocido que Perl usa el bloqueo flock () / BSD por defecto. Esto puede interrumpir los programas portados desde otros sistemas operativos, como Solaris, que esperan que los bloqueos flock / BSD funcionen como los bloqueos POSIX.
En Linux, el uso del bloqueo de archivos en lugar de un enlace duro tiene el beneficio adicional de señalar el caché del cliente con el servidor. Cuando se adquiere un bloqueo de archivo, el cliente vaciará la memoria caché de la página para ese archivo para que cualquier lectura posterior obtenga nuevos datos del servidor. Cuando se libera un bloqueo de archivo, cualquier cambio en el archivo en ese cliente se devuelve al servidor antes de que se libere el bloqueo para que otros clientes que esperan bloquear ese archivo puedan ver los cambios.
El cliente NFS en 2.6.12 proporciona soporte para bloqueos flock () / BSD en archivos NFS emulando los bloqueos de estilo BSD en términos de bloqueos de rango de bytes POSIX. Otros clientes NFS que usan el mismo mecanismo de emulación, o que usan bloqueos fcntl () / POSIX, verán los mismos bloqueos que ve el cliente NFS de Linux.
En los sistemas de archivos locales de Linux, los bloqueos POSIX y los bloqueos BSD son invisibles entre sí. Por lo tanto, debido a esta emulación, las aplicaciones que se ejecutan en un servidor NFS de Linux aún verán los archivos bloqueados por los clientes NFS como bloqueados con un bloqueo fcntl () / POSIX, ya sea que la aplicación en el cliente esté usando un estilo BSD o POSIX- cerradura de estilo. Si la aplicación del servidor usa bloqueos BSD flock (), no verá los bloqueos que usan los clientes NFS.