Recuperación de un sistema de archivos ext4 con diario corrupto

9

Tengo un disco duro que parece haber desarrollado algún tipo de problema de hardware en el diario. Esto evita que la unidad se cargue. mount -r -t ext4 /dev/sda5 /mnt/rootResultados en ejecución en el siguiente error del núcleo:

[ 1420.671055] ata1.00: exception Emask 0x0 SAct 0x1000000 SErr 0x0 action 0x0
[ 1420.673862] ata1.00: irq_stat 0x40000008
[ 1420.676600] ata1.00: failed command: READ FPDMA QUEUED
[ 1420.679326] ata1.00: cmd 60/40:c0:a8:9d:0a/00:00:08:00:00/40 tag 24 ncq 32768 in
[ 1420.679326]          res 41/40:40:e1:9d:0a/00:00:08:00:00/00 Emask 0x409 (media error) <F>
[ 1420.685014] ata1.00: status: { DRDY ERR }
[ 1420.687858] ata1.00: error: { UNC }
[ 1420.761064] ata1.00: configured for UDMA/133
[ 1420.763863] sd 0:0:0:0: >[sda] Unhandled sense code
[ 1420.766653] sd 0:0:0:0: >[sda]  
[ 1420.769364] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[ 1420.772104] sd 0:0:0:0: >[sda]  
[ 1420.774780] Sense Key : Medium Error [current] [descriptor]
[ 1420.777491] Descriptor sense data with sense descriptors (in hex):
[ 1420.780249]         72 03 11 04 00 00 00 0c 00 0a 80 00 00 00 00 00 
[ 1420.783175]         08 0a 9d e1 
[ 1420.785972] sd 0:0:0:0: >[sda]  
[ 1420.788730] Add. Sense: Unrecovered read error - auto reallocate failed
[ 1420.791545] sd 0:0:0:0: >[sda] CDB: 
[ 1420.794331] Read(10): 28 00 08 0a 9d a8 00 00 40 00
[ 1420.797242] end_request: I/O error, dev sda, sector 134913505
[ 1420.800072] ata1: EH complete
[ 1420.800077] JBD2: Failed to read block at offset 2748
[ 1420.812529] JBD2: recovery failed
[ 1420.815275] EXT4-fs (sda5): error loading journal

Apenas entiendo lo que esto significa, pero seguramente parece un problema de hardware que impide que se cargue el diario. ¿Hay alguna forma de evitar esto? ¿Puede el diario, por ejemplo, reubicarse en un desplazamiento diferente mientras deja el resto del disco casi intacto? No tengo intención de seguir usando el disco; Solo quiero montarlo para poder copiar algunos archivos cruciales.

JSB ձոգչ
fuente
Dos cosas: asegúrese de desconectar y volver a conectar los cables. Si incluso puede deshacerse del problema de hardware temporalmente. Si es así, obtenga nuevos cables. De lo contrario, pruebe también los discos en otra computadora con diferentes cables.
0xC0000022L
¿Intentaste con fsckel sistema de archivos?
psusi
Tuve un problema similar hoy en el que de alguna manera logré corromper el diario al desbloquear mi partición encriptada ext4. Solo pude montar como solo lectura. Logré arreglarlo ejecutando la rutina 'Verificar' contra la partición en GParted. La rutina 'Verificar' encontró los problemas con el diario y los corrigió automáticamente.
navnav

Respuestas:

8

Para montarlo de solo lectura, sin volver a reproducir el diario para que pueda acceder a sus archivos (probablemente perderá algunos cambios que aún no se han confirmado en el fs regular):

mount -o ro,noload ...

Ronald
fuente
7

Echa un vistazo a la salida de smartctl -a /dev/sda. Si no es un problema de cable, entonces el disco puede estar muriendo. Si no tiene una copia de seguridad reciente, intente copiar el contenido del dispositivo de bloque (sin montar) usando dd_rescue o dd con las opciones respectivas.

Después de eso, puede probar hdparm --write-sector(siempre es divertido estas opciones "MUY PELIGROSAS" ...).

Otra opción es crear un dispositivo DM que omita los sectores defectuosos. Eso no recupera sus contenidos, por supuesto. Debe convertir el desplazamiento sda (134913505) en un desplazamiento sda5 (encuentre el número del primer sector de sda5 y reste). Supongamos que el desplazamiento sda5 es 12345. Usted crea un dispositivo de bloque cuyo sector 12345 no está asignado a sda5 sino a otro lugar (por ejemplo, dispositivo de bucle). La definición del dispositivo (para dmsetup create) se ve así:

0 12345 linear /dev/sda5 0
12345 1 linear /dev/loop0 0
12346 99987653 /dev/sda5 12345

# format:
# logical_start_sector num_sectors linear destination_device start_sector

No tendrás tanta suerte de que solo haya un sector defectuoso. Puede asignar tantos como desee (lo que da como resultado que el dispositivo DM entregue ceros para esos sectores pero se pueda escribir), pero calcular los desplazamientos en el loop0 puede ser divertido. Otra opción sería usar un dispositivo virtual del mismo tamaño para reasignar y usar aprovisionamiento delgado o una instantánea (con un tamaño de fragmento pequeño, 1 sector, por ejemplo) de un dispositivo de destino cero.

Editar 1

El dispositivo de bucle no debe apuntar a un archivo en el mismo disco (sda), por supuesto.

Hauke ​​Laging
fuente
Muy buen punto. --write-sectorestá lejos de ser "peligroso". De hecho, esta es la opción ideal para usar siempre que ciertos sectores individuales corruptos le impidan obtener una imagen continua del sector sin procesar ( ddse rescataría con un "error de E / S del dispositivo"; algunos discos duros incluso requerirán apagar y encender la máquina ( !) para ser reconocido por el sistema operativo de nuevo). Sin embargo, debe saber acerca de los scripts de shell si desea utilizarlos --write-sectorpara rangos de sector .
syntaxerror
0

Puede arrancar en modo de recuperación, en el que el FS se montará de solo lectura y copiará sus cosas.

schaiba
fuente
Estoy montando solo lectura. Corregí la línea de comandos que se muestra arriba para aclarar esto.
JSB ձոգչ
¿Y puedes acceder al disco?
schaiba
No. Intentar montar la unidad RO (o en R / W, no hace ninguna diferencia) da como resultado el error arrojado arriba.
JSB ձոգչ
Entonces, la sugerencia con el intercambio de cable puede ser útil. Y con respecto a su pregunta, el diario no se puede mover de la manera que desee.
schaiba