Comment utiliser DD pour cloner une partition d'une image disque?

9

J'ai une image disque, c'est une image disque "entière", par exemple, contient plusieurs partitions, et je veux cloner une seule d'entre elles (pas la première ..) sur une partition sur un disque externe avec plusieurs partitions ( Je ne le clone pas non plus sur la première partition du disque ...)

FDisquez l'image donne ceci:

# fdisk -l 2013-02-09-wheezy-raspbian.img 

Disque 2013-02-09-wheezy-raspbian.img: 1939 Mo, 1939865600 octets
255 têtes, 63 secteurs / piste, 235 cylindres, total 3788800 secteurs
Unités = secteurs de 1 * 512 = 512 octets
Taille du secteur (logique / physique): 512 octets / 512 octets
Taille d'E / S (minimum / optimal): 512 octets / 512 octets
Identificateur de disque: 0x00014d34

                         Système d'identification des blocs de début de démarrage de périphérique
2013-02-09-wheezy-raspbian.img1 8192 122879 57344 c W95 FAT32 (LBA)
2013-02-09-wheezy-raspbian.img2 122880 3788799 1832960 83 Linux
#

et le périphérique de bloc ressemble à ceci:

# fdisk -l / dev / sdc

Disque / dev / sdc: 8014 Mo, 8014266368 octets
247 têtes, 62 secteurs / piste, 1022 cylindres, total 15652864 secteurs
Unités = secteurs de 1 * 512 = 512 octets
Taille du secteur (logique / physique): 512 octets / 512 octets
Taille d'E / S (minimum / optimal): 512 octets / 512 octets
Identificateur de disque: 0x00000000

   Système d'identification des blocs de début de démarrage de périphérique
/ dev / sdc1 2048 131071 64512 e W95 FAT16 (LBA)
/ dev / sdc2 131072 15652863 7760896 83 Linux
#

Je veux que la deuxième partition de l'image remplace la deuxième partition du périphérique de bloc. Ne vous inquiétez pas de l'espace libre corrompu, je vais utiliser GParted pour nettoyer cela, et j'en ai besoin pour autre chose de toute façon.

JamesTheAwesomeDude
la source
spécifiez exactement où vous voulez que votre partition soit clonée et où se trouvent vos fichiers image!
fromnaboo

Réponses:

8
# losetup --find --show --partscan --read-only 2013-02-09-wheezy-raspbian.img
/dev/loop7
# dd if=/dev/loop7p2 of=/dev/narnia bs=1M

Si --partscancela ne fonctionne pas, vous pouvez également utiliser l'un des éléments suivants:

# partx -a /dev/loop7
# kpartx /dev/loop7

ou des solutions de mappage de partition similaires.

Vous devriez probablement le monter d'abord pour voir si c'est la bonne chose ou quoi.

Bien sûr, vous pouvez également lire la sortie fdisk et donner directement ddle skip=131072ou quoi que ce soit, c'est-à-dire faire sauter autant de blocs d'entrée pour qu'il commence à lire à l'emplacement de la partition; mais il est plus agréable de voir les partitions réelles avec un périphérique en boucle.

frostschutz
la source
Votre losetupcommande n'a pas fonctionné - elle indiquait une option non reconnue --find. J'ai supprimé cela, il a dit qu'il ne reconnaissait pas --show. Le retirer --partscanm'a fait me plaindre , à quel point j'ai réalisé que le commandement n'allait rien faire pour moi de sitôt. J'ai décidé d'essayer les autres, mais les deux partxet de kpartxretourner "commande non trouvée".
JamesTheAwesomeDude
Je voudrais juste courir dd if=2013-02-09-wheezy-raspbian.img of=/dev/sdc skip=122880, mais ça revient dd: ‘2013-02-09-wheezy-raspbian.img’: cannot skip: Invalid argument.
JamesTheAwesomeDude
1
skipdépend bs, donc si vous avez utilisé bs=1M(ou avez un alias qui fait cela), cela expliquerait pourquoi cela ne fonctionne pas. essayez avec bs=512. Aussi, pourquoi 122880 quand fdisk dit 131072? Mon losetup aussi losetup from util-linux 2.22.2. idem pour partx. kpartx est issu d'outils multi-chemins (mappeur de périphériques utilisé).
frostschutz
kpartxest pour LVM. partprobefera également le travail, à partir du package séparé.
psusi
@frostschutz C'était 12280 octets depuis le début du fichier image.
JamesTheAwesomeDude
0

Quelque chose comme ça devrait fonctionner:

dd if=/path/to/2013-02-09-wheezy-raspbian.img2 of=/dev/sdc2 bs=4096 conv=notrunc,noerror

if = définit l'image que vous souhaitez cloner

of = définit la partition cible où vous souhaitez cloner l'image

fromnaboo
la source
1
J'ai eu l'erreur attendue:dd: opening ‘2013-02-09-wheezy-raspbian.img2’: No such file or directory
JamesTheAwesomeDude
avez-vous remplacé /path/to/2013-02-09-wheezy-raspbian.img2 par votre véritable chemin vers le fichier image? : |
fromnaboo
1
**** facepalm **** Oui, je viens d'ajouter le 2 à la fin, comme vous l'avez dit .
JamesTheAwesomeDude
cela ne fonctionne pas, dd ne voit pas de partitions sur un fichier image comme ça
Michal Artazov
0
  1. Montez l'image en tant que périphérique de bouclage: losetup -fP yourImage.img
  2. Vous pouvez maintenant accéder directement à chaque partition de l'image. Si vous devez utiliser dd, vous pouvez le faire dd if=/dev/loop0p1 of=image.img, mais je pense que vous aimeriez catmieux. Dans un shell racine, faites simplement cat /dev/loop0p1 > image.img. Les deux exemples supposent que vous voulez la première partition, et le périphérique de bouclage qui vous a été attribué était/dev/loop0
  3. Une fois que vous avez terminé avec le périphérique de bouclage, vous pouvez le détacher avec losetup -d /dev/loop0. Encore une fois, cela suppose qu'il /dev/loop0s'agit de votre périphérique de bouclage.
John Leuenhagen
la source
0

Vous pourriez faire:

sudo partx --add -v 2013-02-09-wheezy-raspbian.img 
# time sudo dd if=/dev/loop0p1 |pv -s 80M |sudo dd of=/dev/sdc1
time sudo dd if=/dev/loop0p2 |pv -s 4G |sudo dd of=/dev/sdc2
sudo partx --delete -v /dev/loop0
Frank Breitling
la source
0

Vous pouvez copier uniquement la deuxième partition vers une image distincte avec ce

dd if=2013-02-09-wheezy-raspbian.img of=second.img bs=512 skip=122880

et après cela, vous pouvez le copier à la place de la partition sur le disque

dd if=second.img of=/dev/sdc2 bs=512

ou vous pouvez même le faire en une seule commande

dd if=2013-02-09-wheezy-raspbian.img of=/dev/sdc2 bs=512 skip=122880

Assurez-vous simplement de démonter / dev / sdc2 avant de l'écrire.

Michal Artazov
la source