1. Almacenamiento basado en flash
¿Depende del tipo de disco (discos duros tradicionales versus discos de estado sólido) o de cualquier otra variable que no conozca? ¿Sucede (si sucede) solo en Linux o está presente en otros sistemas operativos?
Cuando tenga una opción, no debe permitir que el almacenamiento basado en flash pierda energía sin un apagado limpio.
En el almacenamiento de bajo costo como las tarjetas SD, puede esperar perder bloques de borrado completos (varias veces más grandes que 4KB), perdiendo datos que podrían pertenecer a diferentes archivos o estructuras esenciales del sistema de archivos.
Algunos SSD caros pueden afirmar que ofrecen mejores garantías ante fallas de energía. Sin embargo, las pruebas de terceros sugieren que muchos SSD caros no lo hacen. La capa que reasigna bloques para "nivelación de desgaste" es compleja y patentada. Las posibles fallas incluyen la pérdida de todos los datos en el disco.
Aplicando nuestro marco de prueba, probamos 17 unidades de estado sólido de seis proveedores diferentes utilizando más de tres mil ciclos de inyección de fallas en total. Nuestros resultados experimentales revelan que 14 de los 17 dispositivos SSD probados exhiben comportamientos de fallas sorprendentes bajo fallas de alimentación, incluyendo corrupción de bits, escrituras cortadas, escrituras no serializables, corrupción de metadatos y falla total del dispositivo.
2017: https://dl.acm.org/citation.cfm?id=2992782&preflayout=flat
2013: https://www.usenix.org/system/files/conference/fast13/fast13-final80.pdf?wptouch_preview_theme=enabled
2. Girar unidades de disco duro
Los discos duros giratorios tienen diferentes características. Por seguridad y simplicidad, recomiendo asumir que tienen la misma incertidumbre práctica que el almacenamiento basado en flash.
A menos que tenga evidencia específica, que claramente no tiene. No tengo cifras comparativas para girar discos duros.
Una unidad de disco duro puede dejar un sector escrito de forma incompleta con una suma de comprobación incorrecta, lo que nos dará un buen error de lectura más adelante. En términos generales, este modo de falla de los discos duros es completamente esperado; Los sistemas de archivos nativos de Linux están diseñados pensando en ello. Su objetivo es preservar el contrato fsync()
frente a este tipo de falla por pérdida de potencia. (Realmente nos gustaría ver esto garantizado en SSD).
Sin embargo, no estoy seguro de si los sistemas de archivos de Linux logran esto en todos los casos, o si eso es posible.
El próximo arranque después de este tipo de falla puede requerir una reparación del sistema de archivos. Siendo Linux, es posible que la reparación del sistema de archivos haga algunas preguntas que no comprenda, en las que solo puede presionar Y y esperar que se resuelva por sí solo.
2.1 Si no sabe cuál es el contrato fsync ()
El contrato fsync () es una fuente de buenas y malas noticias. Debes entender las buenas noticias primero.
Buenas noticias: fsync()
está bien documentado como la forma correcta de escribir datos de archivo, por ejemplo, cuando presiona "guardar". Y es ampliamente entendido que, por ejemplo, los editores de texto deben reemplazar los archivos existentes usando atómicamente rename()
. Esto está destinado a garantizar que siempre mantenga el archivo antiguo u obtenga el nuevo archivo (que se fsync()
editó antes del cambio de nombre). No desea quedarse con una versión medio escrita del nuevo archivo.
Malas noticias: durante muchos años, llamar a fsync () en el sistema de archivos Linux más popular podría dejar todo el sistema colgado durante decenas de segundos. Dado que las aplicaciones no pueden hacer nada al respecto, era muy común utilizar optimistamente rename () sin fsync (), que parecía ser relativamente confiable en este sistema de archivos.
Por lo tanto, existen aplicaciones que no usan fsync () correctamente.
La próxima versión de este sistema de archivos generalmente evitó el bloqueo de fsync (), al mismo tiempo que comenzó a confiar en el uso correcto de fsync ().
Todo esto es bastante malo. Probablemente, el tono despectivo y la inventiva que utilizaron muchos de los desarrolladores de kernel en conflicto no ayudaron a comprender esta historia.
La resolución actual es que el sistema de archivos Linux más popular actual el valor predeterminado es admitir el patrón rename () sin requerir fsync ()implementa "compatibilidad error por error" con la versión anterior. Esto se puede deshabilitar con la opción de montaje noauto_da_alloc
.
Esta no es una protección completa. Básicamente, vacía el IO pendiente en el momento rename (), pero no espera a que se complete el IO antes de cambiar el nombre. ¡Esto es mucho mejor que, por ejemplo, una ventana de peligro de 60 segundos! Consulte también la respuesta a ¿Qué sistemas de archivos requieren fsync () para evitar accidentes al reemplazar un archivo existente con rename ()?
Algunos sistemas de archivos menos populares no brindan protección. XFS se niega a hacerlo. Y UBIFS tampoco lo ha implementado, aparentemente podría aceptarse pero necesita mucho trabajo para hacerlo posible. La misma página señala que UBIFS tiene varios otros problemas "TODO" para la integridad de los datos, incluida la pérdida de energía. UBIFS es un sistema de archivos utilizado directamente en el almacenamiento flash. Me imagino que algunas de las dificultades que menciona UBIFS con el almacenamiento flash podrían ser relevantes para los errores de SSD.