Kann ich mit dd eine größere SD-Karte auf eine kleinere SD-Karte klonen, wenn die tatsächlichen Partitionen passen?

9

Ich habe eine 16-GB-SD-Karte mit einigen Partitionen (eigentlich die Karte für einen Raspberry Pi). Ich habe mehrere andere 4-GB-Karten, auf die ich die primäre Karte klonen möchte. Die 3 Partitionen auf der Hauptkarte sind:

  • Raspel-Boot-Partition, FAT, 60 MB
  • Linux-Partition, ext2, 1 GB
  • Zusätzliche "Speicher" -Partition, FAT, 1 GB

Wenn ich ddein Bild der Karte über Folgendes erstelle:

dd if=/dev/sdb of=~/sd-card.bin

dann ist der resultierende .bin 16 GB groß. Gibt es eine Möglichkeit, ddnur das zu kopieren, was tatsächlich verwendet wird, dh <4 GB, damit ich dies dann ddauf eine neue 4 GB-Karte übertragen kann? Oder gibt es eine bessere Lösung, die ich verwenden sollte?

Charlie Schliesser
quelle
Am Ende habe ich den genauen Inhalt auf einer neuen 4-GB-Karte erstellt und diesen mit ddeiner Menge anderer Karten geklont. Trotzdem würde ich gerne wissen, ob es möglich ist, das ursprüngliche Problem zu lösen.

Antworten:

9

Ich gehe davon aus, dass Sie einen PC-Linux- oder Mac-Computer verwenden, um die Kopie durchzuführen, nicht den Himbeer-Pi selbst. Sie müssen wahrscheinlich eine Blockgröße hinzufügen.

Ich habe ein und vier Megabyte gesehen, die für Himbeer-Pi-Festplatten verwendet wurden, indem bs = 1M oder bs = 4M angegeben wurden. Ich denke, die Blockgröße ist beim Schreiben der Festplatte wichtiger, da große Übertragungen schneller sind als kleinere. Dadurch wird nicht die Blockgröße für die Festplatte festgelegt, sondern nur die Größe der von dd verwendeten Übertragungen. Ein Grund für die Einstellung einer großen Blockgröße ist die Notwendigkeit, den Flash vor dem Schreiben zu löschen. Dies erfolgt automatisch, jedoch schneller bei Übertragungen, die größer als die minimale Löschgröße sind.

Sie können die Gesamtmenge der von dd kopierten Daten mit "count" begrenzen. "count" ist in Einheiten von Blöcken. Wenn das Ende der letzten Partition auf der Quellfestplatte vor der Größe des Ziels liegt, können Sie tun, was Sie wollen.

So etwas dd if=/dev/sdb of=~/sd-card.bin bs=1M count=4000erzeugt ein Bild mit einer Größe von 4000 MB.

Weitere Informationen finden Sie unter http://en.wikipedia.org/wiki/Dd_(Unix) und http://elinux.org/RPi_Easy_SD_Card_Setup . Ich bin mir nicht sicher, wie ich das Ende der letzten Partition oder die Gesamtgröße der Karten finden soll. Wenn Sie die Datenträger jedoch formatiert haben, wissen Sie wahrscheinlich, wie das geht.

William J Bagshaw
quelle
Danke für die Information. Die Zähloption war mir nicht bekannt. Ich werde es versuchen.
@charlie Es wäre faszinierend, wenn Sie es mit und ohne die Option count versuchen und zurückmelden könnten. Stellen Sie jedoch sicher, dass Sie überprüfen, wie die Größe der Festplatte gemeldet wird und ob Sie Dateien hinzufügen können und ob sich die Größe ändert. Denn wenn dd bei Festplatten unterschiedlicher Größe ausfällt, treten solche Probleme auf. Hier ist ein Beispiel, in dem ich dd mit zwei unterschiedlich großen Laufwerken durcheinander gebracht habe. superuser.com/questions/538583/difficulty-resizing-a-partition Am Ende habe ich dd nicht verwendet, um den Klon zu erstellen.
Barlop
3

Wenn man Williams Antwort erweitert , könnte man das Ende der letzten Partition mit fdiskeinem Taschenrechner berechnen:

$ fdisk -l /dev/mmcblk0

Disk /dev/mmcblk0: 7.4 GiB, 7948206080 bytes, 15523840 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00057540

Device         Boot  Start     End Sectors  Size Id Type
/dev/mmcblk0p1        2048  186367  184320   90M  c W95 FAT32 (LBA)
/dev/mmcblk0p2      186368 3667967 3481600  1.7G  5 Extended
/dev/mmcblk0p5      188416 3667967 3479552  1.7G 83 Linux

Insgesamt genutzter Speicherplatz in Bytes = Endsektor der letzten Partition X Sektorgröße (hier 3667967 x 512).

Insgesamt genutzter Speicherplatz in GB = insgesamt genutzter Speicherplatz in Bytes / 1024 3 (hier sind das 1,749023 GB).

Normalerweise ist es nicht wichtig, ein Bild zu erstellen, das auf das letzte nützliche Datenbit reduziert ist. Im obigen Beispiel würde ich ein Bild von 2 GB mit der von William in derselben früheren Antwort beschriebenen Methode erstellen :

dd if=/dev/mmcblk0 of=/path/to/pi_updated.img bs=1M count=2048

Am Ende des Bildes befindet sich ein kleiner Teil des nutzlosen Guffs nach Ihren letzten nützlichen Daten. Dies unterscheidet sich jedoch im Prinzip nicht von dem nutzlosen Guff, der überschrieben wird, wenn Sie das Bild wieder auf Ihr Medium schreiben.

Diese Methode hat bei ungefähr einem Dutzend Klonen für mich funktioniert. Wenn diese Methode schwerwiegende Mängel aufweist, sind sie noch nicht aufgetaucht.

Crumeniferus
quelle