---
title: 'Перенести ВМ из облака VMware другого провайдера в облачную платформу Selectel'
sidebar_label: 'Перенести ВМ из облака VMware другого провайдера'
sidebar_position: 6
description: 'Как устроена миграция из облака VMware, как перенести данные'
---

import Formbricks from '@theme/MDXComponents/Formbricks'
import {CustomTable} from '@selectel/docux/components'

# Перенести ВМ из облака VMware другого провайдера в облачную платформу Selectel

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

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

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

:::info

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

:::

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

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

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

3. [Создайте бакет](/s3/buckets/create-bucket.mdx) в S3 Selectel.

4. [Настройте Rclone](/s3/tools/rclone.mdx) для работы с бакетом:

   ```bash
   [selectel]
   type = s3
   provider = Other
   access_key_id = ACCESS_KEY
   secret_access_key = SECRET_KEY
   endpoint = https://s3.ru-1.storage.selcloud.ru
   region = ru-1
   ```

5. Для ВМ на Windows установите драйверы virtio (этап 6).

## 2. Экспортировать ВМ

### Одна ВМ

Если машин немного, экспорт удобно запускать вручную для каждой ВМ.
Запустите экспорт:

```bash
./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"
```

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Параметр</th>
        <th>Назначение</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <th>`--powerOffSource`</th>
        <td>Выключить ВМ перед экспортом</td>
      </tr>

      <tr>
        <th>`vcd.provider.example`</th>
        <td>Адрес vCloud Director исходной площадки</td>
      </tr>

      <tr>
        <th>`org=`, `vdc=`, `vapp=`</th>
        <td>Организация, виртуальный дата-центр и имя vApp</td>
      </tr>

      <tr>
        <th>`--X:logFile`, `--X:logLevel`</th>
        <td>Журнал и уровень логирования (none, quiet, panic, error, warning, info, verbose, trivia)</td>
      </tr>

      <tr>
        <th>`--parallelThreads`</th>
        <td>Число потоков, от 1 до 100, но не больше числа ядер CPU минус одно</td>
      </tr>

      <tr>
        <th>`--X:progressSmoothing`</th>
        <td>Интервал сглаживания оценки времени загрузки, секунды (по умолчанию 60)</td>
      </tr>

      <tr>
        <th>`--X:vCloudTimeout`</th>
        <td>Сколько ждать ответа vCloud на этапе подготовки экспорта. Важно для больших ВМ</td>
      </tr>

      <tr>
        <th>`--X:vCloudKeepAliveTimeout`</th>
        <td>Сколько держать соединение с vCloud. Важно для больших ВМ</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

Параметры вида `--X:...` и `--parallelThreads` указываются до адреса vCloud Director.
Спецсимволы в пароле нужно закодировать для URL: например, `@` записывается как `%40`.

В результате в каталоге появятся файлы:

* `.mf` — контрольные суммы SHA-256 файлов ВМ, посчитанные на стороне VMware;
* `.ovf` — описание ВМ в формате Open Virtualization Format;
* `.nvram` — настройки BIOS/UEFI;
* `.vmdk` — образы дисков. Они меньше, чем диски в vCloud Director, потому что при экспорте используется сжатие.

### Несколько ВМ

Если машин много, экспорт лучше запускать скриптом в несколько потоков.
Перечислите имена vApp в файле `vmlist`, по одному на строку, и положите скрипт рядом с `ovftool`:

```bash
#!/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`:

```bash
#!/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`.

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

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

   ```bash
   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`.

3. Сверьте контрольные суммы исходного диска и полученного образа. Используйте SHA-256, а не MD5 - он надежнее:

   ```bash
   sha256sum /dev/sda              # на исходной ВМ
   sha256sum /data/VM_NAME.raw     # на принимающем сервере
   ```

   Если суммы совпали, данные перенесены без потерь.

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

## 4. Импорт в облачную платформу

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

1. [Загрузите образ диска](/cloud-servers/images/create-image.mdx) в [панели управления](https://my.selectel.ru/vpc/default/images) в раздел **Образы**. Образы больше 100 ГБ удобнее загружать через OpenStack CLI:

   ```bash
   openstack image create --disk-format vmdk --container-format bare \
     --file VM_NAME-disk1.vmdk VM_NAME
   ```

2. [Создайте сервер](/cloud-servers/create/create-server.mdx) из образа и проверьте работу сервисов.

## 6. Подготовить ВМ Windows

Чтобы Windows запустилась в облачной платформе, драйверы virtio нужно поставить в исходную ВМ до экспорта образа системного диска.

1. Скачайте ISO-образ с драйверами: [virtio-win.iso](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso).
2. Подключите образ в исходной ОС.
3. Установите все драйверы и в согласованное время перезагрузите сервер.
4. Экспортируйте ВМ и добавьте ее в облачную платформу как образ-источник.

Перед массовым переносом стоит проверить порядок действий на одной некритичной ВМ Windows.

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

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

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Где сейчас</th>
        <th>Способ миграции</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <th>Своя площадка на VMware с vCenter</th>
        <td>VMware Cloud Director Availability</td>
      </tr>

      <tr>
        <th>Своя площадка на VMware без vCenter (например, бесплатный ESXi)</th>
        <td>VMware Cloud Director Availability, если развернуть пробную версию vCenter</td>
      </tr>

      <tr>
        <th>Своя площадка на Hyper-V, Proxmox и других платформах</th>
        <td>Veeam Agent</td>
      </tr>

      <tr>
        <th>Облако VMware другого провайдера</th>
        <td>Veeam Agent</td>
      </tr>

      <tr>
        <th>Облако VMware в Selectel, смена кластера или региона</th>
        <td>VMware Cloud Director Availability</td>
      </tr>

      <tr>
        <th>Облако VMware в Selectel, смена юрлица</th>
        <td>Перенос организации без простоя — по запросу в техподдержку</td>
      </tr>

      <tr>
        <th>Выделенные серверы или облачная платформа Selectel</th>
        <td>Veeam Agent</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

<Formbricks />
