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 !!!