Wie verwende ich DD, um eine Partition von einem Disk-Image zu klonen?

9

Ich habe ein Disk-Image, es ist ein "ganzes" Disk-Image, das z. B. mehrere Partitionen enthält, und ich möchte nur eine davon (nicht die erste ..) auf eine Partition auf einem externen Laufwerk mit mehreren Partitionen klonen ( Ich klone es auch nicht auf die erste Partition der Festplatte ...)

Wenn Sie das Bild mit einer Diskette versehen, erhalten Sie Folgendes:

# fdisk -l 09.02.2013-wheezy-raspbian.img 

Datenträger 2013-02-09-wheezy-raspbian.img: 1939 MB, 1939865600 Byte
255 Köpfe, 63 Sektoren / Spur, 235 Zylinder, insgesamt 3788800 Sektoren
Einheiten = Sektoren von 1 * 512 = 512 Bytes
Sektorgröße (logisch / physisch): 512 Bytes / 512 Bytes
E / A-Größe (Minimum / Optimum): 512 Bytes / 512 Bytes
Festplattenkennung: 0x00014d34

                         Gerätestart Start Ende blockiert ID-System
2013-02-09-wheezy-raspbian.img1 8192 122879 57344 c W95 FAT32 (LBA)
2013-02-09-wheezy-raspbian.img2 122880 3788799 1832960 83 Linux
#

und das Blockgerät sieht folgendermaßen aus:

# fdisk -l / dev / sdc

Festplatte / dev / sdc: 8014 MB, 8014266368 Byte
247 Köpfe, 62 Sektoren / Spur, 1022 Zylinder, insgesamt 15652864 Sektoren
Einheiten = Sektoren von 1 * 512 = 512 Bytes
Sektorgröße (logisch / physisch): 512 Bytes / 512 Bytes
E / A-Größe (Minimum / Optimum): 512 Bytes / 512 Bytes
Festplattenkennung: 0x00000000

   Gerätestart Start Ende blockiert ID-System
/ dev / sdc1 2048 131071 64512 e W95 FAT16 (LBA)
/ dev / sdc2 131072 15652863 7760896 83 Linux
#

Ich möchte, dass die zweite Partition des Images die zweite Partition des Blockgeräts ersetzt. Mach dir keine Sorgen über den nachlaufend beschädigten freien Speicherplatz, ich werde GParted verwenden, um das zu bereinigen, und ich brauche es sowieso für etwas anderes.

JamesTheAwesomeDude
quelle
Geben Sie genau an, wo Ihre Partition geklont werden soll und wo sich Ihre Bilddateien befinden!
fromnaboo

Antworten:

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

Wenn --partscandies nicht funktioniert, können Sie auch Folgendes verwenden:

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

oder ähnliche Partitionszuordnungslösungen.

Sie sollten es wahrscheinlich zuerst montieren, um zu sehen, ob es das Richtige ist oder was.

Natürlich können Sie auch die fdisk-Ausgabe lesen und dddie skip=131072oder was auch immer direkt angeben, dh so viele Eingabeblöcke überspringen, dass an der Stelle, an der sich die Partition befindet, mit dem Lesen begonnen wird. Es ist jedoch schöner, tatsächliche Partitionen mit einem Loop-Gerät zu sehen.

Frostschutz
quelle
Ihr losetupBefehl hat nicht funktioniert - es wurde eine nicht erkannte Option angezeigt --find. Ich habe das entfernt, es hieß, es habe es nicht erkannt --show. Wenn --partscanich das abnahm, beschwerte ich mich darüber. Zu diesem Zeitpunkt wurde mir klar, dass der Befehl in absehbarer Zeit nichts für mich tun würde. Ich beschloss, die anderen zu versuchen, aber beide partxund kpartx"Befehl nicht gefunden" zurückzugeben.
JamesTheAwesomeDude
Ich würde einfach rennen dd if=2013-02-09-wheezy-raspbian.img of=/dev/sdc skip=122880, aber das kehrt zurück dd: ‘2013-02-09-wheezy-raspbian.img’: cannot skip: Invalid argument.
JamesTheAwesomeDude
1
skiphängt davon ab bs. Wenn Sie bs=1Malso einen Alias verwenden (oder einen Alias ​​haben, der dies tut), würde dies erklären, warum es nicht funktioniert. versuche es mit bs=512. Warum 122880, wenn fdisk 131072 sagt? Auch mein Losetup ist losetup from util-linux 2.22.2. Gleiches gilt für partx. kpartx stammt von Multipath-Tools (gebrauchter Device Mapper).
Frostschutz
kpartxist für LVM. partprobewird auch die Arbeit erledigen, aus dem getrennten Paket.
Psusi
@frostschutz Das waren 12280 Bytes vom Anfang der Bilddatei.
JamesTheAwesomeDude
0

So etwas sollte funktionieren:

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

if = legt das Bild fest, das Sie klonen möchten

of = legt die Zielpartition fest, auf der Sie das Image klonen möchten

fromnaboo
quelle
1
Ich habe den erwarteten Fehler erhalten:dd: opening ‘2013-02-09-wheezy-raspbian.img2’: No such file or directory
JamesTheAwesomeDude
Haben Sie /path/to/2013-02-09-wheezy-raspbian.img2 durch Ihren tatsächlichen Pfad zur Bilddatei ersetzt? : |
fromnaboo
1
**** facepalm **** Ja, ich habe gerade die 2 an das Ende angehängt, wie du gesagt hast .
JamesTheAwesomeDude
das funktioniert nicht, dd sieht keine Partitionen in einer
solchen
0
  1. Mounten Sie das Image als Loopback-Gerät: losetup -fP yourImage.img
  2. Sie können jetzt direkt auf jede Partition des Images zugreifen. Wenn Sie verwenden müssen dd, können Sie tun dd if=/dev/loop0p1 of=image.img, aber ich denke, dass Sie catbesser möchten . In einer Root-Shell einfach tun cat /dev/loop0p1 > image.img. In beiden Beispielen wird davon ausgegangen, dass Sie die erste Partition möchten und das Ihnen zugewiesene Loopback-Gerät war/dev/loop0
  3. Sobald Sie mit dem Loopback-Gerät fertig sind, können Sie es mit abnehmen losetup -d /dev/loop0. Dies setzt wiederum voraus, dass /dev/loop0es sich um Ihr Loopback-Gerät handelt.
John Leuenhagen
quelle
0

Du könntest es tun:

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
quelle
0

Damit können Sie nur die zweite Partition in ein separates Image kopieren

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

Danach können Sie es anstelle der Partition auf die Festplatte kopieren

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

oder Sie können es sogar in einem Befehl tun

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

Stellen Sie einfach sicher, dass Sie / dev / sdc2 aushängen, bevor Sie darauf schreiben.

Michal Artazov
quelle