¿Cómo puedo verificar si mves atómico en mi fs (ext4)?
El sistema operativo es Red Hat Enterprise Linux Server versión 6.8.
En general, ¿cómo puedo verificar esto? Miré a mi alrededor y no encontré si mi sistema operativo es POSIX estándar.
¿Cómo puedo verificar si mves atómico en mi fs (ext4)?
El sistema operativo es Red Hat Enterprise Linux Server versión 6.8.
En general, ¿cómo puedo verificar esto? Miré a mi alrededor y no encontré si mi sistema operativo es POSIX estándar.
Respuestas:
Curiosamente, parece que la respuesta puede ser "depende".
Para que quede claro, mvse especifica a
La
mvutilidad realizará acciones equivalentes a larename()función
La especificación de la función renombrar establece:
Esta
rename()función es equivalente para archivos normales a la definida por el estándar ISO C. Su inclusión aquí amplía esa definición para incluir acciones en directorios y especifica el comportamiento cuando el nuevo parámetro nombra un archivo que ya existe. Esa especificación requiere que la acción de la función sea atómica.
Pero la última especificación ISO C para rename()estados:
7.21.4.2 La
renamefunciónSinopsis
#include <stdio.h> int rename(const char *old, const char *new);Descripción
La
renamefunción hace que el archivo cuyo nombre es la cadena señalada poroldsea conocido en adelante por el nombre dado por la cadena señalada pornew. El nombre del archivooldya no es accesible con ese nombre. Si un archivo nombrado por la cadena a la que apuntanewexiste antes de la llamada a larenamefunción, el comportamiento está definido por la implementación.Devoluciones
La
renamefunción devuelve cero si la operación tiene éxito, no cero si falla, en cuyo caso si el archivo existía anteriormente, todavía se conoce por su nombre original.
Sorprendentemente, tenga en cuenta que no hay un requisito explícito para la atomicidad. Es posible que se requiera en otro lugar en el último estándar C disponible públicamente, pero no he podido encontrarlo. Si alguien puede encontrar ese requisito, las ediciones y los comentarios son más que bienvenidos.
Ver también ¿Es rename () atomic?
Según la página de manual de Linux :
Si
newpathya existe, será reemplazado atómicamente, de modo que no haya ningún punto en el que otro proceso que intente accedernewpathlo encuentre perdido. Sin embargo, probablemente habrá una ventana en la que ambosoldpathy senewpathrefieren al archivo que se renombra.
La página de manual de Linux afirma que el reemplazo del archivo será atómico.
Sin embargo, probar y verificar que la atomicidad podría ser muy difícil, si es así de lejos debe llegar. No tiene claro qué quiere decir con su uso de "¿Cómo puedo verificar si mv es atómico"? ¿Desea requisitos / especificaciones / documentación que sea atómica, o necesita realmente probarlo ?
Tenga en cuenta también que lo anterior supone que los dos nombres de archivo de operando están en el mismo sistema de archivos. No puedo encontrar ninguna restricción estándar en la mvutilidad para hacer cumplir eso.
renameatomicidad.
/un ext4 fs y /tmpun ext4 fs diferente, entonces no puede moverse atómicamente de uno a otro.
mvse basa en la renamellamada al sistema y rename()es atómico. Podrías mirar la página del manual rename(2).
Podrías encontrar la respuesta en Is rename () atomic? en stackoverflow.
¿Qué tipo de fs usaste?
Además de verificar las llamadas al sistema y su atomicidad, quizás inotify-toolspueda servir como prueba, aunque no estoy seguro de si es una prueba garantizada de atomicidad.
Abrir 2 conchas. Mire el directorio de destino del movimiento en uno de ellos:
inotifywait -m target/
Mueva un archivo al directorio en el otro:
mv foobar target/
El inotifywaitdebería mostrar solo una línea:
target/ MOVED_TO foobar
Parece atómico en comparación con la respuesta a ls target/y touch target/a, que produce mensajes multilínea como:
# the response to ls target/
target/ OPEN,ISDIR
target/ ACCESS,ISDIR
target/ CLOSE_NOWRITE,CLOSE,ISDIR
PD
Creo que, al menos, muestra que la cooperación multiproceso asíncrona en archivos es segura con inotify(prácticamente atómica): en cualquier caso, respondería solo después de inotifydar la señal final después de la operación. Por ejemplo, una configuración de productor-consumidor se puede implementar de manera fácil y segura con inotify.
strace?