Dd: Unterschied zwischen den Versionen

Aus Alexander's Wiki
 
(12 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
Mit dd lassen sich Images erstellen oder schreiben. Die Syntax sieht beispielsweise so aus:
 
= Image erstellen =
Mit dd lassen sich Images erstellen oder schreiben. Die Syntax sieht wie folgt aus:
<source lang="bash">
  sudo dd if=/dev/mmcblk0 of=olimex-noworking.img
</source>
Dabei wird vom Gerät ''mmcblk0'' (eine SD-Karte) ein Image im selben Verzeichnis mit Namen ''olimex-noworking.img'' erzeugt.
 
Das geht z.B. auch von einer bootfähigen CD:
<source lang="bash">
dd if=/dev/dvd of=~/Mein_erzeugtes_ISO.iso
</source>
 
== Den Prozess überwachen (neu, ab 8.24) ==
<source lang="bash">
  dd if=A20_debian_3.4.103-Jessie_release_11_uptodate.img of=/dev/sdc bs=32M status=progress
</source>
 
== Den Prozess überwachen (früher) ==
Das Image Erstellen dauert eine ganze Weile und es gibt keine Rückmeldung. Wenn man sich den Fortschritt anzeigen lassen möchhte, geht das folgendermaßen:
 
* Nach der ProzessID von dd suchen:
<source lang="bash">
<source lang="bash">
  sudo dd if=/dev/mmcblk0 of=olimex-noworking.img
ps -ef | grep dd
</source>
</source>


Nach der ProzessID von dd suchen:
Das sieht dann in etwa so aus:
<source lang="bash">
<source lang="bash">
  ps -ef | grep dd
root    24502 23885  0 10:20 pts/1    00:00:00 sudo dd if=a20_release5.img of=/dev/mmcblk0
root    24503 24502  8 10:20 pts/1    00:00:05 dd if=a20_release5.img of=/dev/mmcblk0
kluge    24511 24142  0 10:21 pts/4    00:00:00 grep --color=auto dd
</source>
</source>


In einer weiteren Shell den Befehl mit der ProzessID aufrufen:
* In einer weiteren Shell den Befehl mit der ProzessID aufrufen:
<source lang="bash">
<source lang="bash">
  while true; do sudo kill -USR1 16582; sleep 30; done
while true; do sudo kill -USR1 24502; sleep 30; done
</source>
</source>


Jetzt gibt dd alle 30 Sekunden eine Meldung aus, die z.B. so aussehen kann:
In diesem Beispiel gibt ''dd'' alle 30 Sekunden eine Meldung aus, die z.B. so aussehen kann:


<source lang="bash">
<source lang="bash">
Zeile 27: Zeile 50:
3029565952 Bytes (3,0 GB) kopiert, 553,939 s, 5,5 MB/s
3029565952 Bytes (3,0 GB) kopiert, 553,939 s, 5,5 MB/s
</source>
</source>
=== Kurzversion ===
<source lang="bash">
sudo dd if=A20_debian_3.4.103-Jessie_release_11_uptodate.img of=/dev/sdc bs=32M & ddpid=$! ; while [ $(ps -ao pid | grep $ddpid) ]; do kill -SIGUSR1 $ddpid; sleep 10; done
</source>
== Teil-Images ==
Nun kann es vorkommen, dass man ein Image von etwas erzeugen möchte, was noch viel freien Platz ausweist. Diesen braucht man natürlich nicht in das Image übernehmen. Daher mit ''fdisk'' die Partitionen abfragen:
<source lang="bash">
> fdisk -l /dev/mmcblk0
Platte /dev/mmcblk0: 7948 MByte, 7948206080 Byte
4 Köpfe, 16 Sektoren/Spur, 242560 Zylinder, zusammen 15523840 Sektoren
Einheiten = Sektoren von 1 × 512 = 512 Bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Festplattenidentifikation: 0x6f20736b
        Gerät  boot.    Anfang        Ende    Blöcke  Id  System
/dev/mmcblk0p1            2048      34815      16384  83  Linux
/dev/mmcblk0p2          34816    7774207    3869696  83  Linux
</source>
Das Ende der zweiten Partition liegt in diesem Fall bei 7774207. Daraus folgt der folgende Befehl zum Erstellen des komprimierten Images. Bei count musst die Anzahl der zu kopierenden Blöcke angeben werden. Diese berechnet sich aus "Ende der zweiten Partition + 1 = 7774208". Die Blocksize (bs) findet man ebenfalls in der Ausgabe von fdisk (hier 512 Bytes).
<source lang="bash">
sudo dd if=/dev/mmcblk0 bs=512 count=7774208 | gzip > raspberry.dump.gz
</source>
Wiederherstellen dieses Images geht schnell mit dem Befehl:
<source lang="bash">
gzip -dc raspberry.dump.gz | sudo dd of=/dev/mmcblk0
</source>
== ZIP-Datei des Images verkleinern ==
Das Image ist ein exaktes Abbild der Quelle und enthält u.U. auch Datenmüll. Datenmüll heißt hier, sich zufällig wechselnde Bits im leeren ''Datenbereich'', den ein Komprimierungsprogramm kodieren muss. Daher ist es sinnvoll den leeren Bereich auf '''einen''' gemeinsamen Wert zu setzen. Das geschieht so:
* Auf einem anderen Linux-System den Datenträger mounten:
<source lang="bash">
mount /dev/mmcblk0p2 /mnt
</source>
* Eine Datei mit lauter Nullen erzeugen
<source lang="bash">
dd if=/dev/zero of=/mnt/zero.file
</source>
* Die Datei wieder löschen und den Datenträger aushängen
<source lang="bash">
rm -f /mnt/zero.file
umount /mnt/
</source>
Jetzt kann man das Image mit den obigen Befehlen erzeugen oder z.B. unter Windows mit dem [http://sourceforge.net/projects/win32diskimager/ Win32 Disk Imager] weiterarbeiten. Danach kann man das Image packen.

Aktuelle Version vom 29. September 2017, 08:25 Uhr

Image erstellen

Mit dd lassen sich Images erstellen oder schreiben. Die Syntax sieht wie folgt aus:

  sudo dd if=/dev/mmcblk0 of=olimex-noworking.img

Dabei wird vom Gerät mmcblk0 (eine SD-Karte) ein Image im selben Verzeichnis mit Namen olimex-noworking.img erzeugt.

Das geht z.B. auch von einer bootfähigen CD:

dd if=/dev/dvd of=~/Mein_erzeugtes_ISO.iso

Den Prozess überwachen (neu, ab 8.24)

  dd if=A20_debian_3.4.103-Jessie_release_11_uptodate.img of=/dev/sdc bs=32M status=progress

Den Prozess überwachen (früher)

Das Image Erstellen dauert eine ganze Weile und es gibt keine Rückmeldung. Wenn man sich den Fortschritt anzeigen lassen möchhte, geht das folgendermaßen:

  • Nach der ProzessID von dd suchen:
ps -ef | grep dd

Das sieht dann in etwa so aus:

root     24502 23885  0 10:20 pts/1    00:00:00 sudo dd if=a20_release5.img of=/dev/mmcblk0
root     24503 24502  8 10:20 pts/1    00:00:05 dd if=a20_release5.img of=/dev/mmcblk0
kluge    24511 24142  0 10:21 pts/4    00:00:00 grep --color=auto dd
  • In einer weiteren Shell den Befehl mit der ProzessID aufrufen:
while true; do sudo kill -USR1 24502; sleep 30; done

In diesem Beispiel gibt dd alle 30 Sekunden eine Meldung aus, die z.B. so aussehen kann:

5314678+0 Datensätze ein
5314678+0 Datensätze aus
2721115136 Bytes (2,7 GB) kopiert, 493,896 s, 5,5 MB/s
5637466+0 Datensätze ein
5637466+0 Datensätze aus
2886382592 Bytes (2,9 GB) kopiert, 523,922 s, 5,5 MB/s
5917121+0 Datensätze ein
5917121+0 Datensätze aus
3029565952 Bytes (3,0 GB) kopiert, 553,939 s, 5,5 MB/s

Kurzversion

sudo dd if=A20_debian_3.4.103-Jessie_release_11_uptodate.img of=/dev/sdc bs=32M & ddpid=$! ; while [ $(ps -ao pid | grep $ddpid) ]; do kill -SIGUSR1 $ddpid; sleep 10; done

Teil-Images

Nun kann es vorkommen, dass man ein Image von etwas erzeugen möchte, was noch viel freien Platz ausweist. Diesen braucht man natürlich nicht in das Image übernehmen. Daher mit fdisk die Partitionen abfragen:

> fdisk -l /dev/mmcblk0

Platte /dev/mmcblk0: 7948 MByte, 7948206080 Byte
4 Köpfe, 16 Sektoren/Spur, 242560 Zylinder, zusammen 15523840 Sektoren
Einheiten = Sektoren von 1 × 512 = 512 Bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Festplattenidentifikation: 0x6f20736b

        Gerät  boot.     Anfang        Ende     Blöcke   Id  System
/dev/mmcblk0p1            2048       34815       16384   83  Linux
/dev/mmcblk0p2           34816     7774207     3869696   83  Linux

Das Ende der zweiten Partition liegt in diesem Fall bei 7774207. Daraus folgt der folgende Befehl zum Erstellen des komprimierten Images. Bei count musst die Anzahl der zu kopierenden Blöcke angeben werden. Diese berechnet sich aus "Ende der zweiten Partition + 1 = 7774208". Die Blocksize (bs) findet man ebenfalls in der Ausgabe von fdisk (hier 512 Bytes).

sudo dd if=/dev/mmcblk0 bs=512 count=7774208 | gzip > raspberry.dump.gz

Wiederherstellen dieses Images geht schnell mit dem Befehl:

gzip -dc raspberry.dump.gz | sudo dd of=/dev/mmcblk0


ZIP-Datei des Images verkleinern

Das Image ist ein exaktes Abbild der Quelle und enthält u.U. auch Datenmüll. Datenmüll heißt hier, sich zufällig wechselnde Bits im leeren Datenbereich, den ein Komprimierungsprogramm kodieren muss. Daher ist es sinnvoll den leeren Bereich auf einen gemeinsamen Wert zu setzen. Das geschieht so:

  • Auf einem anderen Linux-System den Datenträger mounten:
mount /dev/mmcblk0p2 /mnt
  • Eine Datei mit lauter Nullen erzeugen
dd if=/dev/zero of=/mnt/zero.file
  • Die Datei wieder löschen und den Datenträger aushängen
rm -f /mnt/zero.file
umount /mnt/

Jetzt kann man das Image mit den obigen Befehlen erzeugen oder z.B. unter Windows mit dem Win32 Disk Imager weiterarbeiten. Danach kann man das Image packen.