Nachfolgend wird ein bewährtes Verfahren beschrieben, um ein Linux-System mithilfe von dd über eine SSH-Verbindung auf ein anderes System zu übertragen. Dieser Ansatz eignet sich insbesondere für Systeme, bei denen die vollständige Festplattenstruktur einschließlich Partitionstabelle, Bootloader, Dateisystemen, LVM, verschlüsselten Containern oder anderen nicht trivialen Konfigurationen unverändert übernommen werden soll. Da die Übertragung auf Blockebene erfolgt, wird keine Dateisysteminterpretation benötigt. Die Methode stellt daher eine zuverlässige und originalgetreue 1:1-Kopie sicher und bietet ein hohes Maß an Reproduzierbarkeit, beispielsweise für Backup-, Migrations- oder Notfallwiederherstellungszwecke.
Beide Systeme werden dabei in einem Live-Betrieb betrieben, sodass die zu klonenden Datenträger während des Vorgangs nicht eingebunden sind und keine Dateizugriffe stattfinden, die das Ergebnis beeinflussen könnten.
1. Vorbereitung des Quellsystems
- Start über ein Live-Linux: Das Quellsystem wird über ein Live-Linux wie Debian Live, Ubuntu Live oder SystemRescue gebootet.
- Terminal starten: Ein Terminalfenster wird geöffnet.
- Ermittlung der Quellfestplatte:
1 | lsblk |
Beispielausgabe:
1 2 3 4 | sda 500G ├─sda1 512M ├─sda2 4G └─sda3 495G |
In diesem Beispiel stellt /dev/sda das gesamte Quelllaufwerk dar.
- Installation des Werkzeugs pv, falls nicht vorhanden
1 | sudo apt update && sudo apt install pv |
2. Vorbereitung des Zielsystems
Das Zielsystem wird ebenfalls über ein Live-Linux gestartet. Um die Daten auf dem Zielsystem direkt über SSH auf das Blockdevice des Zielsystems schreiben zu können, wird ein aktiver root Account und das Paket openssh-server auf dem Zielsystem benötigt.
- Setzen eines Root-Passworts
1 | sudo passwd root |
- Installation des SSH-Servers und SSH root Login erlauben
1 2 3 | sudo apt update && apt install openssh-server -y sudo sed -i 's/^PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config sudo systemctl restart sshd |
- Ermittlung der IP-Adresse
1 | ip a |
Beispiel:
1 | 192.168.1.150 |
- Identifikation des Zielmediums
1 | lsblk |
Beispiel:
1 | nvme0n1 |
3. Übernahme des SSH-Host-Keys auf dem Quellsystem (optional)
1 | sudo ssh-keyscan 192.168.1.150 >> ~/.ssh/known_hosts |
4. Klonvorgang mit dd, SSH und pv
Auf dem Quellsystem ausführen (Blockdevicepfade anpassen):
1 2 3 4 5 6 7 | DISK="/dev/sda" DISKSIZE=$(blockdev --getsize64 "$DISK") sudo dd if="$DISK" bs=128M status=none \ | pv -s "$DISKSIZE" -tpreb \ | ssh -c aes128-gcm@openssh.com root@192.168.1.20 \ "dd of=/dev/nvme0n1 bs=128M status=progress oflag=direct" |
Dieser Befehl überträgt das Quelllaufwerk vollständig inklusive Partitionstabelle, Bootloader und allen Daten sektorweise auf das Zielmedium.
Skript mit Parameterabfrage:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #!/bin/bash # Installiere pv und Tools apt install pv util-linux -y # Verfügbare Disks anzeigen echo "Verfügbare Disks auf diesem System:" lsblk -d -o NAME,SIZE,MODEL # Quellfestplatte abfragen read -rp "Quellfestplatte (z.B. /dev/sda): " DISK # Existenz prüfen if [ ! -b "$DISK" ]; then echo "Fehler: $DISK existiert nicht." exit 1 fi # Größe der Disk ermitteln DISKSIZE=$(blockdev --getsize64 "$DISK") # Prüfen, ob die Größe korrekt ermittelt wurde if [ -z "$DISKSIZE" ] || [ "$DISKSIZE" -eq 0 ]; then echo "Fehler: Konnte Größe von $DISK nicht ermitteln." exit 1 fi # Ziel-IP und Zieldisk abfragen read -rp "Ziel-IP: " TARGET_IP read -rp "Zieldisk auf Zielsystem (z.B. /dev/sda): " TARGET_DISK # Eingaben zusammenfassen echo "" echo "Bitte prüfen Sie Ihre Eingaben:" echo "Quellfestplatte: $DISK" echo "Größe: $DISKSIZE Bytes" echo "Zielsystem-IP: $TARGET_IP" echo "Zieldisk: $TARGET_DISK" echo "" read -rp "Sind die Eingaben korrekt? (y/n): " CONFIRM if [[ "$CONFIRM" =~ ^[Yy]$ ]]; then echo "Starte Klonvorgang..." sudo dd if="$DISK" bs=128M iflag=fullblock status=none \ | pv -s "$DISKSIZE" -tpreb \ | ssh root@"$TARGET_IP" "dd of=$TARGET_DISK bs=128M oflag=direct status=none" else echo "Abgebrochen." exit 1 fi |
bs=128M– Blockgröße für Lese- und Schreibvorgänge: 128 MiB
– Reduziert I/O-Operationen, steigert Datendurchsatz im Vergleich zu Standardgröße (512 B)status=none– Unterdrückt dd-eigene Ausgabe
– Ermöglicht saubere Fortschrittsanzeige durchpvstatus=progress– Zeigt laufend die Anzahl der bisher übertragenen Bytes an
– Optional ergänzt durch blockweise Fortschrittsanzeigen
– Nützlich, wennpvnicht verwendet wird oder zusätzlich sichtbar sein soll
– Wird meist auf dem Zielsystem beidd of=...eingesetzt, während auf der Quellseitestatus=nonedie Ausgabe unterdrückt wird, damitpvdie Anzeige übernimmtpv -tpreb– Fortschrittsanzeige während der Übertragung:
-t→ Laufende Zeit
-p→ Fortschritt in Prozent
-r→ Aktuelle Datentransferrate
-e→ Voraussichtliche Restzeit (ETA)
-b→ Übertragene Bytes
by Speefak