Montage d'une partition HFS+
Un cas difficile
Erreur de montage
Il peut arriver que, malgré toutes les tentatives et vérifications, la commande de montage échoue en affichant (via syslog) les messages suivants :
Dec 9 10:20:09 kernel: hfsplus: unable to find HFS+ superblock
Dec 9 10:23:53 kernel: hfsplus: invalid secondary volume header
Le second message est très important, et explique la situation :
- le pilote HFS+ trouve bien le premier superbloc, situé 1Ko après le début de la partition, mais
- il ne trouve pas le second superbloc, placé à la fin de la dite partition.
Une telle situation paraît de prime abord surprenante. En effet, la partition a été formattée sous MacOS et peut y être utilisée. Cela signifie qu'elle est correcte et que toutes les méta-informations nécessaires sont présentes. Mais Linux ne veut rien savoir.
En réalité, il y a un détail qui est souvent oublié :
- le second superbloc est situé à la fin du système de fichiers, moins deux blocs (il commence sur le pénultième bloc du système de fichiers)
- le système de fichiers n'occupe pas toujours toute la surface de la partition.
Lorsque le système de fichiers occupe l'intégralité de la partition, les commandes précédentes fonctionnent bien. Si le système de fichiers n'occupe pas toute la partition, il faut trouver où il se termine exactement.
Recherche du second superbloc
Le second superbloc étant une copie du premier, nous examinons celui-ci pour savoir quoi chercher. Comme il peut être difficile de charger toute la partition dans un éditeur hexadécimal, nous extrayons seulement le premier demi-Go :
$ dd if=disque-128G.dd skip=409640 bs=512 count=1024 of=/tmp/debut
1024+0 records in
1024+0 records out
524288 bytes (524 kB) copied, 0.0430321 s, 12.2 MB/s
Et nous examinons le contenu situé à 1 Ko à l'intérieur de ces données :
Le superbloc commence par H+ suivi de six octets suivi de HFSJ suivi de quatre octets. Le disque étant de taille modeste, nous pouvons rechercher la chaine HFSJ dans toute la partition, en ne retenant que la dernière occurrence :
$ dd if=disque-128G.dd bs=512 skip=409640 count=235298960 | strings -t d | grep HFSJ
1032 HFSJ
[autres occurrences]
111386692246 jHfSj
120154295304 HFSJ
$
Pour un gros disque, il faudrait extraire les quelques derniers Go de la partition pour ne faire la recherche que sur ceux-ci.
Dans les résultats, nous constatons la présence de la chaîne HFSJ au 1032ème octet de la zone examinée. L'examen du superbloc montrant que cette chaîne apparaît au huitième octet du superbloc, cela place le dit superbloc au 1024ème octet de la zone examinée -- l'emplacement normal du premier superbloc d'une partition HFS+.
La dernière ligne de résultats indique que la chaîne HFSJ se trouve au 120154295304ème octet de la zone, ce qui met le second superbloc à l'emplacement 120154295296 (huit octets avant l'occurrence de la chaîne), soit au bloc numéro 234676358. En ajoutant 2 au numéro de bloc, ou 1024 à l'emplacement de début du second superbloc, nous obtenons la taille réelle du système de fichiers. Il suffit alors d'utiliser cette valeur pour le paramètre sizelimit de losetup/mount :
$ losetup -f --read-only --offset $((512*409640)) --sizelimit=$((512*234676360)) fichier-128Go.dd
$ mount -o ro /dev/loop0 point-de-montage
$
La partition est (enfin !) montée et peut être examinée.