Miam Miam, un disque cru – FR

ou, comment monter un disque raw ayant de multiples partitions

Disclamer: toutes les commandes sont faites depuis le root, vous devrez surement utiliser sudo avant chaque commande ou prendre un terminal root en faisant “sudo -s”

Alors voila, il se fait qu’auparavant, mes backups consistaient en un:

dd if=/dev/sdx of=./monarchivedevsdx.dd conv=noerror,sync

Et je l’utilise toujours sur mon frontal qui est un VPCS chez OVH (Wireguardé pour venir à la maison) mais cette fois en utilisant un tunnel nc que l’on peut tunneler dans du ssh.
Je l’utilise aussi pour faire un backup des disques dur sur lesquels je fais faire une nouvelle install d’OS ou tenter un truc critique, comme ça, je peux inverser le precessus:

dd if=./monarchivedevsdx.dd of=/dev/sdx conv=noerror,sync

Mais voili voilou, une fois n’est pas coutume, il m’est souvent arrivé de n’avoir besoin que d’un fichier ou deux dans l’image dd et nous allons voir ci-dessous les étapes de comment monter juste une partition qui se trouve dans tout ce bordel.

Prenons une image d’un disque dur OS moisi… macOSX:

file ./2021-01-12-sda.dd

 ./2021-01-12-sda.dd: DOS/MBR boot sector; partition 1 : ID=0xee, start-CHS (0x3ff,254,63), end-CHS (0x3ff,254,63), startsector 1, 976773167 sectors, extended partition table (last)

Si je tente de le monter comme ça:

mount ./2021-01-12-sda.dd /mnt/

 mount: /mnt: mauvais type de système de fichiers, option erronée, superbloc erroné sur /dev/loop0, page de code ou programme auxiliaire manquant, ou autre erreur.

Donc on va regarder un peu plus loin

fdisk -l 2021-01-12-sda.dd 

 Disque 2021-01-12-sda.dd : 465,76 GiB, 500107862016 octets, 976773168 secteurs
 Unités : secteur de 1 × 512 = 512 octets
 Taille de secteur (logique / physique) : 512 octets / 512 octets
 taille d'E/S (minimale / optimale) : 512 octets / 512 octets
 Type d'étiquette de disque : gpt
 Identifiant de disque : 003F3068-CAEC-4781-B19A-5FFEF933751C
 Périphérique        Début       Fin  Secteurs Taille Type
 2021-01-12-sda.dd1     40    409639    409600   200M Système EFI
 2021-01-12-sda.dd2 409640 976773127 976363488 465,6G APFS Apple

Nous voyons, grâce au fdisk -l que le premier secteur est à l’addresse 40 et que la taille des Unités est de 512 octets.

Nous allons créer un device loop et monter virtuellement cette image raw .dd à l’emplacement de début de la première partition Début: 40, mais, petite subtilité, le secteur 40 est à l’offset (40 x 512) donc 20480:

mount -o ro,loop,offset=20480 2021-01-12-sda.dd /mnt


ls /mnt/

 BOOTLOG  EFI


df -h

/dev/loop0            197M     24M  174M  12% /mnt

Comme on peut le voir, j’ai bien pu monter la partition 1 (le EFI) et l’interface associée est loop0, pour avoir plus d’infos on peut utiliser losetup:

losetup
 
 NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE                                                    DIO LOG-SEC
 /dev/loop0         0  20480         1  1 /backupMac/2021-01-12-sda.dd   0     512

Pour démonter la partition, c’est comme d’ab

umount /mnt

On peut monter l’autre partition de la même manière (le secteur de début est 409640, donc l’offeset est de 409640 x 512 = 209735680:

mount -o ro,loop,offset=209735680 2021-01-12-sda.dd /mnt


ls /mnt/

 private-dir  root


df -h

/dev/loop0         466G    415G   51G  90% /mnt

Je vous zentend déjà, ouais c’est du MacOS mais nous, nous utilisons du ninux… qu’à cela ne tiennes mon/ma/mes jeune ami/ie/iNonGenré, prenons l’image d’une kali avec une table de partition en gpt:

fdisk -l sdf.dd 

 Mauvaise concordance des tailles de partition du secteur d'amorçage GPT (60063743 != 48611919), elles seront corrigées par l'écriture.
 Disque sdf.dd : 23,18 GiB, 24889303040 octets, 48611920 secteurs
 Unités : secteur de 1 × 512 = 512 octets
 Taille de secteur (logique / physique) : 512 octets / 512 octets
 taille d'E/S (minimale / optimale) : 512 octets / 512 octets
 Type d'étiquette de disque : dos
 Identifiant de disque : 0x00000000
 Périphérique Amorçage Début      Fin Secteurs Taille Id Type
 sdf.dd1                   1 48611919 48611919  23,2G ee GPT

Mais oui, fdisk ne prends pas en compte gpt, il faut utiliser gdisk:

gdisk -l sdf.dd 
 GPT fdisk (gdisk) version 1.0.6
[...]
 
 Caution: Found protective or hybrid MBR and corrupt GPT. Using GPT, but disk
 verification and recovery are STRONGLY recommended.
 
 Disk sdf.dd: 48611920 sectors, 23.2 GiB
 Sector size (logical): 512 bytes
 Disk identifier (GUID): 9688B318-20C7-4B80-8083-EA36F8BDD32C
 Partition table holds up to 128 entries
 Main partition table begins at sector 2 and ends at sector 33
 First usable sector is 34, last usable sector is 60063710
 Partitions will be aligned on 2048-sector boundaries
 Total free space is 4029 sectors (2.0 MiB)
 Number  Start (sector)    End (sector)  Size       Code  Name
    1            2048         1050623   512.0 MiB   EF00  
    2         1050624        58062847   27.2 GiB    8300  
    3        58062848        60061695   976.0 MiB   8200  

J’ai mes secteurs, tentons le bouzin pour la partition 1 pour changer ( 2048 x 512 ) = 1048576:

mount -o ro,loop,offset=1048576 sdf.dd /mnt


ls /mnt/

 EFI

Je n’ai pas monté la partition 2 car elle est gérée par LVM, et il va me falloir quelques recherches pour le manager comme il faut (ce sera un prochain post).

Voyons un cas un peu tordu, que ce passe t’il si la copie bit à bit est tombée en plein milieu (coupure de réseau en plein dd via ssh par exemple), pouvons nous accéder aux partitions qui ont été copiées:

dd if=/dev/sda of=./sdaMoisi.dd bs=1M count=200

 200+0 enregistrements lus
 200+0 enregistrements écrits
 209715200 octets (210 MB, 200 MiB) copiés, 3,22515 s, 65,0 MB/s
file sdaMoisi.dd 

 sdaMoisi.dd: DOS/MBR boot sector; partition 1 : ID=0xee, start-CHS (0x0,0,2), end-CHS (0x3ff,80,63), startsector 1, 468862127 sectors, extended partition table (last)


 fdisk -l sdaMoisi.dd 
 Mauvaise concordance des tailles de partition du secteur d'amorçage GPT (468862127 != 409599), elles seront corrigées par l'écriture.
 Disque sdaMoisi.dd : 200 MiB, 209715200 octets, 409600 secteurs
 Unités : secteur de 1 × 512 = 512 octets
 Taille de secteur (logique / physique) : 512 octets / 512 octets
 taille d'E/S (minimale / optimale) : 512 octets / 512 octets
 Type d'étiquette de disque : dos
 Identifiant de disque : 0x24e34dae
 Périphérique Amorçage Début    Fin Secteurs Taille Id Type
 sdaMoisi.dd1              1 409599   409599   200M ee GPT
#fdisk -l original du sda

Périphérique     Début       Fin  Secteurs Taille Type
 /dev/sda1         2048    206847    204800   100M Système EFI
 /dev/sda2       206848    239615     32768    16M Réservé Microsoft
 /dev/sda3       239616 437245405 437005790 208,4G Données de base Microsoft
 /dev/sda4    437248000 438310911   1062912   519M Environnement de récupération Windows
 /dev/sda5    438310912 467679231  29368320    14G Données OpenBSD
 /dev/sda6    467681280 468856831   1175552   574M Environnement de récupération Windows

Essayons (2048 x 512) = 1048576:

mount -o ro,loop,offset=1048576 sdaMoisi.dd /mnt


ls /mnt/

 EFI


ll /mnt/EFI/
 total 6
 drwxr-xr-x. 2 root root 1024 12 nov.  16:46 Boot
 drwxr-xr-x. 3 root root 1024 11 oct.  12:21 fedora
 drwxr-xr-x. 2 root root 1024 26 juil. 22:28 kali
 drwxr-xr-x. 4 root root 1024 27 juin   2020 Microsoft
 drwxr-xr-x. 2 root root 1024 19 juil.  2020 OBSD


losetup 

 NAME       SIZELIMIT  OFFSET AUTOCLEAR RO BACK-FILE                      DIO LOG-SEC
 /dev/loop0         0 1048576         1  1 /mnt/sdaMoisi.dd   0     512

Donc, même si l’image est corrompue, du moment que l’on connait l’adresse de la partition, on peut la monter de cette manière.

Mais la partition coupée en son milieu ne se monte pas:

mount -o ro,loop,offset=122683392 sdaMoisi.dd /mnt

 mount: /mnt: mauvais type de système de fichiers, option erronée, superbloc erroné sur /dev/loop0, page de code ou programme auxiliaire manquant, ou autre erreur.

Mais Tadammm quand même !!!