#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