У меня есть хост-машина KVM с несколькими виртуальными машинами. Каждая виртуальная машина использует логический том на хосте. Мне нужно скопировать LV на другой хост-компьютер.
Обычно я бы использовал что-то вроде:
dd if=/the/logical-volume of=/some/path/machine.dd
Чтобы превратить LV в файл изображения и использовать SCP для его перемещения. Затем используйте DD, чтобы скопировать файл обратно на новый LV на новом хосте.
Проблема с этим методом в том, что вам нужно вдвое больше дискового пространства, чем виртуальная машина занимает на обеих машинах. т.е. LV на 5 ГБ использует 5 ГБ пространства для LV, а копия dd также использует дополнительные 5 ГБ пространства для образа. Это нормально для небольших LV, но что, если (как в моем случае) у вас есть LV на 500 ГБ для большой виртуальной машины? Новый хост-компьютер имеет жесткий диск емкостью 1 ТБ, поэтому он не может вместить файл образа dd объемом 500 ГБ. и иметь логический том 500 ГБ для копирования на и есть место для хост-ОС и комната для других маленьких гостей.
Я бы хотел сделать что-то вроде:
dd if=/dev/mygroup-mylv of=192.168.1.103/dev/newvgroup-newlv
Другими словами, скопируйте данные напрямую с одного логического тома на другой по сети и пропустите промежуточный файл изображения.
Это возможно?
Конечно, конечно, это возможно.
dd if=/dev/mygroup-mylv | ssh 192.168.1.103 dd of=/dev/newvgroup-newlv
Бум.
Однако сделайте себе одолжение и используйте что-то большее, чем размер блока по умолчанию. Возможно добавить bs = 4M (чтение / запись кусками по 4 МБ). Вы можете видеть, что в комментариях есть некоторые придирки к размерам блоков; Если это то, что вы делаете довольно часто, потратьте немного времени, чтобы попробовать это несколько раз с разными размерами блоков и сами убедитесь, что дает вам лучшую скорость передачи.
Отвечая на один из вопросов из комментариев:
Вы можете направить перевод через pv чтобы получить статистику о переводе. Это намного лучше, чем результат отправки сигналов на dd
.
Я также скажу, что, хотя, конечно, использование netcat - или чего-либо еще, что не накладывает накладные расходы на шифрование - будет более эффективным, я обычно нахожу, что дополнительная скорость приходит с некоторой потерей удобства. Если я не перемещаюсь по очень большим наборам данных, я обычно придерживаюсь ssh, несмотря на накладные расходы, потому что в большинстве случаев все уже настроено для Just Work.
Вот оптимизированная версия, которая показывает прогресс с использованием pv
и использует BS для больших кусков, а также использует gzip
для уменьшения сетевого трафика.
Это идеально подходит для передачи данных между медленными соединениями, такими как интернет-серверы. Я рекомендую запускать команду внутри сеанса screen или tmux. Таким образом, ssh-соединение с хостом, с которого вы выполняете команду, может быть отключено без проблем.
$ dd if=/dev/volumegroupname/logicalvolume bs=4096 | pv | gzip | \
ssh root@78.46.36.22 'gzip -d | dd of=/dev/volumegroupname/logicalvolume bs=4096'
Сначала убедитесь, что логический том не смонтирован. Если это так, и вы хотите сделать «горячую копию», сначала создайте снимок и используйте его вместо этого:
lvcreate --snapshot --name transfer_snap --size 1G
Мне нужно передать много данных (7 ТБ) между двумя серверами, подключенными к 1 Гбит, поэтому мне нужен был самый быстрый способ сделать это.
Использование ssh исключено не из-за его шифрования (если у вас есть процессор с поддержкой AES-NI, это не так сильно повредит), а из-за его сетевых буферов. Они плохо масштабируются. Eсть исправленная версия Ssh это решает эту проблему, но поскольку нет предварительно скомпилированных пакетов, это не очень удобно.
При передаче необработанных образов дисков всегда рекомендуется использовать сжатие. Но вы не хотите, чтобы сжатие стало узким местом. Большинство инструментов сжатия unix, таких как gzip, являются однопоточными, поэтому, если сжатие перегружает один процессор, это будет узким местом. По этой причине я всегда использую pigz, вариант gzip, который использует для сжатия все ядра процессора. И это необходимо, если вы хотите увеличить скорость до GBit и выше.
Как было сказано ранее, ssh работает медленно. Если у вас процессор AES-NI, это не должно быть узким местом. Поэтому вместо использования ssh мы можем напрямую использовать openssl.
Чтобы дать вам представление о влиянии компонентов на скорость, вот мои результаты. Это скорости передачи между двумя производственными системами при чтении и записи в память. Фактические результаты зависят от скорости сети, скорости жесткого диска и исходной скорости процессора! Я делаю это, чтобы показать, что, по крайней мере, нет сильного падения производительности.
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
Вывод: использование сжатия дает заметное ускорение, так как значительно уменьшает размер данных. Это даже более важно, если у вас более низкая скорость сети. При использовании сжатия следите за использованием процессора. если использование исчерпано, вы можете попробовать без него. Использование сжатия как небольшого воздействия на системы AES-NI, imho только потому, что оно отнимает около 30-40% процессора от сжатия.
Если вы, как и я, передаете много данных, вы не хотите, чтобы они прерывались из-за отключения вашего ssh-клиента от сети, поэтому вам лучше начать с экрана с обеих сторон. Это всего лишь примечание, я не буду писать здесь учебник по экрану.
Установите некоторые зависимости (от источника и назначения): apt install pigz pv netcat-openbsd
затем создайте том в месте назначения того же размера, что и исходный. Если не уверены, используйте lvdisplay в источнике, чтобы получить размер и создать цель, например: lvcreate -n lvname vgname -L 50G
Затем подготовьте пункт назначения для приема данных:
nc -l -p 444 | openssl aes-256-cbc -d -salt -pass pass:asdkjn2hb | pigz -d | dd bs=16M of=/dev/vgname/lvname
и когда все будет готово, запустим перенос на Источник:
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
Примечание. Если вы переносите данные локально или не заботитесь о шифровании, просто удалите часть Openssl с обеих сторон. Если вам интересно, asdkjn2hb - это ключ шифрования, вы должны его изменить.
Как насчет использования для этого старого друга. NetCat.
В системе, которая теряет тип логического тома
$ dd if=/dev/[directory]/[volume-name] | nc -l [any high number port]
Затем о принимающей системе. тип
$ nc -w 10 [ip or name] [port] | dd of=/dev/[directory/[volume name]
Переводя, создайте файл dd этого файла и направьте его в nc (netcat), который будет прослушивать этот порт. В принимающей системе netcat будет ждать 10 секунд, если не получит данных, прежде чем закрыть [ip или имя] на [порт], а затем передать эти данные dd для их записи.
Сначала я бы сделал снимок lv:
lvcreate --snapshot --name my_shot --size <thesize> /dev/<name of vg>/<name of lv>
После этого вам нужно создать новый уровень на новом хосте (например, с помощью lvcreate) с тем же размером. Затем вы можете напрямую скопировать данные на новый хост. Вот мой пример команды копирования:
dd if=/dev/vg0/my_shot bs=4096 | pv | ssh root@some_host -C 'dd of=/dev/vg1/<created lv> bs=4096'
Я использовал процедуру для копирования виртуальной машины, поддерживаемой proxmox pve, на другой хост. Логический том содержал несколько дополнительных LV, которые обслуживала сама виртуальная машина.
Остальные ответы не работают и не соответствуют требованиям вопроса, потому что он не создает логический том на целевом сервере, а вместо этого создает файл в / dev / mygroup / myvol на корневом диске, который также приводит к тому, что скопированный том не отображается в инструментах LV, таких как lvdisplay
.
Я создал сценарий bash, который автоматизирует весь процесс: https://github.com/daniol/lvm-ssh-transfer