Selon votre sortie, vous avez copié 645MB sur le disque, ce qui signifie que l'EFI et les premiers ~440MB de la partition Linux ont été écrasés. Vos partitions Backup et Misc n'ont pas été modifiées, donc les données qu'elles contiennent peuvent être récupérées... si vous pouvez les trouver.
Cela peut être relativement facile 1 . Les tables de partition GUID sont stockées au début et à la fin du disque, donc tant qu'OS X n'a pas écrasé celles de la fin, vous pouvez les utiliser pour trouver vos données.
1 Par rapport à la recherche manuelle des en-têtes HFS, les commandes suivantes sont assez faciles. H
Tout d'abord, vous devez déterminer le nombre de secteurs de votre disque. Dans le Terminal, exécutez diskutil info disk1
(ou quel que soit le nom sous lequel votre disque est actuellement connecté), et recherchez la section Taille totale. Vous devriez y trouver le nombre exact de secteurs et, en dessous, la taille des secteurs. J'appellerai ces valeurs N et S, respectivement.
Ensuite, exécutez ces commandes, en remplaçant disk1, N et S comme il convient. Ceci copiera le dernier bloc de votre disque dans un fichier nommé partition_header.hex
. Ensuite, il imprime certaines données de ce fichier.
sudo dd if=/dev/disk1 of=partition_header.hex bs=S skip=$((N-1)) count=1
od -cN 8 partition_header.hex
od -tx4 -N 8 -j 72 partition_header.hex
-d -tu4 -N 4 -j 84 partition_header.hex
La sortie pour les trois od
devrait ressembler à ceci :
0000000 E F I P A R T
0000110 xxxxxxxx yyyyyyyy
0000124 ssss
Si la sortie de la première commande ne correspond pas à cette première ligne, vos tables de partition ont été écrasées. Voir mes suggestions à la fin. Les valeurs xxxxxxxx
y yyyyyyyy
sont deux nombres hexadécimaux. Ils doivent être des chiffres et des lettres compris entre a et f, et ils vous indiquent où sont stockées les données de la partition. La valeur ssss
est un nombre qui vous indique la taille d'une entrée de partition. Exécutez cette commande pour obtenir les données de la partition, en remplaçant disk1, S, xxxxxxxx
, yyyyyyyy
et ssss
(notez que le x après le 0 est littéral). Si ssss
est supérieure à 1/4 S, vous devrez peut-être augmenter le paramètre de comptage, mais cela est peu probable.
sudo dd if=/dev/disk1 of=partition_entry.hex bs=S skip=$((0xyyyyyyyyxxxxxxxx)) count=1
od -tc -N 8 -j $((56+2*ssss)) partition_entry.hex
od -tc -N 8 -j $((56+3*ssss)) partition_entry.hex
Les deux dernières commandes impriment le début des noms des troisième et quatrième partitions, chaque lettre étant suivie de \0
(en raison de l'encodage sur le disque). Si votre table de partition est toujours valide, il devrait s'agir de "Back" et "Misc". Si c'est le cas, il est temps de récupérer la table de partition complète et d'effectuer les modifications nécessaires pour la stocker à l'autre extrémité du disque. Exécutez ces deux commandes pour obtenir les LBA d'en-tête appropriés et le nombre total d'entrées de partition :
od -tx1 -N 16 -j 24 partition_header.hex
od -td4 -N 4 -j 80 partition_header.hex
La première commande renvoie aa bb cc dd ee ff gg hh ii jj kk ll mm oo pp qq
. Très probablement, ii
est 01
y jj
par le biais de qq
son 00
. La deuxième commande renvoie nnnn
probablement 128. Maintenant, nous pouvons lire la table de partition entière, au lieu de seulement les premières. Exécutez cette commande, en faisant les substitutions appropriées :
sudo dd if=/dev/disk1 of=partition_entry.hex bs=ssss skip=$((0xyyyyyyyyxxxxxxxx * S / ssss)) count=nnnn
Nous devons maintenant apporter quelques modifications à l'en-tête puisque les données seront stockées à un autre endroit.
printf '\xii\xjj\xkk\xll\xmm\xoo\xpp\xqq\xaa\xbb\xcc\xdd\xee\xff\xgg\xhh' | dd of=partition_header.hex bs=8 seek=3 count=2 conv=notrunc
printf '\x02\x00\x00\x00\x00\x00\x00\x00' | dd of=partition_header.hex bs=8 seek=9 count=1 conv=notrunc
La première commande échange l'en-tête actuel et les autres adresses d'en-tête. Désolé d'avoir remplacé chaque octet séparément, mais je ne connaissais pas de moyen plus simple. La deuxième commande écrit la nouvelle adresse des données d'entrée. La valeur 2 que j'ai utilisée suppose que ii
était de 1 et jj
par le biais de qq
S'ils ont d'autres valeurs, augmentez-les d'une unité et utilisez-les à la place. La seule chose dont nous avons besoin maintenant est le bon MBR, qui n'est pas sur votre disque puisqu'il ne fait pas partie de la table de partition. Heureusement, vous pouvez utiliser celui de votre disque interne, vous devez donc le copier dans un fichier.
sudo dd if=/dev/disk0 of=drive_mbr.hex bs=512 count=1
Maintenant que nous avons toutes les données, nous pouvons les écrire. Tout d'abord, démontez le volume Fedora s'il est monté.
diskutil unmountDisk disk1
Ensuite, copiez chaque pièce au début du lecteur. Assurez-vous de faire les substitutions appropriées dans ces commandes, écrire sur le mauvais disque ne serait pas bon.
sudo dd if=partition_entry.hex of=/dev/disk1 bs=S seek=2 count=nnnn
sudo dd if=partition_header.hex of=/dev/disk1 bs=S seek=1 count=1
sudo dd if=drive_mbr.hex of=/dev/disk1 bs=512 count=1
Les valeurs recherchées sont basées sur l'hypothèse que ii
par le biais de qq
correspondaient aux valeurs probables. Si ce n'est pas le cas, utilisez $((0xqqppoommllkkjjii))
pour la deuxième commande et $((0xqqppoommllkkjjii+1))
pour le premier.
Après avoir exécuté ces commandes, OS X va probablement recharger le disque automatiquement et charger les partitions. Si ce n'est pas le cas, déconnectez-le et reconnectez-le. La partition Linux ne pourra probablement pas être montée, puisque son en-tête a été écrasé, mais les deux autres devraient fonctionner correctement. Malgré cela, je vous suggère de copier vos données de la partition Linux.
Si votre table de partition est corrompue :
L'option qui a le plus de chance de réussir est de rechercher manuellement les en-têtes HFS au début de votre partition de sauvegarde. Le format d'un volume HFS est décrit ici . Fondamentalement, vous devrez calculer le décalage approximatif de la partition dans le lecteur en utilisant la carte de partition que vous avez, puis rechercher chaque secteur dans la zone à la recherche de l'en-tête de volume. Vous pourriez probablement écrire un script pour rechercher pour vous.
Une autre option serait d'utiliser un logiciel de récupération de fichiers. Je ne sais pas quel logiciel est disponible pour gérer cette situation, je ne peux donc pas dire grand-chose à ce sujet.