Récupération d'un système de fichiers ext4 avec un journal corrompu

9

J'ai un disque dur qui semble avoir développé une sorte de problème matériel dans le journal. Cela empêche le lecteur d'être chargé. L'exécution des mount -r -t ext4 /dev/sda5 /mnt/rootrésultats dans le crachat du noyau suivant:

[ 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

Je comprends à peine ce que cela signifie, mais cela ressemble à un problème matériel empêchant le chargement du journal. Est-il possible de contourner cela? Le journal peut-il, par exemple, être déplacé vers un décalage différent tout en laissant le reste du lecteur presque intact? Je n'ai aucune intention de continuer à utiliser le lecteur; Je veux juste le monter pour pouvoir copier quelques fichiers cruciaux.

JSB ձոգչ
la source
Deux choses: assurez-vous de déconnecter et reconnecter les câbles. Il peut même se débarrasser temporairement du problème matériel. Si c'est le cas, procurez-vous de nouveaux câbles. Sinon, essayez également le ou les disques d'un autre ordinateur avec des câbles différents.
0xC0000022L
Avez-vous essayé fsckle système de fichiers?
psusi
J'ai eu un problème similaire aujourd'hui où j'ai réussi à corrompre le journal lors du déverrouillage de ma partition ext4 cryptée. Je ne pouvais monter qu'en lecture seule. J'ai réussi à le réparer en exécutant la routine 'Check' sur la partition dans GParted. La routine «Vérifier» a trouvé les problèmes avec le journal et les a corrigés automatiquement.
navnav

Réponses:

8

Pour le monter en lecture seule, sans relire le journal afin que vous puissiez accéder à vos fichiers (vous perdrez probablement quelques modifications qui n'ont pas encore été validées dans le fs normal):

mount -o ro,noload ...

Ronald
la source
7

Jetez un oeil à la sortie de smartctl -a /dev/sda. Si ce n'est pas un problème de câble, le disque est peut-être en train de mourir. Si vous n'avez pas de sauvegarde récente, vous devriez essayer de copier le contenu du périphérique de bloc (sans montage) à l'aide de dd_rescue ou dd avec les options respectives.

Après cela, vous pouvez essayer hdparm --write-sector(toujours drôle ces options "TRÈS DANGEREUSES ...).

Une autre option consiste à créer un appareil DM qui contourne les secteurs défectueux. Bien sûr, cela ne récupère pas leur contenu. Vous devez convertir le décalage sda ​​(134913505) en décalage sda5 (connaître le numéro du premier secteur de sda5 et le soustraire). Supposons que le décalage sda5 soit 12345. Vous créez un périphérique de bloc dont le secteur 12345 n'est pas mappé sur sda5 mais ailleurs (par exemple, périphérique de boucle). La définition de périphérique (pour dmsetup create) ressemble à ceci:

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

Vous n'aurez pas la chance qu'il n'y ait qu'un seul secteur défectueux. Vous pouvez en cartographier autant que vous le souhaitez (ce qui permet au périphérique DM de fournir des zéros pour ces secteurs mais en écriture), mais le calcul des décalages dans loop0 peut devenir amusant. Une autre option serait d'utiliser un périphérique virtuel de la même taille pour le remappage et d'utiliser soit l'allocation dynamique ou un instantané (avec une petite taille de bloc, 1 secteur par exemple) d'un périphérique cible zéro.

Modifier 1

Le périphérique de boucle ne doit pas pointer vers un fichier sur le même disque (sda), bien sûr.

Hauke ​​Laging
la source
Très bon point. --write-sectorest loin de "dangereux". En fait, c'est en fait l' idéal option pour utiliser chaque fois que certains corrompus simples secteurs vous empêchent d'obtenir une continue l' image du secteur brut ( ddrenflouerait avec « Device erreur E / S », certains hdds vais même demander de cycle d'alimentation de la machine ( !) pour être à nouveau reconnu par l'OS). Cependant, vous devez connaître les scripts shell si vous souhaitez les utiliser --write-sectorpour les plages de secteurs .
erreur de syntaxe
0

Vous pouvez démarrer en mode de récupération, dans lequel le FS sera monté en lecture seule, et copier vos trucs.

Schaiba
la source
Je monte en lecture seule. J'ai corrigé la ligne de commande ci-dessus pour rendre cela plus clair.
JSB
Et pouvez-vous accéder au lecteur?
schaiba
Non. Si vous essayez de monter le variateur RO (ou en R / W, cela ne fait aucune différence), le message d'erreur ci-dessus est généré.
JSB
Ensuite, la suggestion avec l'échange de câbles peut être utile. Et concernant votre question, le journal ne peut pas être déplacé comme vous le souhaitez.
schaiba