Blog › Méthodes et bonnes pratiques › Fusion Drive APFS
Publié le 14 septembre 2026
Un iMac arrive à l'atelier avec deux supports : le petit SSD Apple d'origine (vendu « 32 Go », 28 Go réels) et un SSD de 1 To qui a remplacé le disque dur de 2 To du Fusion Drive. Après le remplacement, macOS a été réinstallé. Le client veut retrouver des données, et une question conditionne toute la suite du travail : la réinstallation a-t-elle recréé un Fusion Drive (petit SSD + nouveau SSD) ou macOS s'est-il installé sur le seul SSD de 1 To ?
Si c'est un nouveau Fusion, les deux supports sont indispensables et doivent être imagés puis recombinés. Si ce sont deux conteneurs indépendants, le petit SSD n'a peut-être rien à voir avec les données actuelles. Se tromper, c'est soit perdre du temps sur une recombinaison inutile, soit extraire un volume à moitié vide en ignorant la moitié du conteneur.
Cet article s'adresse aux professionnels de la récupération de données. Il montre comment trancher à l'éditeur hexadécimal, à partir des seules structures documentées dans la spécification publique d'Apple (Apple File System Reference), sans dépendre d'un logiciel particulier.
Sur un Mac récent, chaque support porte un GPT classique : une partition EFI, puis une grande partition de
type APFS (GUID 7C3457EF-0000-11AA-AA11-00306543ECAC). Ce type est le même que la
partition soit un conteneur APFS autonome ou l'un des deux membres d'un Fusion Drive. Le GPT ne dit donc
rien de l'appartenance à un Fusion.
Deux cas se distinguent tout de même dès cette étape :
53746F72-6167-11AA-AA11-00306543ECAC, le préfixe
se lit « Storage » en ASCII) : c'est un Fusion de l'ancienne génération, sous HFS+, antérieur au passage à APFS ;
La réponse se trouve dans le superbloc du conteneur, le nx_superblock_t, reconnaissable
à sa signature NXSB. Sa copie de référence est le bloc 0 de la partition APFS, et
chaque membre d'un Fusion en porte une.
Sur un support classique en secteurs de 512 octets, la partition APFS d'un Mac démarre en général au
LBA 409640 (EFI de 200 Mo), soit l'offset 0xC805000 dans l'image.
Piège n° 1 de ce cas : le SSD Apple de 28 Go des iMac Fusion est en secteurs logiques de 4096 octets. Il annonce 6 835 938 secteurs, pas 54 millions. Toute la géométrie change :
| Structure | Secteurs 512 octets | Secteurs 4096 octets (SSD Apple 28 Go) |
|---|---|---|
En-tête GPT (EFI PART) | offset 0x200 | offset 0x1000 |
| Table des entrées (LBA 2) | offset 0x400 | offset 0x2000 |
| Entrée n° 2, premier LBA (+0x20 dans l'entrée) | offset 0x4A0 | offset 0x20A0 |
| Début de la partition EFI | LBA 40 | LBA 6 |
| Début de la partition APFS constaté | LBA 409640 | LBA 76806 |
| Offset du bloc 0 APFS dans l'image | 0xC805000 | 0x12C06000 |
Les réflexes à avoir :
EFI PART n'est pas à 0x200 mais à 0x1000, le support est en 4K natif ;Au bloc 0 de la partition APFS, le superbloc commence par un en-tête d'objet de 32 octets (checksum, identifiant d'objet, numéro de transaction, type), puis les champs du conteneur. Les offsets utiles pour notre question :
| Offset | Champ (spec Apple) | Taille | Ce qu'on en tire |
|---|---|---|---|
| +0x10 | o_xid | 8 octets | numéro de transaction du superbloc |
| +0x20 | nx_magic | 4 octets | 4E 58 53 42 = « NXSB » |
| +0x24 | nx_block_size | 4 octets | taille de bloc, en pratique 00 10 00 00 = 4096 |
| +0x28 | nx_block_count | 8 octets | nombre de blocs du conteneur |
| +0x40 | nx_incompatible_features | 8 octets | bit 0x100 = NX_INCOMPAT_FUSION |
| +0x48 | nx_uuid | 16 octets | UUID du conteneur |
| +0xB4 | nx_max_file_systems | 4 octets | nombre maximal de volumes |
| +0xB8 | nx_fs_oid[] | 8 octets × 100 | un identifiant non nul par volume |
| +0x500 | nx_fusion_uuid | 16 octets | zéro = pas de Fusion |
Toutes les valeurs numériques sont en little-endian.
02 00 00 00 00 00 00 00 : conteneur simple (seul le bit 0x2, conteneur APFS de version 2, est présent) ;02 01 00 00 00 00 00 00 : le bit 0x100 est levé, le conteneur est un Fusion.nx_fusion_uuid à un seul bit près. Ce bit distingue le support principal du
support secondaire (« tier2 »).Attention à ne pas vouloir déduire le rôle de chaque membre de la position de ce bit : la spécification et certaines implémentations ne décrivent pas la même convention. Le principal est de toute façon le support rapide (le SSD), le tier2 est le support de grande capacité.
Multipliez nx_block_size par nx_block_count et comparez le résultat à la taille de
la partition lue dans le GPT :
C'est un contrôle de cohérence précieux quand l'un des deux premiers indices est douteux.
Les copies du superbloc portées par les deux membres d'un même Fusion sont identiques au bit d'UUID et au checksum près, avec le même xid. Deux superblocs dont les UUID Fusion concordent mais dont les xid divergent fortement méritent qu'on aille lire le checkpoint le plus récent (voir plus bas) avant de conclure.
Les extraits ci-dessous sont reconstitués sur le modèle du cas traité (valeurs d'ordre de grandeur, checksums masqués).
SSD 1 To, conteneur simple (bloc 0 à l'offset 0xC805000) :
+0x00 xx xx xx xx xx xx xx xx 01 04 00 00 00 00 00 00 +0x10 80 0A EE 00 00 00 00 00 01 00 00 80 00 00 00 00 xid ~15,6 millions +0x20 4E 58 53 42 00 10 00 00 AC 45 8D 0E 00 00 00 00 NXSB, 4096, 244 139 436 blocs +0x40 02 00 00 00 00 00 00 00 ... pas de bit 0x100 ... +0x500 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 fusion UUID nul
244 139 436 blocs × 4096 = environ 1 000 Go : exactement la taille de la partition. Conteneur autonome.
Membre d'un Fusion 28 Go + 2 To (même zone, à titre de comparaison) :
+0x20 4E 58 53 42 00 10 00 00 E3 6B 82 1D 00 00 00 00 495 086 563 blocs = ~2 To +0x40 02 01 00 00 00 00 00 00 ... bit 0x100 levé +0x500 5B 1E 9A 07 C4 22 4D 61 8F 0B 3D 72 A9 10 E6 9C fusion UUID non nul
Sur le SSD de 28 Go, dont la partition APFS fait environ 6,76 millions de blocs, un tel superbloc annoncerait un conteneur de plus de 2 To : incohérent pour un conteneur simple, parfaitement normal pour un membre de Fusion. Le second membre porterait le même fusion UUID, un bit mis à part, et le même xid.
Piège n° 2 : un conteneur qui contient plusieurs volumes n'est pas forcément une installation de macOS.
Le tableau nx_fs_oid[] (+0xB8) liste un identifiant non nul par volume. Une installation
complète de macOS en compte en général quatre ou cinq (Système, Données, Preboot, Recovery, VM). On est
tenté d'en déduire « macOS était installé ici ». C'est une erreur fréquente.
Ces identifiants sont virtuels : ils se résolvent via la carte d'objets du conteneur. À l'hexadécimal, la
voie pragmatique consiste à repérer les superblocs de volume, signature APSB, et à y lire :
| Offset dans l'APSB | Champ | Contenu |
|---|---|---|
| +0x24 | apfs_fs_index | position du volume dans nx_fs_oid[] |
| +0x2C0 | apfs_volname | nom du volume en UTF-8 (256 octets) |
| +0x3C0 | apfs_role | rôle : 0x01 Système, 0x04 Recovery, 0x08 VM, 0x10 Preboot, 0x40 Données |
Plusieurs versions d'un même superbloc de volume coexistent sur le support (une par transaction) : retenez celle dont le xid (+0x10) est le plus élevé, pour chaque index.
Dans notre cas, le SSD de 28 Go affichait quatre volumes. Leur lecture a tout changé : Preboot, Recovery, VM (2 Go) et un volume créé à la main de quelques centaines de kilo-octets. Aucun volume Système, aucun volume Données. Quatre identifiants de volume, mais pas de macOS et pas de données utilisateur.
Le xid du bloc 0 donne une indication d'activité : environ 15,6 millions sur le SSD de 1 To (conteneur en service depuis longtemps), 608 sur le SSD de 28 Go (conteneur à peine utilisé). Deux précautions :
nx_xp_desc_base (+0x70) et
nx_xp_desc_blocks (+0x68) : c'est l'exemplaire NXSB au xid le plus élevé et au
checksum valide ;Une fois les deux supports imagés (jamais de travail sur l'original), lisez le GPT puis le bloc 0 APFS de chacun :
0x100 levé et un fusion UUID non nul0x100 absent, fusion UUID nul, taille = partition)L'ancien Fusion y est écrasé. Sur un SSD, le reformatage s'accompagne en général d'un TRIM de l'espace libéré : les blocs de l'ancien conteneur ont très vraisemblablement été effacés par le contrôleur, et ne sont plus lisibles par l'interface. C'était la situation de ce cas : deux conteneurs simples, les données actuelles entièrement sur le SSD de 1 To, le petit SSD hors jeu.
0x100 = Fusion), +0x500 (nx_fusion_uuid, zéro = simple),
+0x24 × +0x28 (taille du conteneur supérieure à la partition = Fusion), +0x10 (même xid
entre membres).APSB, +0x2C0 et +0x3C0) avant de décider qu'un
conteneur contient une installation ou des données.
Sources : Apple File System Reference, spécification publique d'Apple (structures nx_superblock_t,
apfs_superblock_t, constantes NX_INCOMPAT_FUSION et rôles de volume) :
developer.apple.com/support/downloads/Apple-File-System-Reference.pdf ;
spécification UEFI pour la structure GPT. Cas terrain : iMac Fusion 28 Go + 2 To, disque dur remplacé par
un SSD de 1 To puis macOS réinstallé.