Wie kann ich die Größe einer Bilddatei ändern, bevor ich auf die SD-Karte schreibe?

13

Ich habe versucht, ein neues Raspbian-Image mit einem anderen Kernel (mit CAN-Unterstützung) und mit installiertem Python 3.3 zu erstellen. Anstatt das alles auf dem Raspberry Pi zu machen, hielt ich es für interessant, es stattdessen auf dem Computer zu machen (befolge diese Anweisungen ). Sobald ich das Image jedoch bereitgestellt und einsatzbereit hatte, war der Speicherplatz schnell erschöpft. Ich gehe davon aus, dass das Bild nur so groß ist, dass der Benutzer die Größe des Dateisystems ändern kann, sobald es auf eine SD-Karte geschrieben wurde.

Ist es möglich, die Größe des Images und des Dateisystems zu ändern, bevor es auf die SD-Karte geschrieben wird, damit ich weitere Anpassungen vornehmen kann, ohne dass der Speicherplatz knapp wird?

DrAl
quelle
Diese Frage wird Ihnen wahrscheinlich helfen.
Jivings
1
@Jivings: In all diesen Antworten wird beschrieben, wie die Größe des Bildes geändert wird, nachdem es auf die SD-Karte geschrieben wurde. Ich weiß, wie das geht; Ich möchte wissen, wie ich die Größe des Bildes ändern kann, bevor ich es auf die SD-Karte schreibe.
DrAl

Antworten:

7

So ändern Sie die Größe einer Rohbilddatei. Ich weiß, es klingt dumm und simpel, aber es wird funktionieren.

Erstellen Sie ein leeres Bild in der Größe, in der Sie das Original vergrößern möchten (in meinem Beispiel verwende ich 5 GB).

dd if=/dev/zero of=/path/to/temp_image bs=1 count=1 seek=5G

Hänge dies an das Originalbild an:

cat /path/to/temp_image >> /path/to/rasperrypi.img

Ändern Sie die Größe des Dateisystems, das sich am Ende der Festplatte befindet (normalerweise ist dies dasjenige, das Sie vergrößern möchten):

resize2fs -f /path/to/rasperrypi.img

Erledigt! Ihre Festplatte sollte jetzt 5 GB größer sein!

Jivings
quelle
Das klingt perfekt, danke. Ich werde das heute Abend testen.
DrAl
5
Ich habe es gerade ausprobiert und wenn ich die resize2fs-Phase erreiche (nachdem ich der Datei 1 GB hinzugefügt habe), erhalte ich die Meldung "Bad Magic Number im Super-Block beim Versuch, die Datei 2012-12-16-wheezy-raspbian.img Couldn" zu öffnen. t find valid filesystem superblock. " Irgendwelche Vorschläge, was ich falsch mache?
DrAl
Für mich scheint es ein Problem zu sein, dass ich versuche, die Größe des gesamten Images (das Äquivalent von / dev / sda) anstelle der Partition (das Äquivalent von / dev / sda2) zu ändern. Ich könnte mich jedoch irren und habe ein paar andere Dinge erfolglos ausprobiert (z. B. die Größe der Partition mit fdisk zu ändern, was anscheinend funktioniert, mir aber nicht dabei hilft, die Größe des Dateisystems zu ändern).
DrAl
3
Okay, ich habe die Antwort auf das letzte Bit mit ein wenig googeln gefunden: Ich musste ein Loop-Gerät erstellen, das auf die Partition im Image zeigt. Ich habe dies getan, indem ich den fdisk -l file.imgStartsektor der zweiten Partition abgerufen habe (es war 122880) und dann losetup --offset $((122880 * 512)) /dev/loop0 file.img. Ich konnte dann verwenden resize2fsauf /dev/loop0und aufzuräumen mit losetup -d /dev/loop0. Wenn Sie Ihre Antwort so aktualisieren, dass sie diese enthält, werde ich sie als akzeptierte Antwort markieren. Vielen Dank, dass Sie mich in die richtige Richtung weisen.
DrAl
1
@DrAl Hey, ich habe deine Lösung mit resize2fson ausprobiert, habe /dev/loop0aber beim Booten eine Kernel-Panik bekommen, die besagt, dass die Superblock-Größe und die Partitionsgröße nicht übereinstimmen: The filesystem size (according to the superblock) is 483840 blocks The physical size of the device is 458240 blocksSind Sie auf so etwas gestoßen?
GuySoft
4

Dies ist eine Zusammenfassung der Antworten oben und an anderer Stelle, die für mich funktioniert haben - sichern Sie Ihr Image, falls Sie einen Fehler machen:

Vergrößern Sie zuerst die Bilddatei (hier fügen wir am Ende 1 GB hinzu):

truncate -s +1G ./image.img

Ordnen Sie als Nächstes das gesamte Image als Loop-Gerät zu, damit wir auf den Partitionstisch zugreifen können

sudo losetup /dev/loop0 ./image.img

Zum späteren Nachschlagen lassen Sie es sich entleeren:

sudo fdisk -l /dev/loop0

Die Ausgabe sieht folgendermaßen aus:

Disk /dev/loop0: 2962 MB, 2962227200 bytes
255 heads, 63 sectors/track, 360 cylinders, total 5785600 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
Disk identifier: 0x000c4661

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/loop0p2          122880     5785599     2831360   83  Linux

Jetzt erstellen wir die letzte Partition neu, indem wir sie löschen und dann am gleichen Startort, demselben Typ, aber an einem anderen Endort neu erstellen. Notieren Sie sich also die Spalte "Start" für loop0p2 (Partition 2 - die Linux-Partition) - wir werden sie später verwenden - hier 122880.

sudo fdisk /dev/loop0

Geben Sie Folgendes ein - sie sind sicher einzugeben - nichts Bleibendes passiert, bis Sie meine folgende Erklärung gelesen haben:

  1. p
  2. d
  3. 2
  4. n
  5. p
  6. 2
  7. 122880
  8. Drücken Sie einfach die Eingabetaste, um die Standardeinstellung zu akzeptieren
  9. p

Schritt 1 - Aktuelle Tabelle drucken. Schritte 2-3 - Partition 2 löschen, Schritte 4-8 - Partition 2 mit neuem Endpunkt neu erstellen (Standard ist Bildende), Schritt 9 - Neue Tabelle ausdrucken.

Angenommen, Ihre neu gedruckte Tabelle ist identisch mit der ursprünglichen Tabelle, mit Ausnahme des Endwerts und des Blockwerts (dh die Größe hat sich geändert), die Sie festschreiben möchten.

Geben Sie ein w, um die Änderung zu bestätigen, und geben Sie ein , um den Vorgang qzu beenden.

Sie können dieses Loopback-Gerät löschen, wir erstellen ein anderes für die zweite Partition. Merken Sie sich den Startoffset, den Sie oben notiert und verwendet haben - wir werden ihn wieder verwenden:

sudo losetup -d /dev/loop0     # delete the old loop setup
sudo losetup -o $((122880*512)) /dev/loop0 ./image.img

Dadurch wird eine neue Zuordnung erstellt, /dev/loop0wenn nur auf Partition 2 gezeigt wird. Die Referenz 512 ist die Sektorgröße, die Sie in der ersten fdiskAusgabe sehen können.

Verändern Sie nun die Größe der Partition, um den verfügbaren Platz zu füllen:

sudo e2fsck -f /dev/loop0
sudo resize2fs /dev/loop0

Fertig - jetzt aufräumen:

sudo losetup -d /dev/loop0
Greg
quelle
danke ... die obigen Anweisungen haben bei mir nicht funktioniert, aber das hat funktioniert. Beim Schreiben der Partitionstabelle wurde eine Warnung angezeigt: `` `Befehl (m für Hilfe): w Die Partitionstabelle wurde geändert. Aufruf von ioctl () zum erneuten Lesen der Partitionstabelle. Das erneute Lesen der Partitionstabelle ist fehlgeschlagen .: Ungültiges Argument Der Kernel verwendet weiterhin die alte Tabelle. Die neue Tabelle wird beim nächsten Neustart oder nach dem Ausführen von partprobe (8) oder kpartx (8) verwendet. `` `Ich habe es einfach ignoriert und das war in Ordnung.
StFS
Ausgezeichnet! Sie sind der Einzige, der die richtige Antwort gegeben hat! Vielen Dank.
Yushulx
3

Für diejenigen, auf denen Oracle VM VirtualBox ausgeführt wird, ist dies recht einfach.

Auf einem Windows-Computer laufen die Dinge wie folgt ab:

input.imgHier ist das Bild, dessen Größe reduziert werden soll, und output.imgdas endgültige Bild - in diesem Beispiel mit einer Größe von 7000 MB definiert.

ECHO "========================================================================="
ECHO "input.img => output.img"

ECHO "========================================================================="

DEL  input.vdi

DEL  output.vdi

DEL  output.img

ECHO "========================================================================="
"C:\Program Files\Oracle\VirtualBox\VBoxManage" convertfromraw input.img input.vdi -format VDI --variant Standard

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" createhd --filename output.vdi --size 7000 --format VDI --variant Standard

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" clonehd input.vdi output.vdi --existing

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" clonehd output.vdi output.img --format RAW

Hoffe das hilft ein bisschen.

Markus
quelle
Vielen Dank für diese Lösung, sehr schlau. Es ist das einzige, das ich finden konnte, das kostenlos ist und perfekt unter Windows funktioniert. Ich hatte einige Probleme mit 16-GB-Karten, die nicht ganz gleich groß waren und die Größe meines Bildes ändern mussten.
Josh
Ich habe einen Kernel-Panikfehler. Kernel panic - not syncing: VFS: Unable to mount rootfs on unknown-block(179,2)
JPX
Beachten Sie, dass dies das Bild abschneidet - Sie verlieren Daten, wenn die Marke von 7000 MB überschritten wird - die Befehle warnen oder beschweren sich nicht.
Mike Redrobe
2

So ändern Sie die Größe einer Rohbilddatei. Ich weiß, es klingt dumm und simpel, aber es wird funktionieren.

Erstellen Sie ein leeres Bild in der Größe, in der Sie das Original vergrößern möchten (in meinem Beispiel verwende ich 5 GB).

dd if=/dev/zero of=/path/to/temp_image bs=1 count=1 seek=5G

Hänge dies an das Originalbild an:

cat /path/to/temp_image >> /path/to/rpi.img

Als nächstes wird die Größe der Partition und des Dateisystems geändert. Holen Sie sich zunächst den Offset der Partition.

fdisk -l /path/to/rpi.img

Ergebnisse in einer Tabelle wie dieser:

Device    Boot   Start      End   Sectors   Size  Id  Type
rpi.img1          8192   122879    114688    56M   c  W95 FAT32 (LBA)
rpi.img2       1122880  8447999   8325120     4G  83  Linux

Beachten Sie den Startoffset der zweiten Partition

losetup --offset $((122880 * 512)) /dev/loop0 /path/to/rpi.img
e2fsck -f /dev/loop0
resize2fs -f /dev/loop0

Zuletzt hänge / dev / loop ab

losetup -d /dev/loop0

Erledigt! Ihre Festplatte sollte jetzt 5 GB größer sein!

Jonas Stumph Stevnsvig
quelle