Situación clásica: corrí un rm
error y me di cuenta inmediatamente después de que había eliminado los archivos incorrectos. (Nada crítico y tenía copias de seguridad tolerablemente recientes, pero aún molesto).
Sabiendo que una mayor actividad del disco era mi enemigo si quería recuperar los archivos con extundelete
o tales herramientas, inmediatamente apagué la máquina físicamente (es decir, con el botón de encendido, no con halt
ninguno de estos comandos). Esta era una computadora portátil sin tareas importantes en ejecución ni nada abierto, por lo que era una operación aceptable. (Por cierto, aprendí desde entonces que lo primero que debería hacer en tal situación sería estimar primero si los archivos faltantes aún pueden abrirse mediante un proceso https://unix.stackexchange.com/a/101247 - si es así, debe recuperarlos de esta manera en lugar de apagar la máquina).
Aún así, una vez que la máquina se apagó, pensé por un momento y decidí que los archivos no valían la inversión de tiempo para arrancar un sistema en vivo para un análisis forense adecuado. Entonces volví a encender la máquina. Y luego descubrí que mis archivos todavía estaban en el disco: rm
no se habían propagado al disco antes de que me apagara. Bailé un poco y agradecí al dios de los administradores de sistemas por su inesperado perdón.
Mi pregunta ahora es entender cómo esto fue posible y cuál es la demora típica antes de que una rm
se propague realmente al disco. Sé que el disco IO no se enjuaga de inmediato, pero que se queda en la memoria durante algún tiempo, pero pensé que el diario del disco se aseguraría rápidamente de que las operaciones pendientes no se pierdan por completo. https://unix.stackexchange.com/a/78766 parece insinuar un mecanismo separado para enjuagar páginas sucias y enjuagar las operaciones del diario, pero no proporciona detalles suficientes sobre cómo estaría involucrado el diario durante un rm
, y el retraso esperado antes las operaciones se sonrojan.
Algunos detalles más: los datos estaban en una partición ext4 dentro de un volumen LUKS, y al reiniciar la máquina vi lo siguiente en syslog
:
Sep 24 10:24:58 gamma kernel: [ 11.457007] EXT4-fs (dm-0): 1 orphan inode deleted
Sep 24 10:24:58 gamma kernel: [ 11.458393] EXT4-fs (dm-0): recovery complete
Sep 24 10:24:58 gamma kernel: [ 11.482475] EXT4-fs (dm-0): mounted filesystem with ordered data mode. Opts: (null)
pero no estoy seguro de que esté relacionado con el rm
.
Otra pregunta sería si hay una manera de decirle al núcleo que no realice ninguna de las operaciones de disco pendientes (sino, digamos, volcarlas en algún lugar), en lugar de apagar la máquina. (Por supuesto, parece peligroso no realizar las operaciones pendientes, pero esto es lo que sucedería al apagar la máquina de todos modos, y en algunos casos podría salvarlo). Esto sería "más limpio", por supuesto, y también interesante por ejemplo, servidores remotos donde el apagado físico no es una opción fácil.
rm
se escriba? En otras palabras, ¿las cosas se comprometen con el diario solo cuando una escritura está a punto de realizarse? ¿O es la imagen más compleja que eso? En cuanto a alt-sysrq-u, esta es una idea bastante clara. ¿Tiene una referencia que dar para el reclamo "Parece"? (Parece que no se sigue de los enlaces que usted dio). ¡Gracias! :)echo u > /proc/sysrq-trigger
(es posible que deba activarlo primero).De: https://www.kernel.org/doc/Documentation/filesystems/ext4.txt
Vea también aquí cómo vaciarlos : ¿Cómo vaciar las memorias intermedias y la memoria caché en un sistema Linux?
Citado del enlace de arriba:
fuente
commit=nrsec
, ¿es algo que ocurriría después de que el núcleo haya decidido eliminar los cambios de la memoria al disco? ¿O la configuracióncommit=1
garantiza que todos los cambios se eliminarán después de 1 segundo, independientemente de la configuracióndirty_expire_centisecs
ydirty_writeback_centisecs
?commit=1
. Según tengo entendido,sync
obliga a que todo suceda independientemente de la configuración de la memoria virtual, aunque puede suceder antes.