Перенос VM с XenServer на Hyper-V: экспорт, конвертация VHDX и запуск
Ниже — практический сценарий переноса одной виртуальной машины с XenServer/Citrix Hypervisor на Hyper-V. Основной принцип: исходная VM остаётся нетронутой, диски конвертируются только из копии, а первый запуск выполняется в изолированной сети.
1. Инвентаризация исходной VM
xe vm-list name-label='APP01' params=uuid,name-label,power-state,VCPUs-at-startup,memory-static-max,HVM-boot-policy,platform
VM_UUID=$(xe vm-list name-label='APP01' --minimal)
xe vm-disk-list uuid="$VM_UUID"
xe vif-list vm-uuid="$VM_UUID" params=uuid,device,MAC,network-name-labelСохраните IP, VLAN, MAC, CPU, RAM, порядок дисков, режим загрузки и сервисы внутри гостя. Для Windows также запишите редакцию ОС и состояние активации.
2. Проверяем гостевую ОС перед остановкой
Linux:
lsblk -f
findmnt
cat /etc/fstab
ip -br a
ip route
systemctl --failed
dmesg | grep -Ei 'xen|hv_' | tail -50Windows PowerShell:
Get-ComputerInfo | Select WindowsProductName,WindowsVersion,OsArchitecture,BiosFirmwareType
Get-NetIPConfiguration
Get-Disk
Get-Partition
Get-Service | Where-Object Status -eq Running3. Создаём backup и выключаем VM
xe vm-shutdown uuid="$VM_UUID"
xe event-wait class=vm uuid="$VM_UUID" power-state=halted
xe vm-list uuid="$VM_UUID" params=power-stateНе используйте suspend для финальной миграции. Для консистентного экспорта VM должна быть корректно выключена.
4. Экспортируем VM
xe vm-export vm="$VM_UUID" filename=/mnt/export/APP01.xva
ls -lh /mnt/export/APP01.xva
sha256sum /mnt/export/APP01.xva > /mnt/export/APP01.xva.sha256
sha256sum -c /mnt/export/APP01.xva.sha256XVA — резервный экспорт XenServer, но Hyper-V не импортирует его напрямую. Для миграции нужен отдельный экспорт/извлечение виртуальных дисков в VHD либо другой формат, который можно конвертировать. Не удаляйте XVA: это дополнительная точка отката.
5. Подготавливаем диск для Hyper-V
Если после экспорта или извлечения у вас уже есть обычный .vhd, копируем его на Hyper-V и проверяем:
Get-FileHash D:\Migration\APP01\disk0.vhd -Algorithm SHA256
Get-VHD D:\Migration\APP01\disk0.vhd | Format-List *Конвертация выполняется offline: диск не должен быть подключён к работающей VM.
Convert-VHD \
-Path 'D:\Migration\APP01\disk0.vhd' \
-DestinationPath 'D:\Hyper-V\APP01\disk0.vhdx' \
-VHDType Dynamic
Get-VHD 'D:\Hyper-V\APP01\disk0.vhdx' | Format-List Path,VhdFormat,VhdType,FileSize,Size6. Определяем Generation 1 или Generation 2
- Legacy BIOS/MBR — обычно Generation 1;
- UEFI/GPT — обычно Generation 2;
- поколение VM после создания изменить нельзя;
- для старого Linux временно отключите Secure Boot либо выберите подходящий template.
7. Создаём изолированный vSwitch
New-VMSwitch -Name 'Migration-Isolated' -SwitchType Private
Get-VMSwitch -Name 'Migration-Isolated'8. Создаём Generation 1 VM
New-VM -Name 'APP01-MIGRATION' \
-Generation 1 \
-MemoryStartupBytes 4GB \
-VHDPath 'D:\Hyper-V\APP01\disk0.vhdx' \
-SwitchName 'Migration-Isolated'
Set-VMProcessor -VMName 'APP01-MIGRATION' -Count 4
Get-VM 'APP01-MIGRATION' | Format-List *Для Gen1 загрузочный диск должен быть подключён к IDE-контроллеру. Если VM не загружается, проверьте его положение:
Get-VMHardDiskDrive -VMName 'APP01-MIGRATION'9. Создаём Generation 2 VM
New-VM -Name 'APP01-MIGRATION' \
-Generation 2 \
-MemoryStartupBytes 4GB \
-VHDPath 'D:\Hyper-V\APP01\disk0.vhdx' \
-SwitchName 'Migration-Isolated'
Set-VMProcessor -VMName 'APP01-MIGRATION' -Count 4
Set-VMFirmware -VMName 'APP01-MIGRATION' -EnableSecureBoot Off
Get-VMFirmware -VMName 'APP01-MIGRATION'10. Первый запуск
Start-VM 'APP01-MIGRATION'
Get-VM 'APP01-MIGRATION'
Get-VMNetworkAdapter -VMName 'APP01-MIGRATION'Откройте консоль через Hyper-V Manager. Не подключайте production vSwitch, пока исходная VM может быть запущена.
11. Проверки внутри Linux-гостя
lsblk -f
findmnt --verify
systemctl --failed
ip -br a
ip route
dmesg | grep -Ei 'hyper-v|hv_' | tail -100
journalctl -b -p warning --no-pagerЕсли root filesystem не находится, загрузитесь с rescue ISO, проверьте initramfs, UUID в /etc/fstab и наличие драйверов Hyper-V.
12. Проверки внутри Windows-гостя
Get-PnpDevice | Where-Object Status -ne OK
Get-NetAdapter
Get-NetIPConfiguration
Get-Service vmic*
Get-WinEvent -LogName System -MaxEvents 100 | Where-Object LevelDisplayName -in 'Error','Warning'13. Cutover
- остановите исходную XenServer VM;
- выполните финальный backup данных приложения;
- подключите новую VM к нужному Hyper-V vSwitch;
- назначьте IP/VLAN;
- проверьте DNS, приложение, backup и мониторинг;
- не запускайте обе VM одновременно с одним hostname/IP.
Connect-VMNetworkAdapter -VMName 'APP01-MIGRATION' -SwitchName 'Production'
Get-VMNetworkAdapter -VMName 'APP01-MIGRATION'14. Rollback
Stop-VM 'APP01-MIGRATION' -TurnOff
Disconnect-VMNetworkAdapter -VMName 'APP01-MIGRATION'
# На XenServer после проверки отсутствия конфликта:
xe vm-start uuid="$VM_UUID"Критерий успеха: новая VM загружается в правильном режиме BIOS/UEFI, диски и файловые системы целы, сеть и приложения проходят тесты, backup/monitoring работают, а исходная VM и XVA сохранены до окончания периода наблюдения.