Перенести ВМ из облака VMware другого провайдера в облачную платформу Selectel
Вы можете экспортировать ВМ из vCloud Director, vSphere и ESXi и импортировать в облачную платформу Selectel.
Как устроена миграция
ВМ выгружается из VMware в формате OVF вместе с дисками, проверяется по контрольным суммам, загружается в S3 Selectel и импортируется в облачную платформу как образ. Большинство площадок vCloud открывают доступ по API, поэтому почти все операции выполняются из консоли и легко автоматизируются. Под ВМ здесь и дальше понимается vApp целиком: экспортируются все ВМ, которые в него входят.
Работающую ВМ выгрузить нельзя, поэтому OVF Tool выключает ее перед экспортом. Заранее согласуйте окно обслуживания для каждой ВМ.
1. Подготовиться к миграции
-
Получите доступ к виртуальному дата-центру (vDC) с правами Organization Administrator.
-
Скачайте VMware OVF Tool с сайта Broadcom (VMware) и распакуйте его на компьютер или ВМ, где хватит места под образы дисков.
-
Создайте бакет в S3 Selectel.
-
Настройте Rclone для работы с бакетом:
[selectel]type = s3provider = Otheraccess_key_id = ACCESS_KEYsecret_access_key = SECRET_KEYendpoint = https://s3.ru-1.storage.selcloud.ruregion = ru-1 -
Для ВМ на Windows установите драйверы virtio (этап 6).
2. Экспортировать ВМ
Одна ВМ
Если машин немного, экспорт удобно запускать вручную для каждой ВМ. Запустите экспорт:
./ovftool --powerOffSource \
--X:logFile=/path/to/ovftool.log --X:logLevel=verbose \
--parallelThreads=4 --X:progressSmoothing=10 \
--X:vCloudTimeout=60000 --X:vCloudKeepAliveTimeout=60000 \
"vcloud://USERNAME:PASSWORD@vcd.provider.example?org=ORG_NAME&vdc=VDC_NAME&vapp=VAPP_NAME" \
"/path/to/export/VAPP_NAME.ovf"
Параметры вида --X:... и --parallelThreads указываются до адреса vCloud Director.
Спецсимволы в пароле нужно закодировать для URL: например, @ записывается как %40.
В результате в каталоге появятся файлы:
.mf— контрольные суммы SHA-256 файлов ВМ, посчитанные на стороне VMware;.ovf— описание ВМ в формате Open Virtualization Format;.nvram— настройки BIOS/UEFI;.vmdk— образы дисков. Они меньше, чем диски в vCloud Director, потому что при экспорте используется сжатие.
Несколько ВМ
Если машин много, экспорт лучше запускать скриптом в несколько потоков.
Перечислите имена vApp в файле vmlist, по одному на строку, и положите скрипт рядом с ovftool:
#!/usr/bin/env bash
# export-vapps.sh - параллельный экспорт vApp из vCloud Director
set -euo pipefail
export OVFTOOL=./ovftool
export VCD_HOST="vcd.provider.example"
export ORG="ORG_NAME"
export VDC="VDC_NAME"
export VCD_USER="USERNAME"
export OUT_DIR=./export
NJOBS=3 # сколько vApp выгружать одновременно
read -rsp "Пароль vCloud (спецсимволы в URL-кодировке): " VCD_PASS; echo
export VCD_PASS
mkdir -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_vapp
grep -v '^[[:space:]]*$' vmlist | xargs -P "$NJOBS" -I{} bash -c 'export_vapp "$1"' _ {}
3. Выполнить проверку и загрузить в S3
Перед загрузкой сверьте контрольные суммы скачанных файлов с .mf.
Скрипт ниже проверяет каждую ВМ, загружает проверенные файлы в S3, сверяет загруженное с локальным и переносит обработанные каталоги в ./export/processed:
#!/usr/bin/env bash
# check-and-upload.sh - проверка SHA-256 по .mf и загрузка в хранилище
set -euo pipefail
EXPORT_DIR=./export
REMOTE="selectel:vm-images" # подключение rclone:контейнер
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
Rclone сверяет размер и контрольную сумму файлов. Для очень больших файлов, которые загружаются в хранилище частями, общей контрольной суммы может не быть – тогда rclone check сравнивает только размер. Целостность самих данных в любом случае гарантирует проверка SHA-256 до загрузки.
Если экспорт падает с ошибкой
При экспорте vCloud сначала сохраняет образ ВМ у себя.
У небольших провайдеров на хосте виртуализации может не хватить места под ВМ с большими дисками, и задание завершится ошибкой.
Тогда диски можно выгрузить по сети через 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"Здесь:
bs=32M- размер блока, на практике оптимальный по скорости;pv -qL 90Mограничивает передачу 90 МБ/с, чтобы оставить часть канала другим ВМ. На принимающей стороне вместо файла можно сразу писать на диск, напримерof=/dev/sda.
-
Сверьте контрольные суммы исходного диска и полученного образа. Используйте SHA-256, а не MD5 - он надежнее:
sha256sum /dev/sda # на исходной ВМsha256sum /data/VM_NAME.raw # на принимающем сервереЕсли суммы совпали, данные перенесены без потерь.
Подробнее о побайтовом копировании, в том числе о том, как продолжить прерванную передачу, в инструкции Перенос Linux-сервера полной копией диска.
4. Импорт в облачную платформу
В современных дистрибутивах Linux есть драйверы virtio и cloud-init, поэтому такие ВМ обычно импортируются и запускаются без доработок. Для полной совместимости выполните рекомендации по импорту образов из документации Selectel.
-
Загрузите образ диска в панели управления в раздел Образы. Образы больше 100 ГБ удобнее загружать через OpenStack CLI:
openstack image create --disk-format vmdk --container-format bare \--file VM_NAME-disk1.vmdk VM_NAME -
Создайте сервер из образа и проверьте работу сервисов.
6. Подготовить ВМ Windows
Чтобы Windows запустилась в облачной платформе, драйверы virtio нужно поставить в исходную ВМ до экспорта образа системного диска.
- Скачайте ISO-образ с драйверами: virtio-win.iso.
- Подключите образ в исходной ОС.
- Установите все драйверы и в согласованное время перезагрузите сервер.
- Экспортируйте ВМ и добавьте ее в облачную платформу как образ-источник.
Перед массовым переносом стоит проверить порядок действий на одной некритичной ВМ Windows.
7. Переезд в облако на базе VMware в Selectel
Если вы хотите остаться на VMware, способ переезда в облако на базе VMware в Selectel зависит от того, где сейчас находится инфраструктура: