Wie erhält man ein Image einer SD-Karte, das nur die eigentlichen Partitionen enthält, nicht aber den leeren Speicherplatz dahinter?

Wie erhält man ein Image einer SD-Karte, das nur die eigentlichen Partitionen enthält, nicht aber den leeren Speicherplatz dahinter?

Ich habe eine 16 GB große SD-Karte (genauer gesagt eine bootfähige Mobian-SD-Karte für ein PinePhone) mit zwei Partitionen, insgesamt 6 GB. Der verbleibende Speicherplatz ist nicht zugeordnet. Wie kann ich ein 6 GB großes Image der SD-Karte erhalten?

Antwort1

Mit einem etwas instabilen Befehl ist es möglich, den ersten Abschnitt eines Laufwerks wie gewünscht in eine Image-Datei zu kopieren. Dabei sind jedoch einige Dinge zu beachten:

  • Da ein direkter Zugriff auf die Gerätedateien von der Befehlszeile aus erforderlich ist, muss der gesamte Befehl wie folgt ausgeführt werden root(also „ sudo suBefehl“ vor Verwendung der Lösung).
  • Die Backup-Partitionstabelle, wenn es sich um eine GPT-Partitionstabelle handelt,WilleNICHTkopiert werden.
  • Der "Trick" hängt davon ab, dass die Partitionstabelle vollständig ist - der erwähnte nicht zugeordnete Speicherplatzwirklich istnicht zugeordnet, nicht irgendeine Partition, die Sie einfach nicht kopieren möchten.
  • Die Partition bzw. Partitionen werden vorne gesammelt. Wenn sie eine Lücke aufweisen, wird diese Lücke kopiert.
  • Dies hängt davon ab, ob auf Ihrem System sowohl der fdiskBefehl (wahrscheinlich) als auch der bcBefehl (möglich) installiert sind. Beide sind Standard und können bei Bedarf aus Ihrem Standard-Repository installiert werden.
  • Eigentümer der Image-Datei ist Root. Sie müssen also chowndarauf zugreifen, wenn der Benutzer vollen Zugriff haben soll.

Hier ist der vollständige Befehl, in Zeilen unterteilt, um das Lesen zu erleichtern

dd if=/dev/sdx of=Mobian.img\
    bs="$(fdisk -l /dev/sdx | grep sectors | tail -1 | cut -d' ' -f6)"\
    count="$(echo "$(fdisk -o end -l /dev/sdx | tail -1) + 1"|bc)"\
    status=progress

Die Panne:

Zunächst /dev/sdxmuss es geändert werden, um den richtigen Gerätenamen anzuzeigen, es sei denn, Sie haben zufällig 23 andere, zuvor angeschlossene Festplatten.

Die erste Zeile ist der erwartete ddBefehl, wobei der Gerätename und der Dateiname entsprechend Ihren aktuellen Anforderungen eingestellt werden.

Die zweite Zeile setzt die Blockgröße auf dddie Sektorgröße der SD-Karte. Sie beträgt mit ziemlicher Sicherheit 512 Byte. Wenn Sie 100 % sicher sind, dass es 512 sind, können Sie die Zeile durch ersetzen bs=512. Wenn Sie auf Nummer sicher gehen und den Befehl in Zukunft auf jedem Gerät verwendbar halten möchten, lassen Sie die zusätzlichen Angaben dort. Die Operation ist:

  • fdisk -l /dev/sdxDaten über das Gerät melden
  • grep sector'Sektor' erscheint zweimal in der Ausgabe
  • tail -1Holen Sie sich nur die letzte Zeile mit 'Sektor'
  • cut -d' ' -f6Durch die Verwendung von Leerzeichen zwischen den Feldern wird nur das 6. Feld angezeigt (die Sektorgröße in Bytes).

Die dritte Zeile gibt an, ddwie viele „Blöcke“ bs=kopiert werden sollen. Wenn Sie diese Zahl genau kennen, verwenden Sie sie anstelle des Befehls. Aus Gründen der Zukunftssicherheit habe ich den vollständigen Befehl beibehalten:

- `fdisk -o end -l /dev/sdx` list the partition information about the device, and only output the ending sector ID of each `-o end`
- `tail -1` it don't matter how many there are, we only need the last sector of the last partion.
- `echo "... + 1" | bc` add one to the last sector ID. Uses the `bc` command, which is in integers unless told otherwise. Sectors are numbered from zero, to to copy sector #10 we have to copy 10 + 1 sectors (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

Die vierte Zeile dient dem Unterhaltungswert. Eine gute Karte der Geschwindigkeitsklasse 10 wird fast 4 Minuten brauchen, um 6 GB Daten zu lesen. Die status=progressOption „“ ddführt zu Updates am Terminal, während es „Fortschritte“ macht. Andernfalls wartet das Terminal einfach auf die Ausführung des Befehls, was sich wie eine Ewigkeit anfühlt.

Abschließend: Wenn Sie sicher sind, dass das, was Sie kopieren, dem Standard entspricht, mit richtig ausgerichteten Partitionen und genau 6 GiB, können Sie den folgenden einfachen Befehl verwenden:

dd if=/dev/sdx of=Mobian.img bs=1048576 count=6145 status=progress

Sobald ein neues Bild erstellt wurde und Sie zu diesem wechseln, ist die Kurzversion natürlich hinfällig. Das Original oben funktioniert weiterhin. Es funktioniert auch für andere „Bilder“, die Sie später möglicherweise kopieren müssen.

Bonus:

Wenn es Ihnen aus irgendeinem Grund nicht gefällt dd, können Sie dieselben Schritte zum Sammeln von Zahlen verwenden und headstattdessen den folgenden Befehl anwenden:

head -c $(\echo "\
    "$(fdisk -l /dev/sdx | grep sectors | tail -1 | cut -d' ' -f6)" *\
    ("$(fdisk -o end -l /dev/sdx | tail -1)" + 1)" | bc)\
    /dev/sdx > Mobian.img

Als Einzeiler:

head -c $(\echo " "$(fdisk -l /dev/sdx | grep sectors | tail -1 | cut -d' ' -f6)" * ("$(fdisk -o end -l /dev/sdx | tail -1)" + 1)" | bc) /dev/sdx > Mobian.img'

Antwort2

Sie können den Linux-Befehl dd verwenden. Sie haben die Wahl, beide Partitionen einzeln auszulesen und sie anschließend zu verketten oder einige Berechnungen durchzuführen, um den letzten Sektor der zweiten Partition zu bestimmen. Sie würden dann den Befehl dd mit den Parametern bs (Blockgröße) und count (Anzahl der Blöcke) ausführen, damit der Kopiervorgang am Ende der zweiten Partition endet.

verwandte Informationen