dd über ssh ausführen und übertragen

Wenn man ein Dump eines kompletten Datenträgers auf einem Serversystems bekommen möchte kann es sinnvoll sein dies über ssh auszuführen – also das output-File wird auf einem völlig anderen Rechner gespeichert. dd hat im einfachsten Fall den folgenden recht ungewöhnlichen Syntax:

dd if=<Inputfile> of=<Outputfile>

Dabei kann, getreu dem Unix-Motto „Alles ist eine Datei”, das Inputfile sowohl eine reguläre Datei als auch eine Gerätedatei sein. Ein Dump von sda1 nach ~/dumpfile kann also mit der Ausführung als:

dd if=/dev/sda1 of=~/dumpfile

erreicht werden. Man kann dd auch noch den Parameter bc für Blocksize mitgeben, was die Ausführungsgeschwindigkeit erhöht:

dd bs=2048 if=/dev/sda1 of=~/dumpfile

Leider bringt dd keine Fortschrittsanzeige mit aber dies kann man durch die Verwendung des kleinen Befehls pv ergänzen. Dadurch wird nur der Syntax etwas komplexer:

dd bs=2048 if=/dev/sda1 | pv | dd of=~/dumpfile

das führt zur Ausgabe als:

1998585856 Bytes (2,0 GB, 1,9 GiB) kopiert, 40,8024 s, 49,0 MB/s
1,86GiB 0:00:48 [39,1MiB/s] [                            <=>                                   ]                                                      
3903488+0 Datensätze ein
3903488+0 Datensätze aus
1998585856 Bytes (2,0 GB, 1,9 GiB) kopiert, 48,8825 s, 40,9 MB/s

Wobei die Zeile mit dem <=> eine während der Laufzeit von dd eine Art Fortschrittsanzeige ist die Seitwärts wandert und die drei unteren Zeilen eine Standardausgabe von dd ist.

dd ist eine prima Möglichkeit um einen kompletten Datenträger zu übertragen. Folgendes Szenario wäre z.B. denkbar: Eine SSD in einem Heimserver wird zu klein und soll durch eine größere SSD ersetzt werden.  Die Lösung wäre man macht über Netzwerk bzw. über ssh ein Dump auf die neue SSD, vergrößert die so erhaltene Partition um den erhaltenen freien Bereich und tauscht die SSD des Servers aus. Zum umpartitionieren darf die SSD natürlich nicht gemountet sein. Daher ist es unklug zu zuallererst die Datenträger zu tauschen sondern man macht das besser auf einem separaten Rechner mit den üblichen Partitionierungsprogrammen die man mit GUI-Unterstützung oft auf einer Serverinstallation mangels XWindow-System überhaupt nicht zur Verfügung hat.

Für dieses Szenario braucht man eine ssh-Variante für dd und das erreicht man einfach durch:

ssh root@server-IP "dd bs=2048 if=/dev/sda1" | pv | dd of=~/dumpfile

Man kann nun noch da pipen überteiben und das Dump noch per gzip komprimieren, komprimiert übertragen und mit gunzip wieder entpacken:

ssh root|server-IP "dd bs=2048 if=/dev/sda1 | gzip" | gunzip | pv | dd of=~/dumpfile
kais-universum.de