.img -> USB


© April 2020, Letzte Änderung 22.03.22

Übersicht

USB-Installations-Medium erstellen

Booten von CD oder DVD ist recht unaktraktiv geworden,
da USB-Speichermedien sowohl größer alsauch schneller sind.
Daher beschreibe ich hier wie ich von einer Image-Datei
zu einem bootbaren Datenträger komme.

Durch fdisk -l wissen wir
dass der USB-Stick, hier
folgenden Namen hat.
/dev/sdb
Dieses Ziel wird dann
bei dd genutzt.

Zunächst muss ich mein Ziellaufwerk bestimmen.
Damit man nicht die eigene Platte überschreibt,
sollte man hier sehr sorgfältig vorgehen.

Anbei ein konkretes Beispiel:

Ein externer 8 GB USB-Stick ist eingesteckt...

su
fdisk -l

Disk /dev/nvme0n1: 465,8 GiB, 500107862016 bytes, 976773168 sectors
...
Device         Boot     Start       End   Sectors   Size Id Type
/dev/nvme0n1p1 *         2048  58593279  58591232    28G 83 Linux
/dev/nvme0n1p2      117188606 976771071 859582466 409,9G  5 Extended
/dev/nvme0n1p3       58593280 117186559  58593280    28G 83 Linux
/dev/nvme0n1p5      117188608 148436991  31248384  14,9G 82 Linux swap / Solaris
/dev/nvme0n1p6      148439040 976771071 828332032   395G 83 Linux

Disk /dev/sda: 2,7 TiB, 3000592982016 bytes, 5860533168 sectors
...
Device        Start        End    Sectors  Size Type
/dev/sda1      2048   31999999   31997952 15,3G EFI System
/dev/sda3  32000000   39999487    7999488  3,8G Linux swap
/dev/sda4  39999488 5860532223 5820532736  2,7T Microsoft basic data

Disk /dev/sdb: 7,9 GiB, 8472494080 bytes, 16547840 sectors
...
Device     Boot Start     End Sectors  Size Id Type
/dev/sdb1  *        0 5559679 5559680  2,7G  0 Empty
/dev/sdb2        1540    7427    5888  2,9M ef EFI (FAT-12/16/32)

Hier nun der gefährliche Arbeitsschritt:
Hier lese ich aus der Datei debian-live-10.9.0-amd64-xfce+nonfree.iso
und schreibe es entsprechend dem Ergebnis von fdisk
auf den Datenträger /dev/sdb
Mein Ziel, wo dann alle Daten unwiederbringlich überschrieben werden.

su
dd if=debian-live-10.9.0-amd64-xfce+nonfree.iso of=/dev/sdb bs=4096
722868+0 Datensätze ein
722868+0 Datensätze aus                                bs=512      bs=4096
2960867328 Bytes (3,0 GB, 2,8 GiB) kopiert, 1388,83 s, 2,0 MB/s -> 3,4 MB/s

sync

Bei DEB 10 ist der alte Befehl fdisk in /sbin/fdisk verschoben worden…
Sollte sich das Installationsmedium an anderer Stelle befinden,
ist noch der Pfad mit anzugeben.

Somit ist, wenn auch langsam, ein Installationsmedium erstellt worden,
welches nun auf der neuen Hardware eingesetzt werden kann.

Je nach Hardware (z.B. NAND-Flash kann in 4096 Bytes Blöcken organisiert sein),
kann man die Blockgrösse von bs=512 auf z.B. bs=4K vergrößern,
was die Übertragungszeit verbessert und den Speicherstick
weniger Schreibzyklen zumutet.

Mittlerweile würde ich sogar eher bs=16K empfehlen,
wo ich mit einer SDHC-Card, nur class 6 (Sandisk Extreme III),
und einem USB3.0 Adapter (Transcend TS-RDF9K),
entgegen der Erwartungshaltung, 107 MB/s hinbekommen habe.

su
dd if=debian-live-11.2.0-amd64-xfce+nonfree.iso of=/dev/sdc bs=16384
196860+0 records in
196860+0 records out
3225354240 bytes (3.2 GB, 3.0 GiB) copied, 30.1907 s, 107 MB/s

sync

Da dabei Müll raus kam, habe ich alles mit einen USB2.0 Reader
DeLock 91443 mit lediglich 9,6 MB/s wiederholen müssen.

Zum Anfang

Datenträger-Überprüfung

Die Dateigrösse des Images, kann ich entweder über   ls -la   sehen
oder nach dem Schreiben mittels dd.

Lese ich Byteweise, wird die ganze Angelegenheit kriechend langsam.
Versuche ich alles in einen Stück einzulesen,
passt es unter Umständen nicht ins lokale RAM.
Also wähle ich einen Kompromiß, aus möglichst großen,
noch handhabbaren Blöcken.

1. Beispiel

Um die Anzahl der z.B. 4k-Blöcke zu bestimmen, teile ich die Bytes durch die Blockgrösse.
In diesem konkreten Fall   2.960.867.328 / 4096 = 722.868

Sollte ein Bruch herauskommen, wähle ich die Blockgröße entsprechend kleiner.

Die Berechnung ist auch erforderlich, da das Image meist kleiner ist (oder max. gleich Groß ist),
als der zur Verfügung stehende Platz auf dem Datenträger.
Denn die Checksumme darf nur über den Bereich bestimmt werden, welcher auch beschrieben wurde.

sha256sum debian-live-10.9.0-amd64-xfce+nonfree.iso > check.txt
dd if=/dev/sdb bs=4096 count=722868 | sha256sum >> check.txt
722868+0 records in
722868+0 records out
2960867328 bytes (3.0 GB, 2.8 GiB) copied, 247.863 s, 11.9 MB/s

cat check.txt
24d7efb2972e86f864175eba604c745a5766044cfe9567c29d207b759f8d4219  debian…
24d7efb2972e86f864175eba604c745a5766044cfe9567c29d207b759f8d4219  -

Glücklicherweise kommt zwei Mal die selbe Checksumme heraus.

2. Beispiel

Im 2. Beispiel hat das Image eine andere Größe und es wurde auch eine andere Blockgröße gewählt.
Bei 3.225.354.240 Bytes à 16k Blöcke, komme ich auf 196.860 Blöcke

In den meisten Fällen wirkt sich eine große Blockgröße positiv auf die Lesegeschwindigkeit aus.
Das muß aber nicht zwangsläufig so sein.
Bei einer class 10 4 GB SanDisk Extreme SD-Card erreichte ich mit
4k Blöcken 89 MB/s   und mit 16k Blöcken 21 MB/s.

dd if=/dev/sdb bs=16k count=196860 | sha256sum >> check.txt 
196860+0 records in
196860+0 records out
3225354240 bytes (3.2 GB, 3.0 GiB) copied, 151.562 s, 21.3 MB/s

Sollten in der Quelle/Webseite andere Checksummen erforderlich sein,
kann ich natürlich auch andere Befehle zur Überprüfung verwenden.

Zum Anfang

Quellen

laptop.org   how to damage a Flash device

Zum Anfang