Ich habe einen KVM-Hostcomputer mit mehreren VMs. Jede VM verwendet ein logisches Volume auf dem Host. Ich muss die LVs auf einen anderen Hostcomputer kopieren.
Normalerweise würde ich so etwas verwenden:
dd if=/the/logical-volume of=/some/path/machine.dd
So wandeln Sie den LV in eine Image-Datei um und verschieben ihn mit SCP. Verwenden Sie dann DD, um die Datei zurück in eine neue LV auf dem neuen Host zu kopieren.
Das Problem bei dieser Methode ist, dass Sie doppelt so viel Speicherplatz benötigen, wie die VM auf beiden Computern benötigt. dh Ein 5-GB-LV verwendet 5 GB Speicherplatz für das LV, und die dd-Kopie verwendet zusätzlich 5 GB Speicherplatz für das Image. Dies ist in Ordnung für kleine LVs, aber was ist, wenn Sie (wie in meinem Fall) eine 500-GB-LV für eine große VM haben? Der neue Host-Computer verfügt über eine 1-TB-Festplatte, kann also keine 500-GB-DD-Image-Datei speichern und verfügt über ein logisches 500-GB-Volume zum Kopieren sowie über Platz für das Host-Betriebssystem und andere kleinere Gäste.
Was ich gerne machen würde, ist so etwas wie:
dd if=/dev/mygroup-mylv of=192.168.1.103/dev/newvgroup-newlv
Mit anderen Worten, kopieren Sie die Daten direkt über das Netzwerk von einem logischen Volume auf das andere und überspringen Sie die Zwischenimagedatei.
Ist das möglich?
Antworten:
Natürlich ist es möglich.
Boom.
Tun Sie sich jedoch selbst einen Gefallen und verwenden Sie etwas, das größer als die Standardblockgröße ist. Fügen Sie vielleicht bs = 4M hinzu (Lesen / Schreiben in Stücken von 4 MB). Sie können sehen, dass es in den Kommentaren ein bisschen Unsinn über Blockgrößen gibt. Wenn Sie dies öfter tun, nehmen Sie sich ein wenig Zeit, um es ein paar Mal mit unterschiedlichen Blockgrößen zu versuchen, und sehen Sie selbst, wie Sie die besten Übertragungsraten erzielen.
Beantwortung einer der Fragen aus den Kommentaren:
Sie können die Übertragung durch pv leiten , um Statistiken über die Übertragung abzurufen . Es ist viel schöner als die Ausgabe, an die Sie Signale senden
dd
.Ich werde auch sagen, dass die Verwendung von Netcat - oder etwas anderem, das den Aufwand für die Verschlüsselung nicht mit sich bringt - zwar effizienter sein wird, ich jedoch in der Regel feststellen muss, dass die zusätzliche Geschwindigkeit mit einem gewissen Komfortverlust einhergeht. Wenn ich mich nicht in wirklich großen Datenmengen bewege, bleibe ich trotz des Overheads normalerweise bei ssh, da in den meisten Fällen bereits alles auf Just Work eingestellt ist.
quelle
dd
Prozess dasUSR1
Signal senden , dass er eine Statuszeile mit dem überwiesenen Betrag anzeigt. Holen Sie sich die Prozessnummer Ihresdd
Prozesses mit etwas wieps aux | grep dd
und verwenden Sie dann diese PID mit dem Befehlkill -USR1 $PID
. Die Nachricht wird auf dem ursprünglichen Terminal angezeigt, an dem Sie gestartet habendd
.Hier ist eine optimierte Version, die den Fortschritt bei der Verwendung
pv
und Verwendung von BS für größere Blöcke sowie beigzip
der Reduzierung des Netzwerkverkehrs zeigt.Das ist perfekt, wenn Sie Daten zwischen langsamen Verbindungen wie Internet-Servern verschieben. Ich empfehle, den Befehl in einer screen- oder tmux-Sitzung auszuführen. Auf diese Weise kann die SSH-Verbindung zum Host, von dem aus Sie den Befehl ausführen, problemlos getrennt werden.
quelle
ssh -C
anstelle von verwendengzip
. Ich bin mir nicht sicher, ob es Auswirkungen auf die Leistung gibt, aber es ist viel weniger Tippen.pv
kann Probleme mit der Anzahl der Bytes verursachen (nach meiner Erfahrung werden mit diesem System mehr als 500 vps auf andere Server übertragen), und nach diesem Problem sind die lvm-Volumes inkonsistent. Vorteile des Arbeitsfortschritts sind null und dangeorus. Wenn Sie den Fortschritt sehen möchten, öffnen Sie zum Beispiel eine Konsole mit ifto.Wie wäre es mit einem alten Freund, um dies zu tun. NetCat.
Auf dem System, auf dem der logische Datenträgertyp verloren geht
$ dd if=/dev/[directory]/[volume-name] | nc -l [any high number port]
Dann auf dem empfangenden System. Art
$ nc -w 10 [ip or name] [port] | dd of=/dev/[directory/[volume name]
Übersetzen Sie diese Datei, und leiten Sie sie an nc (netcat) weiter, das diesen Port abhört. Auf dem empfangenden System wartet netcat 10 Sekunden, wenn es keine Daten erhält, bevor es auf [ip oder name] auf [port] schließt, und leitet diese Daten dann an dd weiter, um sie auszuschreiben.
quelle
Zuerst würde ich einen Schnappschuss von lv machen:
Danach müssen Sie auf dem neuen Host ein neues lv mit der gleichen Größe erstellen (z. B. mit lvcreate). Anschließend können Sie die Daten direkt auf den neuen Host kopieren. Hier ist mein Beispiel für den Kopierbefehl:
Ich habe die Prozedur verwendet, um eine von proxmox pve verwaltete VM auf einen anderen Host zu kopieren. Das logische Volume enthielt mehrere zusätzliche LVs, die von der VM selbst verwaltet wurden.
quelle
Stellen Sie zunächst sicher, dass das logische Volume nicht bereitgestellt ist. Wenn dies der Fall ist und Sie eine "heiße Kopie" erstellen möchten, erstellen Sie zuerst einen Schnappschuss und verwenden Sie stattdessen Folgendes:
lvcreate --snapshot --name transfer_snap --size 1G
Ich muss eine Menge Daten (7 TB) zwischen zwei mit 1 GBit verbundenen Servern übertragen, daher brauchte ich die schnellstmögliche Möglichkeit, dies zu tun.
Solltest du SSH benutzen?
Die Verwendung von ssh kommt nicht wegen seiner Verschlüsselung in Frage (wenn Sie eine CPU mit AES-NI-Unterstützung haben, schadet dies nicht so sehr), sondern wegen seiner Netzwerkpuffer. Diese skalieren nicht gut. Es gibt eine gepatchte Ssh-Version , die dieses Problem behebt. Da es jedoch keine vorkompilierten Pakete gibt, ist dies nicht sehr praktisch.
Komprimierung verwenden
Bei der Übertragung von Raw-Disk-Images empfiehlt es sich immer, die Komprimierung zu verwenden. Sie möchten jedoch nicht, dass die Komprimierung zu einem Engpass wird. Die meisten Unix-Komprimierungstools wie gzip sind Singlethread-Tools. Wenn die Komprimierung eine CPU auslastet, ist dies ein Engpass. Aus diesem Grund verwende ich immer pigz, eine gzip-Variante, bei der alle CPU-Kerne für die Komprimierung verwendet werden. Und das ist notwendig, um die GBit-Geschwindigkeit zu übertreffen.
Verschlüsselung verwenden
Wie gesagt, ssh ist langsam. Wenn Sie eine AES-NI-CPU haben, sollte dies kein Engpass sein. Anstatt also ssh zu verwenden, können wir openssl direkt verwenden.
Geschwindigkeiten
Um Ihnen eine Vorstellung von der Geschwindigkeit der Komponenten zu geben, sind hier meine Ergebnisse. Das sind Übertragungsgeschwindigkeiten zwischen zwei Produktionssystemen, die lesen und in den Speicher schreiben. Die tatsächlichen Ergebnisse hängen von der Netzwerkgeschwindigkeit, der Festplattengeschwindigkeit und der CPU-Quellgeschwindigkeit ab! Ich mache das, um zu zeigen, dass es zumindest keinen großen Leistungsabfall gibt.
Simple nc dd: 5033164800 bytes (5.0 GB, 4.7 GiB) copied, 47.3576 s, 106 MB/s +pigz compression level 1 (speed gain depends on actual data): network traffic: 2.52GiB 5033164800 bytes (5.0 GB, 4.7 GiB) copied, 38.8045 s, 130 MB/s +pigz compression level 5: network traffic: 2.43GiB 5033164800 bytes (5.0 GB, 4.7 GiB) copied, 44.4623 s, 113 MB/s +compression level 1 + openssl encryption: network traffic: 2.52GiB 5033164800 bytes (5.0 GB, 4.7 GiB) copied, 43.1163 s, 117 MB/s
Fazit: Durch die Komprimierung wird eine spürbare Beschleunigung erzielt, da die Datenmenge erheblich reduziert wird. Dies ist umso wichtiger, wenn Sie langsamere Netzwerkgeschwindigkeiten haben. Achten Sie bei der Verwendung der Komprimierung auf die CPU-Auslastung. Wenn die Nutzung maximal wird, können Sie versuchen, ohne es. Verwenden der Komprimierung als nur geringe Auswirkung auf AES-NI-Systeme, imho nur, weil sie der Komprimierung etwa 30-40% CPU stiehlt.Bildschirm verwenden
Wenn Sie wie ich viele Daten übertragen, möchten Sie nicht, dass diese durch eine Netzwerkunterbrechung Ihres ssh-Clients unterbrochen werden. Beginnen Sie daher besser mit einem Bildschirm auf beiden Seiten. Dies ist nur ein Hinweis, ich werde hier kein Bildschirm-Tutorial schreiben.
Lets Copy
Installieren Sie einige Abhängigkeiten (von Quelle und Ziel):
apt install pigz pv netcat-openbsd
Erstellen Sie dann auf dem Ziel ein Volume mit der gleichen Größe wie die Quelle. Wenn Sie sich nicht sicher sind, verwenden Sie lvdisplay für die Quelle, um die Größe zu ermitteln und das Ziel zu erstellen.
lvcreate -n lvname vgname -L 50G
Bereiten Sie als nächstes das Ziel für den Empfang der Daten vor:
nc -l -p 444 | openssl aes-256-cbc -d -salt -pass pass:asdkjn2hb | pigz -d | dd bs=16M of=/dev/vgname/lvname
und wenn Sie fertig sind, starten Sie die Übertragung auf der Quelle:
pv -r -t -b -p -e /dev/vgname/lvname | pigz -1 | openssl aes-256-cbc -salt -pass pass:asdkjn2hb | nc <destip/host> 444 -q 1
Hinweis: Wenn Sie die Daten lokal übertragen oder sich nicht für die Verschlüsselung interessieren, entfernen Sie einfach den Openssl-Teil von beiden Seiten. Wenn es Ihnen wichtig ist, dass asdkjn2hb der Verschlüsselungsschlüssel ist, sollten Sie ihn ändern.
quelle