Comment monter un `img` créé avec / bin / dd d'un disque dur?

19

J'avais l'habitude ddde sauvegarder un disque de 80 Go

dd if=/dev/sdb of=~/sdb.img

Maintenant, je dois accéder à certains fichiers sur ce lecteur, mais je ne veux pas copier le ".img" sur le lecteur.

mount ~/sdb.img /mnt/sdbne fonctionne pas non plus. Il renvoie:

mount: you must specify the filesystem type

J'ai essayé de trouver le type de système de fichiers avec file -s

fox@shoebox $ file -s sdb.img
sdb.img: x86 boot sector; partition 1: ID=0x12, starthead 1, startsector 63, 10233342 sectors; partition 2: ID=0xc, active, starthead 0, startsector 10233405, 72517410 sectors; partition 3: ID=0xc, starthead 0, startsector 82750815, 73545570 sectors, code offset 0xc0

Est-il possible de monter sdb.imgou dois-je utiliser ddpour restaurer le lecteur?

Renard
la source

Réponses:

27

Lorsque vous utilisez ddsur /dev/sdbau lieu de /dev/sdb1ou /dev/sdb2, vous copiez toutes les partitions dudit lecteur dans un fichier.

Vous devez monter chaque partition séparément.


Pour monter une partition à partir d'un fichier , vous devez d'abord savoir où se trouve cette partition dans le fichier.

En utilisant votre sortie de file -s sdb.imgnous trouvons le startsectorspour chaque partition:

sdb.img: secteur de démarrage x86; partition 1 : ID = 0x12, tête de démarrage 1, secteur de démarrage 63 , secteurs 10233342; partition 2 : ID = 0xc, actif, tête de démarrage 0, secteur de démarrage 10233405 , secteurs 72517410; partition 3 : ID = 0xc, tête de démarrage 0, secteur de démarrage 82750815 , secteurs 73545570, décalage de code 0xc0

Partition      Startsector
1 63
2 10233405
3 82750815

Pour monter une seule partition, où se X trouve le secteur de démarrage de cette partition, exécutez:

mount ~/sdb.img /mnt/sdb -o offset=$((X*512))

Donc, pour monter la deuxième partition , vous devrez exécuter:

mount ~/sdb.img /mnt/sdb2 -o offset=$((10233405*512))

sidenote: assurez-vous qu'il /mnt/sdb2existe avant d'exécuter ceci.

S'amuser!


mise à jour: Dans la réponse, j'ai supposé que la taille du secteur pour votre image était 512, veuillez voir cette question sur la façon de calculer cela.

Stefan
la source
Vous pouvez également obtenir les secteurs de démarrage dans un format tabulaire en utilisant file -l sdb.imgcomme publié dans la réponse à votre question: unix.stackexchange.com/questions/2668/…
étudiant
@student: Seulement une correction pour les futurs lecteurs: Ce ne serait fdisk -lpas le cas file -l.
Runium
Précision supplémentaire - vous pouvez obtenir le nombre de secteurs de 512 octets en ajoutant l'option -u à ​​cette commande - doncfdisk -u -l sdb.img
Aaron Mason
Si votre version de fileest moins bavard par défaut, essayez d' ajouter le -kcommutateur pour obtenir le type de sortie indiqué dans la réponse - comme ceci: file -k FILENAME.img.
Christian Pietsch
7

Sur Linux, les commandes de montage dans la réponse acceptée créeront implicitement un périphérique de boucle. En supposant que l'image disque complète possède une table de partition correcte (que votre noyau est capable de comprendre), vous préférerez peut-être utiliser losetup(8)directement pour vous éviter les tracas du calcul des décalages. De plus, il n'est pas nécessaire d'utiliser des outils supplémentaires comme kpartxle suggère une autre réponse . Il fera essentiellement la même chose que ce qui suit:

losetup -Prf sdb.imgassociera le premier périphérique de boucle libre ( -f) en lecture seule ( -r) au fichier image sdb.img. L' -Poption force le noyau à analyser la table de partition de ce périphérique de boucle et créera des périphériques de boucle pour chaque partition.

Vous pouvez donc obtenir quelque chose comme:

$ lsblk
NAME      MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0       7:0    0 167.7G  1 loop
├─loop0p1 259:0    0   500M  1 loop
└─loop0p2 259:1    0 167.2G  1 loop
...

Vous pouvez maintenant monter chaque partition, en lecture seule bien sûr, au point de montage souhaité.

$ mount -r /dev/loop0p1 /tmp/backup_sdb1

Garder tout en lecture seule est facultatif, mais peut être une bonne chose à faire pour une image de sauvegarde.

mise à jour: l' -Poption a été ajoutée avec util-linux-2.21 en 2012. Elle n'était donc pas disponible au moment où la réponse acceptée a été écrite. Notez également ceci et les autres réponses sont spécifiques à Linux. OpenBSD et NetBSD ont des disques vnode gérés par vnconfig(8)et FreeBSD a des disques mémoire gérés par mdconfig(8).

escrl
la source
2

Alternativement, vous pouvez utiliser un bel outil appelé kpartx. Depuis la page de manuel:

kpartx - Créer des mappages de périphériques à partir de tables de partition

Cela signifie que vous pouvez créer un "pseudo périphérique", avec des partitions de périphérique, directement à partir du fichier img:

$ kpartx -av sdb.img
add map loop0p1 (254:2): 0 2048 linear /dev/loop0 0
add map loop0p2 (254:3): 0 31162 linear /dev/loop0 2048
$ lsblk
.
.
.
loop0                     7:0    0  16.2M  0 loop
├─loop0p1               254:2    0     1M  0 part
└─loop0p2               254:3    0  15.2M  0 part

Ensuite, vous pouvez monter /dev/mapper/loop0p2par exemple, si vous voulez la deuxième partition sur l'image.

Omer Dagan
la source