Самый нервный этап — вытащить машины из VMware и перегнать в формат, который поймёт Proxmox. Подходов было два, выбирали в зависимости от типа VM.
Большинство VM экспортировали через VMware ovftool, конвертировали через qemu-img:
# Установка ovftool (скачивается с VMware)
sudo sh VMware-ovftool-4.6.0-*.bundle
# Экспорт VM из vCenter/ESXi в формат OVA
ovftool --noSSLVerify \
'vi://admin@vsphere.local@vcenter.shitpolis.local/Datacenter/vm/billing-server' \
/export/billing-server.ova
# Распаковка OVA (это tar-архив)
tar xf /export/billing-server.ova -C /export/billing-server/
# Конвертация VMDK → qcow2
qemu-img convert -f vmdk -O qcow2 -p \
/export/billing-server/billing-server-disk1.vmdk \
/export/billing-server/billing-server-disk1.qcow2
# Проверка образа
qemu-img info /export/billing-server/billing-server-disk1.qcow2
# image: billing-server-disk1.qcow2
# file format: qcow2
# virtual size: 200 GiB
# disk size: 87.3 GiB (сжатие qcow2!)
Под пакетную конвертацию всех 25 VM написали скрипт — руками это делать нет никакого смысла:
#!/bin/bash
# /opt/scripts/batch-convert.sh
EXPORT_DIR="/export"
OUTPUT_DIR="/converted"
for ova in ${EXPORT_DIR}/*.ova; do
VM_NAME=$(basename "$ova" .ova)
echo "[$(date)] Обработка: ${VM_NAME}"
mkdir -p "${OUTPUT_DIR}/${VM_NAME}"
# Распаковка
tar xf "$ova" -C "${OUTPUT_DIR}/${VM_NAME}/"
# Конвертация всех VMDK
for vmdk in ${OUTPUT_DIR}/${VM_NAME}/*.vmdk; do
QCOW2="${vmdk%.vmdk}.qcow2"
echo " Конвертация: $(basename $vmdk)"
qemu-img convert -f vmdk -O qcow2 -p "$vmdk" "$QCOW2"
rm "$vmdk" # Удаляем VMDK после конвертации
done
echo "[$(date)] Готово: ${VM_NAME}"
done
Все 25 VM сконвертировались примерно за 6 часов. Узкое место — скорость чтения SAS-дисков, не сеть и не процессор.
Формат qcow2 выбрали осознанно. Thin provisioning — диск занимает ровно столько, сколько реально записано. Встроенные снапшоты. Совместимость с Proxmox Backup Server. Да, RAW на ZFS даёт плюс 5–10% к I/O — но для первой миграции qcow2 проще и надёжнее, а перегнать в RAW можно позже, когда всё устаканится.
После конвертации — импорт каждой VM в Proxmox. Процесс для каждой машины:
# Создание VM в Proxmox (пример для биллинг-сервера)
# VMID 101, 8 ядер, 32 ГБ RAM, UEFI boot
qm create 101 \
--name billing-server \
--memory 32768 \
--cores 8 \
--sockets 1 \
--cpu host \
--net0 virtio,bridge=vmbr1,tag=10 \
--ostype win10 \
--bios ovmf \
--efidisk0 vmpool:1,efitype=4m,pre-enrolled-keys=1 \
--scsihw virtio-scsi-single \
--machine q35
# Импорт qcow2-диска в ZFS-пул
qm importdisk 101 /converted/billing-server/billing-server-disk1.qcow2 vmpool
# Подключение диска к VM
qm set 101 --scsi0 vmpool:vm-101-disk-1,discard=on,iothread=1,ssd=1
# Установка загрузочного диска
qm set 101 --boot order=scsi0
# Добавление VirtIO драйверов ISO (для Windows)
qm set 101 --ide2 local:iso/virtio-win-0.1.240.iso,media=cdrom
С Linux-машинами всё прошло гладко — они поднялись сразу, потому что модули virtio встроены в ядро начиная с версии 2.6. А вот Windows потребовала отдельного внимания: после первого запуска пришлось устанавливать VirtIO-драйверы. Мы заранее подготовили ISO с драйверами, сертифицированными по программе Microsoft WHQL (Windows Hardware Quality Labs), — это принципиальный момент для стабильности в продакшне:
- VirtIO SCSI (диски)
- VirtIO Network (сеть)
- VirtIO Balloon (управление памятью)
- QEMU Guest Agent