Wie richte ich das Klonen von Festplatten mit dd, netcat und ssh tunnel ein?

26

Ich möchte Sachen in großen Mengen (Reimage Disk Using dd) mit Netcat von Host A nach B über einen ssh-verschlüsselten Kanal unter Linux kopieren .

Welche Befehle soll ich an beiden Enden eingeben?

Evgeny
quelle

Antworten:

28

Kopieren von der Quelle zum Ziel, auf dem sshd ausgeführt wird:

  • dd if=/dev/sda | gzip | ssh root@target 'gzip -d | dd of=/dev/sda'

Kopieren von der Quelle zum Ziel über sshd_host, wenn auf dem Ziel nicht sshd ausgeführt wird.

  • Ziel: nc -l -p 62222 | dd of=/dev/sda bs=$((16 * 1024 * 1024))
  • Quelle: ssh -L 62222:target:62222 sshd_host &
  • Quelle: dd if=/dev/sda | nc -w 3 localhost 62222

    dd - wenn = die Quelle ist, von = das Ziel ist, ist bs = die Blockgröße. Unterschiedliche Blockgrößen können die Leistung verbessern. 16 ist normalerweise ein ziemlich vernünftiger Ausgangspunkt. Sie können auch count = verwenden, um anzugeben, wie viele Blöcke kopiert werden sollen.

    nc - -p gibt den für Dienste zu verwendenden Port an. -l wird verwendet, um einen Dienst zu starten. -w legt die Zeit fest, nach der auf Daten in der Pipeline gewartet wird, bevor das Programm beendet wird.

    ssh - -L - Sets auf den Tunnel auf der Remote - Host. Das Format des Arguments ist local_port:target_host:target_port. Ihr lokales Programm (nc) stellt eine Verbindung zum local_port her. Diese Verbindung wird getunnelt und mit target_port auf dem target_host verbunden.

Die definierten Optionen sind nur diejenigen, die dafür verwendet werden. Weitere Informationen finden Sie auf den Manpages.

Ein paar Anmerkungen:

  1. Wenn Sie dies über etwas anderes als ein LAN tun, würde ich vorschlagen, den Datenstrom mit gzip oder compress zu komprimieren. Bzip2 würde auch funktionieren, aber es braucht etwas mehr CPU-Zeit. Der erste hat ein Beispiel für diese Verwendung.
  2. Es ist besser, wenn die Quellpartition nicht oder schreibgeschützt gemountet ist. Wenn nicht, müssen Sie das Zielbild überprüfen.
  3. Sofern einer der Rechner netcat aber nicht ssh hat, wird netcat hier nicht wirklich benötigt. Dieser Fall würde so aussehen:

source machine dd -> nc -> ssh -> ssh tunnel -> sshd server -> nc on target -> dd

  1. dd funktioniert am besten, wenn die Quelle und die Ziele dieselbe Größe haben. Wenn nicht, muss das Ziel das größere der beiden sein.
  2. Wenn Sie ext2 / 3 oder xfs verwenden, sind dump (oder xfsdump) und restore möglicherweise eine bessere Option. Der Boot-Sektor wird nicht behandelt, aber er funktioniert, wenn Ziel und Quelle unterschiedlich groß sind.
Rik Schneider
quelle
4

Wenn du netcat ohne ssh benutzen willst. Ich gehe davon aus, dass dies der schnellste und nicht der sichere Weg ist. Sie können die gesamte Festplatte folgendermaßen kopieren und wiederherstellen:
Auf Computer A mit IP 192.168.0.1

cat /dev/hdb | nc -p 9000
Auf Computer B
nc -l 192.168.0.1 9000 > /dev/hdb

Denken Sie daran, dass laut man nc die Option -l ist:

  -l Wird verwendet, um anzugeben, dass nc auf eine eingehende Verbindung warten soll, anstatt eine Verbindung zu einem Remotehost herzustellen. Es ist ein Fehler , diese Option in Verbindung mit den Optionen -p, -s oder -z zu verwenden.
Ali Mezgani
quelle
3

netcat wird nicht benötigt.

auf src maschinenlauf:

dd if=/dev/sdX bs=1M | ssh root@dstMachine " dd of=/dev/sdY bs=1M"

Ich gehe davon aus, dass keine der Partitionen auf SDX und SDY gemountet sind. Sie können beide Boxen mit Knoppix oder einer ähnlichen Live-Distribution booten .

dd - nimmt Daten von wenn [falls nicht angegeben - nimmt sie von stdin], sendet Daten an von [falls nicht angegeben - Daten werden an stdout gesendet]. bs - Blockgröße ... beschleunigt die Dinge.

ssh - Führt den Befehl aus, der in Anführungszeichen auf der Remote-Box angegeben ist. Alle Daten, die an stdin von ssh gepumpt werden, werden auf die Remote-Maschine getunnelt und als stdin für den dort ausgeführten Befehl ausgegeben.

pQd
quelle
wird es also unmöglich sein auf die festplatte zu mounten?
Evgeny
@Evgeny Es ist in Ordnung, wenn die Festplatte schreibgeschützt ist. Andernfalls tun Sie es nicht. Ihre Kopie ist inkonsistent.
pQd
3

Host A ist derjenige, auf dem das Image gespeichert wird, Host B ist derjenige, auf dem das Image gespeichert wird:

root@A# dd if=/dev/sda | ssh root@B "dd of=/some/file"

Das Wiederherstellen auf der Festplatte würde nur diese beiden vertauschen.

Bill Weiss
quelle
1

Die grundlegende Kopie mit Netcat wird hier beschrieben .

Wenn Sie SSH dazu bewegen möchten , können Sie die Portweiterleitung verwenden .

-R [bind_address:]port:host:hostport

Aber im Großen und Ganzen könnte man den SSH-Transfer überhaupt erst machen (ohne Netcat).

nik
quelle
1

Solange beide Dateisysteme nicht gemountet sind, funktioniert dd gut.

(from server1) dd if=/dev/sda bs=32k | ssh <server2> dd of=/dev/sda bs=32k

Sie müssen die Authentifizierung des Hostschlüssels im Voraus einrichten. Andernfalls schlägt die Kopie aufgrund der Kennwortabfrage fehl.

Wenn Sie dies auf einem bereitgestellten Volume tun, werden schlechte Ergebnisse erzielt.

Dominic D
quelle
Vielen Dank. sind angebote notwendig
Evgeny
1

Oder Sie könnten clonezilla verwenden und Ihren Remote-Speicher über sshfs "mounten".

David Mackintosh
quelle
Wenn Sie eine Partition kopieren, möchten Sie nicht, dass die Zielpartition nicht gemountet wird? Weitere Details zu dieser Option wären hilfreich.
Mark Stosberg
1

Ich habe eine Kombination der oben genannten Optionen ausprobiert und teile die Ergebnisse mit Ihnen. am schnellsten bis am langsamsten mit Kombinationen aus dd-Blockgröße, gzip und gzip-Kompressionsalgorithmus.

Wie Sie sehen, hat gzip mich nur bei Verwendung des schnellen Algorithmus in Verbindung mit einer Blockgröße von 1 MB verbessert.

time dd bs=1M if=/dev/HypGroup00/stage-snapshot  | gzip --fast | ssh hyp5 'gzip -d | dd bs=1M of=/dev/HypGroup00/stage'
12884901888 bytes (13 GB) copied, 326.045 s, 39.5 MB/s

time dd if=/dev/HypGroup00/stage-snapshot  | gzip --fast | ssh hyp5 'gzip -d | dd of=/dev/HypGroup00/stage'
12884901888 bytes (13 GB) copied, 370.158 s, 34.8 MB/s

time dd if=/dev/HypGroup00/stage-snapshot  | ssh hyp5 dd of=/dev/HypGroup00/stage
12884901888 bytes (13 GB) copied, 370.274 s, 34.8 MB/s

time dd bs=1M if=/dev/HypGroup00/stage-snapshot  | ssh hyp5 dd bs=1M of=/dev/HypGroup00/stage
12884901888 bytes (13 GB) copied, 372.906 s, 34.6 MB/s

time dd bs=1M if=/dev/HypGroup00/stage-snapshot  | gzip | ssh hyp5 'gzip -d | dd bs=1M of=/dev/HypGroup00/stage'
12884901888 bytes (13 GB) copied, 520.116 s, 24.8 MB/s

Es wurden zwei schnelle Server verwendet, die über einen Enterprise GigE-Switch mit lokalen Festplatten über LVM mit GigE verbunden waren.

Edward Groenendaal
quelle
0

Sieht so aus, als würdest du hier mit einem Vorschlaghammer eine Nuss knacken - oder eine bessere Analogie ist der Versuch, deinen Rasen mit einer Schere zu schneiden :)

Ich würde dringend empfehlen, dass Sie sich einige der Tools ansehen, die für eine solche Aufgabe zur Verfügung stehen, es sei denn, Sie haben gute Gründe, dies intern zu tun.

Das Trinity Rescue Kit ist eine kostenlose Live-CD, die Imaging-Laufwerke über Multicast unterstützt und das tun kann, was Sie möchten (oder auch jeder andere, der in der gleichen Richtung denkt), ohne auf Imaging-Systeme mit vollem Funktionsumfang zurückgreifen zu müssen.

Tom Newton
quelle