Primero, disipemos algunos mitos.
es atómico, por lo que no pueden ocurrir inconsistencias
Mover un archivo dentro del mismo sistema de archivos (es decir, la rename
) llamada al sistema es atómico con respecto al entorno del software. Atomicidad significa que cualquier proceso que busque el archivo lo verá en su ubicación anterior o en su nueva ubicación; ningún proceso podrá observar que el archivo tiene un recuento de enlaces diferente, o que el archivo está presente en el directorio de origen después de estar presente en el directorio de destino, o que el archivo está ausente del directorio de destino después de estar ausente en el origen directorio.
Sin embargo, si el sistema se bloquea debido a un error, un error de disco o una pérdida de energía, no hay garantía de que el sistema de archivos se quede en un estado coherente, y mucho menos de que el movimiento no se quede a medio hacer. Linux en general no ofrece una garantía de atomicidad con respecto a los eventos de hardware.
primero copia la entrada del directorio en el nuevo directorio y luego borra la entrada en el directorio anterior, por lo que puede tener la inconsistencia de tener un archivo referenciado dos veces, pero el recuento de referencias es 1
Esto se refiere a una técnica de implementación específica. Hay otros.
Sucede que ext2 en Linux (a partir del kernel 3.16) utiliza esta técnica en particular. Sin embargo, esto no implica que el contenido del disco pase por la secuencia [ubicación anterior] → [ambas ubicaciones] → [nueva ubicación], porque las dos operaciones (agregar nueva entrada, eliminar entrada anterior) tampoco son atómicas a nivel de hardware : es posible que uno de ellos se interrumpa, dejando el sistema de archivos en un estado inconsistente. (Esperemos que fsck lo repare). Además, la capa de bloques puede reordenar las escrituras, por lo que la primera mitad podría comprometerse en el disco justo antes del bloqueo y la segunda mitad no se habría realizado.
Nunca se observará que el recuento de referencia sea diferente de 1 siempre que el sistema no se bloquee (ver arriba), pero esa garantía no se extiende a un bloqueo del sistema.
primero borra el puntero y luego copia el puntero, por lo que la inconsistencia es que el archivo tiene referencia 0
Una vez más, esto se refiere a una técnica de implementación particular. No se puede observar un archivo colgante si el sistema no falla, pero es una posible consecuencia de un bloqueo del sistema, al menos en algunas configuraciones.
Según una publicación de blog de Alexander Larsson , ext2 no garantiza la coherencia en un bloqueo del sistema, pero ext3 sí lo hace en el data=ordered
modo. (Tenga en cuenta que esta publicación de blog no trata sobre rename
sí misma, sino sobre la combinación de escribir en un archivo y llamar rename
a ese archivo).
Theodore Ts'o, el autor principal de los sistemas de archivos ext2, ext3 y ext4, escribió una publicación de blog sobre el mismo tema . Esta publicación de blog analiza la atomicidad (solo con respecto al entorno de software) y la durabilidad (que es la atomicidad con respecto a los bloqueos más una garantía de compromiso, es decir, saber que la operación se ha realizado). Lamentablemente, no puedo encontrar información sobre atomicidad con respecto a los accidentes solo. Sin embargo, las garantías de durabilidad otorgadas para ext4 requieren que rename
sea atómico. La documentación del núcleo de ext4 estados que ext4 con la auto_da_alloc
opción (que es el valor por defecto en los kernels modernos), así como ext4, ofrece una garantía de durabilidad para una write
seguida de unarename
, lo que implica que rename
es atómico con respecto a los bloqueos de hardware.
Para Btrfs, una rename
que sobrescribe un archivo existente se garantiza que sea atómica con respecto a los accidentes, pero una rename
que no sobrescribir un archivo puede resultar en ningún archivo o ambos archivos existentes.
En resumen, la respuesta a su pregunta es que no solo mover un archivo no es atómico con respecto a bloqueos en ext2, sino que ni siquiera se garantiza que deje el archivo en un estado consistente (aunque las fallas que fsck
no se pueden reparar son raras): prácticamente nada es, por eso se han inventado mejores sistemas de archivos. Ext3, ext4 y btrfs ofrecen garantías limitadas.
rename
es atómico, pero btrfs no lo hace de acuerdo con la wiki (ver mi respuesta). También es posible garantizar la atomicidad sin un diario (no conozco ejemplos en Linux, pero puede haber algunos). ¿Tiene información confiable sobre ext2?Esta pregunta se ha hecho de una manera ligeramente diferente en Super User. La página de Wikipedia sobre el
mv
comando también lo explica bastante bien:Linux tiene el cambio de nombre syscall y, por lo tanto, cambiará el nombre del archivo como una operación atómica, es decir, ininterrumpible. Entonces, no, el sistema de archivos no puede volverse inconsistente en la situación que usted describió.
fuente
rename
llamada al sistema no puede provocar que el sistema de archivos esté en un estado inconsistente, incluso si hay una falla de energía. Sentí que este era el núcleo de la pregunta de @ graphtheory92.