Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 11/09/2006, à 09:09

cep

Monter un système de fichiers ext3 endommagé

Pour différentes raisons, il se peut que le système de fichiers d'une partition ext3 soit endommagé et ne puisse plus être monté.

Avant d'intervenir en profondeur pour réparer le problème, il peut être intéressant d'essayer  de monter cette partition pour, au moins, faire des sauvegardes.

Pour commencer, il faut repérer une archive du superblock et l'utiliser pour monter la partition.

Pour cela on va utiliser mkfs.ext3 avec l'option -n, qui ne créera pas de système de fichiers mais montrera ce qui aurait été réalisé, indiquant par la même occasion l'emplacement des sauvegardes du superblock. Surtout ne pas oublier le -n sinon les données présentes sur le disque seront perdues.
Pour notre exemple on prend comme partition /dev/hda3 et la commande serait :
sudo mkfs.ext3 -n /dev/hda3.
Comme on veut récupérer seulement l'adresse des supers, on va utiliser sed pour n'afficher que les lignes 11 et 12 de la sortie :

:~$ sudo mkfs.ext3 -n /dev/hda3 |sed -n '11,12p'
mke2fs 1.38 (30-Jun-2005)
Archive du superbloc stockée sur les blocs:
        8193, 24577, 40961, 57345, 73729, 204801, 221185

Cette partition utilise des blocks de 1 Ko :
Taille de bloc=1024 (log=0)

Pour monter la partition il suffira donc d'indiquer l'adresse d'un super, par exemple celui situé à 40961.
On va donc monter la partition en lecture seulement ( ro ) :

:

~$ sudo mount /dev/hda3 -t ext3 -o ro,sb=40961 /mnt/

On vérifie le mount :

:~$  mount |grep hda3
/dev/hda3 on /mnt type ext3 (ro,sb=40961)

Plus souvent les blocks auront une taille de 4 Ko, indication donnée par mkfs.ext3 -n ( ou tune2fs -l ) comme dans l'exemple ci-dessous :

:~$ sudo mkfs.ext3 -n /dev/hda2
mke2fs 1.38 (30-Jun-2005)
. . .
Taille de bloc=4096 (log=2)
Taille de fragment=4096 (log=2)
. . .
Archive du superbloc stockée sur les blocs:
        32768, 98304, 163840, 229376

Dans ce cas, il faudra multiplier l'adresse des archives par 4. Par exemple 98304 deviendra :
98304 * 4 = 393216 et pour monter la partition :

:~$ sudo mount /dev/hda2 -t ext3 -o ro,sb=393216 /mnt/

On vérifie le mount :

:~$ mount |grep hda2
/dev/hda2 on /mnt type ext3 (ro,sb=393216)

Après avoir fait les sauvegardes, on peut démonter la partition normalement.

- - - - - - - - - -

Parfois il peut être nécessaire de monter la partition non pas en la désignant par /dev/hdxn mais par son emplacement "physique" sur le disque.

On va utiliser fdisk avec l'option -u pour donner la taille en secteur et -l pour lister les partitions :

:~$ sudo fdisk -lu /dev/hdb

Disque /dev/hdb: 4327 Mo, 4327464960 octets
15 têtes, 63 secteurs/piste, 8944 cylindres, total 8452080 secteurs
Unités = secteurs de 1 * 512 = 512 octets
 
Périphérique Amorce    Début         Fin      Blocs    Id  Système
/dev/hdb1           16065     8450189     4217062+   f  W95 Etendu (LBA)
/dev/hdb5           16128      642599      313236   82  Linux swap / Solaris
/dev/hdb6          642663     5748434     2552886   83  Linux
/dev/hdb7         8241408     8450189      104391   83  Linux
/dev/hdb8   *     5748498     8241344     1246423+  83  Linux

On a donc les positions et tailles en secteurs et la valeur d'un secteur, qui est de 512 octets.

On aurait pu avoir le même résultat avec parted :
sudo parted -s /dev/hdb unit -s print

Maintenant on va monter la partition hdb8 en utilsant ces éléments.
D'abord on va calculer la "position" de la partition en multipliant la valeur secteurs (5748498) par la taille d'un scteur en octets. Pour cela on utilise expr si l'on n'a pas de calculatrice sous la main :

:~$ expr  5748498 \* 512
2943230976

Valeur que l'on va utiliser pour monter la partition dans un /dev/loop :

On détermine quel est le premier loop libre :

:~$ sudo losetup -f
/dev/loop/0

On associe le "périférique" 2943230976 (/dev/hdb) avec /dev/loop0 avec l'option -o de losetup.
Extrait du man : 
-o offset   The data start is moved offset bytes into the specified file or device.

:~$ sudo losetup -o 2943230976 /dev/loop0 /dev/hdb

Puis on monte la partition en ro :

:~$ sudo mount -o ro -t ext3 /dev/loop0 /mnt/

On vérifie le mount :

:~$ cat /proc/mounts |grep loop0
/dev/loop0 /mnt ext3 ro,data=ordered 0 0

Pour démonter la partition :

:~$ sudo umount /dev/loop0

et on libère loop0:

:~$ sudo losetup -d /dev/loop0

Après avoir fait les sauvegardes, il sera ainsi possible de faire les réparations, avec par exemple e2fsck -y ou e2fsck -b xxx, ou autre moyen.

Ne pas oublier aussi d'utiliser si nécessaire testdisk :
http://www.cgsecurity.org/wiki/Damaged_Hard_Disk
http://www.cgsecurity.org/wiki/FR_TestDisk#Documentation

Ou bien encore gpart :
http://www.stud.uni-hannover.de/user/76201/gpart/
http://www.linuxdevcenter.com/pub/a/linux/2006/08/31/lessons-of-knoppix-recovery.html?page=2

Il existe des paquets debian de ces deux utilitaires, ils sont donc installables par synaptic, adept, aptitude, ou apt-get.

Hors ligne