Перенести виртуальную машину из облака VMware другого провайдера на облачный сервер в Selectel
Вы можете перенести данные на облачный сервер: экспортировать ВМ из vCloud Director, vSphere и ESXi и создать облачный сервер в Selectel.
Если вы хотите остаться на VMware и переехать в облако на базе VMware в Selectel, выберите способ миграции.
Как устроена миграция
ВМ выгружается из VMware в формате OVF вместе с дисками, проверяется по контрольным суммам, загружается в S3 Selectel и импортируется как образ. Большинство площадок vCloud открывают доступ по API — большинство операций выполняется из консоли и автоматизируется. Под ВМ понимается vApp целиком: экспортируются все ВМ, которые в него входят.
Работающую ВМ выгрузить нельзя, поэтому OVF Tool выключает ее перед экспортом. Заранее согласуйте окно обслуживания для каждой ВМ.
Перенести данные на облачный сервер
- Подготовьтесь к миграции.
- Для ВМ на Windows установите драйверы virtio.
- Экспортируйте ВМ в формат OVF.
- Проверьте файлы и загрузите их в S3.
- Создайте облачный сервер из образа.
1. Подготовиться к миграции
-
У вашего провайдера VMware получите доступ к виртуальному дата-центру (vDC) с правами Organization Administrator.
-
На сайте Broadcom (VMware) скачайте VMware OVF Tool и распакуйте его на компьютер или ВМ, где хватит места под образы дисков.
-
Создайте бакет в S3 Selectel.
-
Настройте Rclone для работы с бакетом:
[selectel]type = s3provider = Otheraccess_key_id = <access_key>secret_access_key = <secret_key>endpoint = <s3_domain>region = <pool>Укажите:
<access_key>— значение поля Access key из S3-ключа, который вы выдали на шаге 5;<secret_key>— значение поля Secret key из S3-ключа, который вы выдали на шаге 5;<pool>— пул, в котором вы создали бакет на шаге 3;<s3_domain>— домен S3 API. Домен зависит от пула, в котором создан бакет.
2. Подготовить ВМ Windows
Чтобы Windows запустилась на облачном сервере, драйверы virtio нужно поставить в исходную ВМ до экспорта образа системного диска. Перед массовым переносом проверьте порядок действий на одной некритичной ВМ Windows.
- Скачайте ISO-образ с драйверами: virtio-win.iso.
- Подключите образ в исходной ОС.
- Установите все драйверы.
- В согласованное время перезагрузите сервер.
3. Экспортировать ВМ
Если виртуальных машин:
- одна или несколько — запустите экспорт вручную для каждой ВМ;
- много — запустите экспорт через скрипт в несколько потоков.
Одна ВМ
Запустите экспорт:
./ovftool --powerOffSource \
--X:logFile=<ovftool_path>.log --X:logLevel=<log_level> \
--parallelThreads=4 --X:progressSmoothing=10 \
--X:vCloudTimeout=60000 --X:vCloudKeepAliveTimeout=60000 \
"vcloud://<username>:<password>@<provider_address>?org=<org_name>&vdc=<vdc_name>&vapp=<vapp_name>" \
"<vapp_path>.ovf"
Укажите:
<ovftool_path>— путь до журнала OVF Tool без расширения.log;<log_level>— уровень логирования. Возможные значения:none,quiet,panic,error,warning,info,verbose,trivia;<username>— имя пользователя vCloud Director;<password>— пароль пользователя vCloud Director. Спецсимволы в пароле закодируйте для URL: например,@записывается как%40;<provider_address>— адрес vCloud Director площадки вашего провайдера VMware;<org_name>— имя организации;<vdc_name>— имя виртуального дата-центра (vDC);<vapp_path>— путь до vApp.
Здесь:
--powerOffSource— выключить ВМ перед экспортом;--parallelThreads— число потоков, от 1 до 100, но не больше числа ядер CPU минус одно;--X:progressSmoothing— интервал сглаживания оценки времени загрузки, секунды (по умолчанию 60);--X:vCloudTimeout— сколько ждать ответа vCloud на этапе подготовки экспорта. Важно для больших ВМ;--X:vCloudKeepAliveTimeout— сколько держать соединение с vCloud. Важно для больших ВМ.
Параметры вида --X:... и --parallelThreads указываются до адреса vCloud Director.
В результате экспорта в каталоге появятся файлы:
.mf— контрольные суммы SHA-256 файлов ВМ, посчитанные на стороне VMware;.ovf— описание ВМ в формате Open Virtualization Format;.nvram— настройки BIOS/UEFI;.vmdk— образы дисков. Они меньше, чем диски в vCloud Director, потому что при экспорте используется сжатие.
Несколько ВМ
-
В файле
vmlistперечислите имена vApp по одному на строку. -
В папке с файлом
ovftoolдобавьте скрипт:#!/usr/bin/env bash# export-vapps.sh - параллельный экспорт vApp из vCloud Directorset -euo pipefailexport OVFTOOL=./ovftoolexport VCD_HOST="<provider_address>"export ORG="<org_name>"export VDC="<vdc_name>"export VCD_USER="<username>"export OUT_DIR=./exportNJOBS=<vapp_amount>read -rsp "Пароль vCloud (спецсимволы в URL-кодировке): " VCD_PASS; echoexport VCD_PASSmkdir -p "$OUT_DIR"export_vapp() {local vapp="$1"mkdir -p "$OUT_DIR/$vapp""$OVFTOOL" --powerOffSource \--X:logFile="$OUT_DIR/$vapp/ovftool.log" --X:logLevel=verbose \--parallelThreads=4 --X:vCloudTimeout=60000 --X:vCloudKeepAliveTimeout=60000 \"vcloud://${VCD_USER}:${VCD_PASS}@${VCD_HOST}?org=${ORG}&vdc=${VDC}&vapp=${vapp}" \"$OUT_DIR/$vapp/$vapp.ovf" && echo "OK $vapp" || echo "ERR $vapp"}export -f export_vappgrep -v '^[[:space:]]*$' vmlist | xargs -P "$NJOBS" -I{} bash -c 'export_vapp "$1"' _ {}Укажите:
<provider_address>— адрес vCloud Director площадки вашего провайдера VMware;<org_name>— имя организации;<vdc_name>— имя виртуального дата-центра (vDC);<username>— имя пользователя vCloud Director;<vapp_amount>— количество vApp, которое будет выгружаться одновременно.
Здесь:
--powerOffSource— выключить ВМ перед экспортом;--parallelThreads— число потоков, от 1 до 100, но не больше числа ядер CPU минус одно;--X:vCloudTimeout— сколько ждать ответа vCloud на этапе подготовки экспорта. Важно для больших ВМ;--X:vCloudKeepAliveTimeout— сколько держать соединение с vCloud. Важно для больших ВМ.
-
Запустите скрипт. Скрипт запросит пароль vCloud.
-
Введите пароль vCloud. Спецсимволы в пароле закодируйте для URL: например,
@записывается как%40.
4. Выполнить проверку и загрузить в S3
Сверьте контрольные суммы скачанных файлов с .mf с помощью скрипта.
Для очень больших файлов, которые загружаются в хранилище частями, общей контрольной суммы может не быть — тогда rclone check сравнивает только размер.
Целостность самих данных в любом случае гарантирует проверка SHA-256 до загрузки.
Скрипт проверит каждую ВМ, загрузит проверенные файлы в S3, сверит загруженное с локальным и перенесет обработанные каталоги в ./export/processed:
#!/usr/bin/env bash
# check-and-upload.sh - проверка SHA-256 по .mf и загрузка в хранилище
set -euo pipefail
EXPORT_DIR="<export_dir>"
REMOTE="<remote>:<bucket_name>"
mkdir -p "$EXPORT_DIR/processed"
mapfile -t manifests < <(find "$EXPORT_DIR" -name '*.mf' -not -path '*/processed/*')
for mf in "${manifests[@]}"; do
dir=$(dirname "$mf"); vapp=$(basename "$dir"); ok=1
while IFS= read -r line; do
file=$(sed -E 's/^SHA256\((.*)\)= .*/\1/' <<<"$line")
expected=$(sed -E 's/^.*= //' <<<"$line")
actual=$(sha256sum "$dir/$file" | awk '{print $1}')
if [[ "$actual" == "$expected" ]]; then echo "OK $vapp/$file"
else echo "ERR $vapp/$file - контрольная сумма не совпала"; ok=0; fi
done < <(grep '^SHA256' "$mf")
if [[ $ok -eq 1 ]]; then
rclone copy "$dir" "$REMOTE/$vapp" --progress --transfers 4
rclone check "$dir" "$REMOTE/$vapp" --one-way && mv "$dir" "$EXPORT_DIR/processed/"
else
echo "vApp $vapp: повторите экспорт"
fi
done
Укажите:
<export_dir>— каталог с результатами экспорта;<remote>— имя подключения Rclone. Должно совпадать с именем из конфигурационного файла Rclone, который вы добавили при подготовке к миграции на этапе 1 на шаге 6;<bucket_name>— имя бакета для загрузки образов, который вы создали при подготовке к миграции на этапе 1 на шаге 3.
Если экспорт падает с ошибкой
При экспорте vCloud сначала сохраняет образ ВМ у себя.
Если у провайдера на хосте виртуализации не хватает места под ВМ с большими дисками, задание может завершиться ошибкой.
Тогда диски можно выгрузить по сети через dd.
Подробнее о побайтовом копировании, в том числе о том, как продолжить прерванную передачу, — в инструкции Перенести данные Linux-сервера на облачный сервер Selectel с помощью dd.
-
Загрузите ВМ с Rescue-образа, например Selectel Rescue.
-
Скопируйте диск на принимающий сервер:
dd if=/dev/sda bs=32M status=progress | pv -qL 90M | ssh root@<receiver_ip> "dd of=/data/<vm_name>.raw bs=32M"Укажите:
<receiver_ip>— IP-адрес принимающего сервера;<vm_name>— имя ВМ, используется для имени файла образа на принимающем сервере.
Здесь:
bs=32M— размер блока, на практике оптимальный по скорости;pv -qL 90M— ограничение передачи 90 МБ/с, чтобы оставить часть канала другим ВМ. На принимающей стороне вместо файла можно сразу писать на диск, напримерof=/dev/sda.
-
На исходной ВМ посчитайте контрольную сумму диска. Используйте SHA-256, а не MD5:
sha256sum <source_disk>Укажите
<source_disk>— путь до исходного диска, например/dev/sda. -
На принимающем сервере посчитайте контрольную сумму образа:
sha256sum <file_path>Укажите
<file_path>— путь до полученного образа, который вы указали на шаге 2, например/data/<vm_name>.raw. -
Сравните значения контрольных сумм из шагов 3 и 4. Если суммы совпали, данные перенесены без потерь.
5. Создать облачный сервер из образа
В современных дистрибутивах Linux есть драйверы virtio и cloud-init, поэтому такие ВМ обычно импортируются и запускаются без доработок. Для полной совместимости выполните рекомендации по импорту образов.
-
Загрузите образ диска в панели управления в раздел Образы. Образы больше 100 ГБ удобнее загружать через OpenStack CLI:
openstack image create --disk-format vmdk --container-format bare \--file <vm_name>-disk1.vmdk <vm_name>Укажите:
<vm_name>-disk1.vmdk— путь к экспортированному файлу диска ВМ;<vm_name>— имя образа, которое будет отображаться в панели управления.
-
Создайте облачный сервер из образа.
-
Проверьте работу сервисов.
Переезд в облако на базе VMware в Selectel
Если вы хотите остаться на VMware, способ переезда в облако на базе VMware в Selectel зависит от того, где сейчас находится инфраструктура: