Avant de réparer le problème, il peut
être interessant d'essayer de monter cette partition pour, au
moins, faire des sauvegardes.
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 grep pour n'afficher que les lignes 11 et 12 de
la sortie :
|
:~$ sudo mkfs.ext3
-n /dev/hda3 |sed -n '11,15p'
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) Étiquette de système de fichiers= Type de système d'exploitation: Linux Taille de bloc=4096 (log=2) Taille de fragment=4096 (log=2) 130048 inodes, 260064 blocs 13003 blocs (5.00%) réservé pour le super usager Premier bloc de données=0 8 bloc de groupes 32768 blocs par groupe, 32768 fragments par groupe 16256 inodes par groupe 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) |
La partition est bien montée suivant les indications données. Après avoir fait les sauvegardes des données sur une autre partition, on pourra 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 |
aleur 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 losetup
:-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 |