web-dev-qa-db-fra.com

Déplacement d'un volume logique directement d'un serveur à un autre sur le réseau?

J'ai un KVM machine hôte avec plusieurs machines virtuelles sur elle. Chaque VM utilise un volume logique sur l'hôte. J'ai besoin de copier le LVS sur une autre machine hôte.

Normalement, j'utiliserais quelque chose comme:

dd if=/the/logical-volume of=/some/path/machine.dd

Pour activer le LV dans un fichier image et utiliser SCP pour le déplacer. Utilisez ensuite DD pour copier le fichier à un nouveau LV sur le nouvel hôte.

Le problème avec cette méthode est que vous avez besoin de deux fois plus d'espace disque que le VM prend sur les deux machines. c'est à dire. Un 5 Go LV utilise 5 Go d'espace pour la LV et la copie DD utilise également 5 Go supplémentaires d'espace pour l'image. C'est bien pour les petits LV, mais si (comme c'est mon cas), vous avez un 500 Go LV pour un grand vm? La nouvelle machine hôte dispose d'un disque dur de 1 To, de sorte qu'il ne peut donc pas contenir un fichier d'image DD 500 Go et Avoir un volume logique de 500 Go à copier à et avoir de la place pour l'hôte. OS et Chambre pour d'autres plus petits invités.

Ce que je voudrais faire est quelque chose comme:

dd if=/dev/mygroup-mylv of=192.168.1.103/dev/newvgroup-newlv

En d'autres termes, copiez les données directement à partir d'un volume logique à l'autre sur le réseau et à ignorer le fichier d'image intermédiaire.

Est-ce possible?

13
Nick

Voici une version optimisée, qui montre la progression à l'aide de pv et utilise des BS pour des morceaux plus importants et utilise également gzip pour réduire le trafic réseau.

C'est parfait lors du déplacement des données entre les connexions lentes telles que les serveurs Internet. Je recommande d'exécuter la commande dans une séance d'écran ou de TMux. De cette façon, la connexion SSH à l'hôte de l'endroit où vous exécutez la commande peut être déconnectée sans problème.

$ dd if=/dev/volumegroupname/logicalvolume bs=4096 | pv | gzip | \
    ssh [email protected] 'gzip -d | dd of=/dev/volumegroupname/logicalvolume  bs=4096'
19
Johannes Doering

Que diriez-vous d'utiliser un ancien ami pour le faire. NETCAT.

Sur le système qui perd le type de volume logique

  • $ dd if=/dev/[directory]/[volume-name] | nc -l [any high number port]

Puis sur le système de réception. taper

  • $ nc -w 10 [ip or name] [port] | dd of=/dev/[directory/[volume name]

Traduire, ORGIN BOX DD Ce fichier et le tuyau sur NC (NETCAT) qui écouteront ce port. Sur le système de réception, NetCat attendra 10 secondes s'il ne reçoit aucune donnée avant la fermeture de [IP ou nom] sur [Port], puis de tuyer que les données à DD pour l'écrire.

4
linuxrebel

Assurez-vous d'abord que le volume logique n'est pas monté. Si tel est et que vous voulez faire une "copie à chaud", créez d'abord un instantané et utilisez-le à la place: lvcreate --snapshot --name transfer_snap --size 1G

Je dois transférer beaucoup de données (7 To) entre deux serveurs connectés de 1gbit, alors j'avais besoin de la possibilité de le faire facilement.

Devez-vous utiliser ssh?

L'utilisation de SSH est hors de question, pas à cause de son cryptage (si vous avez une CPU avec un support AES-NI, cela ne fait pas beaucoup de mal), mais à cause de ses tampons de réseau. Ce ne sont pas bien à l'échelle. Il y a une version corrigée SSH qui répond à ce problème, mais qu'il n'y a pas de packages précompilés, ce n'est pas très pratique.

En utilisant la compression

Lorsque vous transférez des images de disque brut, il est toujours conseillé d'utiliser la compression. Mais vous ne voulez pas que la compression devienne un goulot d'étranglement. La plupart des outils de compression UNIX tels que GZIP sont uniformisés, de sorte que si la compression sature une CPU, ce sera un goulot d'étranglement. Pour cette raison, j'utilise toujours Pigz, une variante GZIP qui utilise tous les cœurs CPU pour la compression. Et cela est nécessaire de votre choix pour aller jusqu'à et au-dessus des vitesses GBIT.

Utiliser le cryptage

Comme dit avant, SSH est lent. Si vous avez une CPU AES-NI, cela ne devrait pas être un goulot d'étranglement. Donc, au lieu d'utiliser SSH, nous pouvons utiliser OpenSSL directement.

Vitesses

Pour vous donner une idée de l'impact de la vitesse des composants, voici mes résultats. Ce sont des vitesses de transfert entre deux systèmes de production de lecture et d'écriture à la mémoire. Les résultats réels dépendent de la vitesse du réseau, de la vitesse du disque dur et de la vitesse de la CPU source! Je fais cela pour montrer qu'il n'y a au moins aucune perte de performance énorme. 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 Conclusion: L'utilisation de la compression donne une vitesse notable, car elle réduit beaucoup la taille des données. Cela est encore plus important si vous avez des vitesses de réseau plus lentes. Lorsque vous utilisez la compression, surveillez votre utilisation de la CPU. Si l'utilisation est maximale, vous pouvez essayer sans elle. Utilisation de la compression en tant que petit impact sur les systèmes AES-NI, IMHO uniquement parce qu'il vole environ 30 à 40% de processeur de la compression.

Utilisation de l'écran

Si vous transférez beaucoup de données comme moi, vous ne voulez pas l'avoir interrompu par une déconnexion réseau de votre client SSH, de sorte que vous feriez mieux de commencer avec l'écran des deux côtés. Ceci est juste une note, je ne vais pas écrire un tutoriel à l'écran ici.

Permet de copier

Installez des dépendances (sur la source et la destination): apt install pigz pv netcat-openbsd

ensuite, créez un volume sur la destination de la même taille que la source. Si vous ne savez pas, utilisez LVDisplay sur la source pour obtenir la taille et créer la cible I.E.: lvcreate -n lvname vgname -L 50G

ensuite, préparez la destination pour recevoir les données:

nc -l -p 444 | openssl aes-256-cbc -d -salt -pass pass:asdkjn2hb | pigz -d | dd bs=16M of=/dev/vgname/lvname

et quand prêt, démarrez le transfert sur la source:

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

Remarque: Si vous transférez les données localement ou que vous ne vous souciez pas du cryptage, supprimez simplement la partie OpenSSL des deux côtés. Si vous vous souciez, ASDKJN2HB est la clé de cryptage, vous devez le changer.

3
bhelm

D'abord, je prendrais un instantané de la LV:

lvcreate --snapshot --name my_shot --size <thesize> /dev/<name of vg>/<name of lv>

Après cela, vous devez créer un nouveau LV sur le nouvel hôte (par exemple en utilisant LVCreate) avec la même taille. Ensuite, vous pouvez directement copier les données sur le nouvel hôte. Voici mon exemple de la commande de copie:

dd if=/dev/vg0/my_shot bs=4096 | pv | ssh root@some_Host -C 'dd of=/dev/vg1/<created lv> bs=4096'

J'ai utilisé la procédure pour copier une proxmox PVE Maintenued VM vers un autre hôte. Le volume logique contenait plusieurs LV supplémentaires qui ont été gérées par le VM lui-même.

3
Woolf