Перейти к основному содержимому

Перенести виртуальную машину из облака VMware другого провайдера на облачный сервер в Selectel

Вы можете перенести данные на облачный сервер: экспортировать ВМ из vCloud Director, vSphere и ESXi и создать облачный сервер в Selectel.

Если вы хотите остаться на VMware и переехать в облако на базе VMware в Selectel, выберите способ миграции.

Как устроена миграция

ВМ выгружается из VMware в формате OVF вместе с дисками, проверяется по контрольным суммам, загружается в S3 Selectel и импортируется как образ. Большинство площадок vCloud открывают доступ по API — большинство операций выполняется из консоли и автоматизируется. Под ВМ понимается vApp целиком: экспортируются все ВМ, которые в него входят.

Работающую ВМ выгрузить нельзя, поэтому OVF Tool выключает ее перед экспортом. Заранее согласуйте окно обслуживания для каждой ВМ.

Перенести данные на облачный сервер

  1. Подготовьтесь к миграции.
  2. Для ВМ на Windows установите драйверы virtio.
  3. Экспортируйте ВМ в формат OVF.
  4. Проверьте файлы и загрузите их в S3.
  5. Создайте облачный сервер из образа.

1. Подготовиться к миграции

  1. У вашего провайдера VMware получите доступ к виртуальному дата-центру (vDC) с правами Organization Administrator.

  2. На сайте Broadcom (VMware) скачайте VMware OVF Tool и распакуйте его на компьютер или ВМ, где хватит места под образы дисков.

  3. Создайте бакет в S3 Selectel.

  4. Создайте сервисного пользователя с доступом к S3.

  5. Выдайте пользователю S3-ключ.

  6. Настройте Rclone для работы с бакетом:

    [selectel]
    type = s3
    provider = Other
    access_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.

  1. Скачайте ISO-образ с драйверами: virtio-win.iso.
  2. Подключите образ в исходной ОС.
  3. Установите все драйверы.
  4. В согласованное время перезагрузите сервер.

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, потому что при экспорте используется сжатие.

Несколько ВМ

  1. В файле vmlist перечислите имена vApp по одному на строку.

  2. В папке с файлом ovftool добавьте скрипт:

    #!/usr/bin/env bash
    # export-vapps.sh - параллельный экспорт vApp из vCloud Director
    set -euo pipefail

    export OVFTOOL=./ovftool
    export VCD_HOST="<provider_address>"
    export ORG="<org_name>"
    export VDC="<vdc_name>"
    export VCD_USER="<username>"
    export OUT_DIR=./export
    NJOBS=<vapp_amount>

    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"' _ {}

    Укажите:

    • <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. Важно для больших ВМ.
  3. Запустите скрипт. Скрипт запросит пароль vCloud.

  4. Введите пароль 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

Укажите:

Если экспорт падает с ошибкой

При экспорте vCloud сначала сохраняет образ ВМ у себя. Если у провайдера на хосте виртуализации не хватает места под ВМ с большими дисками, задание может завершиться ошибкой. Тогда диски можно выгрузить по сети через dd.

Подробнее о побайтовом копировании, в том числе о том, как продолжить прерванную передачу, — в инструкции Перенести данные Linux-сервера на облачный сервер Selectel с помощью dd.

  1. Загрузите ВМ с Rescue-образа, например Selectel Rescue.

  2. Скопируйте диск на принимающий сервер:

    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.
  3. На исходной ВМ посчитайте контрольную сумму диска. Используйте SHA-256, а не MD5:

    sha256sum <source_disk>

    Укажите <source_disk> — путь до исходного диска, например /dev/sda.

  4. На принимающем сервере посчитайте контрольную сумму образа:

    sha256sum <file_path>

    Укажите <file_path> — путь до полученного образа, который вы указали на шаге 2, например /data/<vm_name>.raw.

  5. Сравните значения контрольных сумм из шагов 3 и 4. Если суммы совпали, данные перенесены без потерь.

5. Создать облачный сервер из образа

В современных дистрибутивах Linux есть драйверы virtio и cloud-init, поэтому такие ВМ обычно импортируются и запускаются без доработок. Для полной совместимости выполните рекомендации по импорту образов.

  1. Загрузите образ диска в панели управления в раздел Образы. Образы больше 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> — имя образа, которое будет отображаться в панели управления.
  2. Создайте облачный сервер из образа.

  3. Проверьте работу сервисов.

Переезд в облако на базе VMware в Selectel

Если вы хотите остаться на VMware, способ переезда в облако на базе VMware в Selectel зависит от того, где сейчас находится инфраструктура:

Где сейчасСпособ миграции
Своя площадка на VMware с vCenterVMware Cloud Director Availability
Своя площадка на VMware без vCenter (например, бесплатный ESXi)VMware Cloud Director Availability, если развернуть пробную версию vCenter
Своя площадка на Hyper-V, Proxmox и других платформахVeeam Agent
Облако VMware другого провайдераVeeam Agent
Облако VMware в Selectel, смена кластера или регионаVMware Cloud Director Availability
Облако VMware в Selectel, смена юрлицаЧтобы перенести организацию без простоя, создайте тикет
Выделенные серверы или облачные серверы SelectelVeeam Agent