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 su
Befehl“ 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
fdisk
Befehl (wahrscheinlich) als auch derbc
Befehl (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
chown
darauf 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/sdx
muss 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 dd
Befehl, wobei der Gerätename und der Dateiname entsprechend Ihren aktuellen Anforderungen eingestellt werden.
Die zweite Zeile setzt die Blockgröße auf dd
die 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/sdx
Daten über das Gerät meldengrep sector
'Sektor' erscheint zweimal in der Ausgabetail -1
Holen Sie sich nur die letzte Zeile mit 'Sektor'cut -d' ' -f6
Durch die Verwendung von Leerzeichen zwischen den Feldern wird nur das 6. Feld angezeigt (die Sektorgröße in Bytes).
Die dritte Zeile gibt an, dd
wie 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=progress
Option „“ dd
fü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 head
stattdessen 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.