====== Миграция виртуальных машин из Hyper-V в Proxmox ======

В этой публикации рассмотрим выполнение миграции виртуальных машин из Hyper-V в Proxmox (как ВМ первого поколения, так и ВМ второго поколения). Приведенная ниже последовательность действий покрывает основные типовые сценарии миграции. Поскольку дополнительных вводных при миграции может быть много, то маловероятно, что эту статью можно рассматривать как универсальную и всеобъемлющую.

[[https://pve.proxmox.com/wiki/Migrate_to_Proxmox_VE#HyperV|В руководстве от Proxmox]] не так много пояснительной информации о процессе миграции с Hyper-V. Поэтому постараемся наглядно показать весь процесс.

===== Исходные данные =====

Для тестового сценария создал несколько виртуальных машин.

==== Виртуальная машина 1. ====

{{ ::pve:c9389feab0a8c3bc9a03f.png?direct&600 |}}

==== Виртуальная машина 2. ====

{{ :pve:654f52759345e77a15ee0.png?direct&600 |}}

Немного забегая на перед скажу, что миграция виртуальных машин Linux чуть проще, т.к. драйвер для Virtio уже на есть на борту. Для виртуальных машин Windows этот драйвер нужно будет установить вручную.

В качестве исходного гипервизора Hyper-V выступал Windows Server 2022.

В качестве целевого гипервизора выступает Proxmox 7.2-7.

===== Предварительная подготовка =====

Шаги по предварительной подготовке виртуальных машин одинаковы, как для платформы Linux, так и для платформы Windows:
  - Создание копии vhd/vhdx диска.
  - Копирование vhd/vhdx диска на сервер Proxmox.

===== Создание копии vhd/vhdx диска =====

На самом деле здесь есть несколько вариантов. В зависимости от того, насколько возможен перерыв в работе виртуальной машины Hyper-V.

Итак, для создания копии диска есть следующие варианты:
  - Первый вариант самый оптимальный – вы просто останавливаете виртуальную машину и загружаете диски на сервер Proxmox. Этот метод обеспечит вам гарантированную целостность данных на диске. К тому же, если после этого вы не будите запуска ВМ на сервере Hyper-V, то по завершении миграции получите на Proxmox самую актуальную версию ВМ. И вам не нужно будет думать о том, как перенести дельту изменений виртуальной машины.
  - Если виртуальная машина критическая и нельзя выполнять её остановку, то вы можете [[https://learn.microsoft.com/en-us/windows-server/virtualization/hyper-v/deploy/export-and-import-virtual-machines#export-a-virtual-machine|выполнить экспорт виртуальной машины]]. В результате вы получите копию всех файлов работающей виртуальной машины Hyper-V, в т.ч. и виртуальных дисков. Недостаток этого метода в том, что выполняется экспорт всех дисков. Если какие-то из дисков нужно исключить, то это не ваш метод. Однако, именно этим методом пользовался я. Из своей практике скажу – я ни разу не получал “битых” дисков при использовании этого метода.
  - Если виртуальную машину останавливать нельзя и нужно выполнить экспорт только части дисков. (например, нужен только системный диск), то вы можете использовать утилиту [[https://learn.microsoft.com/en-us/sysinternals/downloads/disk2vhd|Disk2vhd]]. На своей практике я тоже её использовал довольно часто. Лично у меня проблем с консистенцией данных не было. Но это самый относительно ненадежный метод, т.к. на высоконагруженных системах есть шанс получить не совсем консистентные данные.

<WRAP center round tip 60%>
Повторюсь – я использовал метод №2.
</WRAP>

===== Копирование vhd/vhdx диска на сервер Proxmox =====

Это тоже относительно понятный шаг. Все, что вам нужно сделать – это скопировать виртуальный диск (или диски) на сервер Proxmox в локальную директорию. Инструмент для копирования можете использовать любой. Если вы выполняете копирования из среды Windows, то можете использовать [[https://winscp.net/eng/download.php|WinSCP]].

Если вы работаете в среде Linux, то можете использовать старую добрую утилиту scp. Формат команды для scp следующий:

<code bash>scp <source_vhdx> <proxmox_user>@<proxmox_ip>:<proxmox_folder_path></code>

Пример:

<code bash>scp tst-lin.vhdx root@10.10.10.20:/mnt/pve/HDD
scp tst-win.vhdx root@10.10.10.20:/mnt/pve/HDD</code>

По итогу вы должны увидеть ваши vhd(x) диски в директории на сервере Proxmox:

{{ :pve:image-16.png?direct&600 |}}

===== Создание виртуальных машин =====

После того, как вы выполнили конвертацию жестких дисков можно создавать виртуальные машины. Процесс настройки виртуальных машин после создания немного отличается. Для Linux машин особо дополнительных действий не требуется. Для машин Windows необходимо будет установить драйвер virtio. Но обо всех подробностях ниже.

==== Для ОС Linux ====

Итак, создает заготовку виртуальной машины для Linux:
  - Указываем сервер Proxmox (если у вас их несколько) и имя виртуальной машины: {{ :pve:image-19.png?direct&600 |}}
  - Указываем тип операционной системы – Linux. {{ :pve:image-20.png?direct&600 |}}
  - Далее необходимо указать ряд важных параметров:
      * Тип эмулируемого аппаратного обеспечения – я укажу i440fx.
      * Тип BIOS – выберу OVMF (UEFI) (т.к. исходная ВМ использовала UEFI BIOS).
      * Тип SCSI контроллера – VirtIO SCSI, т.к. его поддержка есть в Linux из коробки.
      * Также необходимо выбрать формат и хранилище для UEFI раздела.
      {{ :pve:image-31.png?direct&600 |}}
  - На странице конфигурации виртуальных дисков я удалю вообще все диски: {{ :pve:image-22.png?direct&600 |}}
  - Указываем количественные ресурсы процессора: {{ :pve:image-23.png?direct&600 |}}
  - Указываем количество оперативной памяти: {{ :pve:image-24.png?direct&600 |}}
  - И параметры сети: Обратите внимание на тип сетевого адаптера – VirtIO. Аналогично контроллеру SCSI его поддержка есть в Linux из коробки. {{ :pve:image-25.png?direct&600 |}}
  - На странице со сводными параметрами создаваемой виртуальной машины нажмите кнопку “Finish“.
  - Импортируем виртуальный жесткий диск: <code bash>qm importdisk 104 /mnt/pve/HDD/tst-lin.vhdx NVMe</code> Формат команды следующий:<code bash>qm importdisk <vmid> <source> <storage> </code>
  - После этого в настройках виртуальной машины у на должен появиться неиспользуемый виртуальный жесткий диск:
  - Перейдем в настройки виртуального жесткого диска (кнопка “Edit“) и добавим его в используемые диски виртуальной машиной (кнопка “Add“):
  - Также убедитесь, что в настройках виртуальной машины новый диск из п. 11 используется в качестве загрузочного диска:
  - Вот теперь вы можете попробовать запустить виртуальную машину на сервере Proxmox:

По крайней мере в моем случае результат был положительный. Единственный нюанс с которым я столкнулся – это то, что сетевой интерфейс был переименован с eth0 на ens18. Соответственно, нужно было скорректировать файл с настройками сети и изменить имя адаптера на ens18: <code bash>nano /etc/netplan/00-installer-config.yaml</code>
И изменить имя сетевого адаптера:

И применить изменения в конфигурации сети: <code bash>netplan apply</code>

После этого виртуальная машина успешно получила IP адрес от сервера DHCP: