Como sistema operativo multiusuario y multitarea, una vez que se eliminan los archivos en Linux, son difíciles de recuperar. Aunque el comando de eliminación solo marca el nodo del archivo para su eliminación y en realidad no borra el contenido del archivo, otros usuarios y algunos procesos que escriben en el disco sobrescribirán rápidamente los datos.
1. Una breve introducción a la estructura del sistema de archivos Ext2.
En el sistema de archivos Ext2 utilizado por Linux, los archivos se almacenan en bloques. De forma predeterminada, el tamaño de cada bloque es 1K y los diferentes bloques se distinguen por números de bloque. Cada archivo también tiene un nodo que contiene el propietario del archivo, los permisos de lectura y escritura, el tipo de archivo y otra información. Para un archivo de menos de 12 bloques, el número de bloque del bloque de datos del archivo se almacena directamente en el nodo. Si el archivo tiene más de 12 bloques, entonces el nodo almacena el número de bloque de un bloque indirecto después de 12 números de bloque. En el bloque correspondiente a este número de bloque indirecto, se almacenan los números de bloque de 256 bloques de datos de archivo (cada bloque en Ext2fs). El número ocupa 4 bytes, por lo que el número de bloque que se puede almacenar en un bloque es 1024/4 = 256). Si hay archivos más grandes, los bloques indirectos secundarios y ** bloques indirectos también aparecerán en el nodo.
2. Métodos para recuperar archivos borrados accidentalmente
La mayoría de las distribuciones de Linux proporcionan una herramienta debugfs que se puede utilizar para editar el sistema de archivos Ext2. Pero antes de utilizar esta herramienta, todavía queda trabajo por hacer.
Primero, vuelva a montar la partición donde se encuentra el archivo eliminado accidentalmente en modo de solo lectura. Utilice el siguiente comando: (asumiendo que el archivo está en la partición /usr)
mount -r -n -o remount /usr -r indica montaje de sólo lectura; -n indica que no se escribe en /etc/mtab. Si está restaurando archivos en /etc, agregue este parámetro. Si el sistema dice que la partición xxx está ocupada, puede usar el comando fusor para verificar qué procesos usan los archivos en esta partición:
fusor –v –m /usr
Si no hay procesos importantes, deténgalos con el siguiente comando:
fusor -k –v –m /usr
Luego, estos sistemas de archivos se pueden volver a montar.
Si todos los archivos están instalados en una partición / grande, puede usar Linux single para ingresar al modo de usuario único en el indicador de inicio para minimizar la posibilidad de que el proceso del sistema escriba datos en el disco duro, o simplemente cuelgue el disco duro en otra ubicación. . en la máquina. Además, no escriba los datos recuperados en/arriba para evitar dañar esos datos útiles. Si hay DOS/Windows en la máquina, puede escribir en estas particiones:
montar –r –n /dev/hda1 /mnt/had
Luego puedes ejecutar debugfs: (asumiendo que Linux está en /dev/hda5)
#debugfs/dev/hda5
Aparecerá el mensaje debugfs debugfs:
Utilice el comando lsdel para enumerar información sobre muchos archivos eliminados:
debugfs:lsdel debugfs: Se encontraron 2692 inodos eliminados. Modo propietario de inodo Tamaño Bloques Tiempo eliminado 164821 0 100600 8192 1/ 1 domingo 13 de mayo 19:22:46 2001 36137 0 100644 4 1/ 1 martes 24 de abril 10:11:15 2001 196829 0 100644 149500 38/ 38 lunes 27 de mayo 13:52:04 2001 |
Hay muchos archivos enumerados (se encuentran 2692 aquí. El primer campo es el número de nodo del archivo, el segundo campo es el propietario del archivo, el tercer campo son los permisos de lectura y escritura, seguido del tamaño del archivo, el número de bloques ocupados y). tiempo de eliminación.
Luego podemos determinar cuáles necesitamos según el tamaño del archivo y la fecha de eliminación. Por ejemplo, queremos restaurar el archivo con el nodo 196829:
Primero puede ver el estado de los datos del archivo:
debugfs: estadística <196829> Inodo: 196829 Tipo: regular Modo: 0644 Banderas: 0x0 Versión: 1 Usuario: 0 Grupo: 0 Tamaño: 149500 ACL de archivo: 0 ACL de directorio: 0 Enlaces: 0 Número de bloques: 38 Fragmento: Dirección: 0 Número: 0 Tamaño: 0 ctime: 0x31a9a574 - lunes 27 de mayo 13:52:04 2001 atime: 0x31a21dd1 - martes 21 de mayo 20:47:29 2001 mtime: 0x313bf4d7 - martes 5 de marzo 08:01:27 2001 dtime: 0x31a9a574 - lunes 27 de mayo 13:52:04 2001 BLOQUES: 594810 594811 594814 594815 594816 594817 TOTAL: 38 |
Luego puedes usar el comando de volcado para restaurar el archivo:
debugfs: volcado <196829> /mnt/hda/01.sav
Esto restaurará el archivo. Salir de depuración:
debugfs: salir
Otra forma es editar el inodo manualmente:
debugfs:mi <196829> Modo [0100644] ID de usuario [0] ID de grupo [0] Tamaño [149500] Hora de creación [0x31a9a574] Hora de modificación [0x31a9a574] Hora de acceso [0x31a21dd1] Hora de eliminación [0x31a9a574] 0 Número de enlaces [0] 1 Recuento de bloques [38] Banderas de archivo [0x0] Reservado1[0] Archivo acl [0] Lista de directorio [0] Dirección de fragmento [0] Número de fragmento [0] Tamaño del fragmento [0] Bloque directo #0 [594810] Bloque triple indirecto [0] |
Después de usar el comando mi, se muestra una línea de información para editar a la vez. Para otras líneas, puede presionar Enter directamente para confirmar, cambiar el tiempo de eliminación a 0 (no eliminar) y cambiar el recuento de enlaces a 1. Después de realizar los cambios, salga de debugfs:
debugfs: salir
Luego verifique /dev/hda5 con fsck
fsck /dev/hda5
El programa dirá que encontró el bloque de datos perdido y lo puso en perdido+encontrado. Los archivos en este directorio son los que queremos.