Pull to refresh

Comments 9

У Вас присутствовало пофайловое копирование исходного диска на новый… а нельзя было создать софт рейд уровня 1, а потом «разбить зеркало», и подключить его половинку к новой машине?

Привет! Это слишком сложно и замороченно. Поэтому я такой способ не выбрал. В моем случае хотелось обойтись штатными средствами Hyper-V и при этом не менять оригинальный VHDX, поэтому Production checkpoint оказался наиболее простым способом зафиксировать его состояние.

А как вообще современная винда относится к таким переездам? Раньше рекомендовалось делать sysprep, чтобы она отвязалась от аппаратных идентификаторов и при следующей загрузке привязалась к новым. На горячую это, конечно, нельзя было сделать.

А ничего не поменялось. Если очень нужно то так же нужно удалять драйвера, подготавливать к вирт окружению и выключать, исходя из того что включаться образ уже будет в виртуальном окружении. В случае же статьи и вырожденного случая конверта виртуальной в виртуалку - все проще, о чем ТС и пишет.

Все отлично переехало и без sysprep.
Sysprep - это доп.настройка, ввод в домен и прочее. В данном случае это не надо.

Поднимаем на Proxmox smb 3.x шару, на hyper- v мигрируем vhdx на неё, интегрируем через dism драйвера. Запускаем на новом месте

Скорее всего так и есть, но без тестов и конкретного кейса это теория. У меня не стояла задача, придумать все варианты. Мне надо было просто максимально быстро и безболезненно перенести ВМ с одного гипервизора на другой. На проверку гипотез и выбор лучшего варианта времени не было.
В конце концов, выбранный вариант рабочий, поэтому и решил поделиться.
Спасибо за приведенный альтернативный вариант. Если будет аналогичная задача опробую и ваш путь.

Мигрирую с Vmware через промежуточный NFS датастор который подключен к VMware и Proxmox одновременно:

Подробное описание этапов

Плейбук выполняется в 63 задачи, сгруппированные в 12 логических блоков. Ниже — подробный разбор каждого блока.

Блок 1 — Discovery (только чтение, выполняется всегда)

ЗадачаЧто делаетVMware | Inspect VMsgovc vm.info -json собирает: имя, BIOS (efi/bios), cores, memory, IP из VMware Tools, MAC-адреса всех NIC, портгруппы, пути к VMDK-дискам, и guestFullName (строка ОС из VMware Tools — используется для авто-определения win11)VMware | Collect unique dvPortGroup keysРезолвит ключи distributed portgroup (dvPortGroup-XXXX) в человекочитаемые имена (DPortGroup-VLAN(13)) одним batch-запросом на все ВМBuild windows_vmsСобирает финальную структуру данных на каждую ВМ: имя, VMID, bios, cores, memory, MAC, bridge/vlan (из имени портгруппы или ручного маппинга), IP, диски, snapshot-имя, и вычисленный ostype (см. раздел Автоопределение типа ОС)Assert: VM name + NIC + disks resolvedВалидация — не даёт продолжить если что-то не резолвилось (пустой MAC, нет дисков и т.д.)

Блок 2 — VMID allocation

ЗадачаЧто делаетProxmox | Allocate VMIDpvesh get /cluster/nextid — тот же механизм что использует Proxmox GUI. Отслеживает уже выделенные ID в рамках одного запуска плейбука, чтобы не выдать два одинаковых VMID при батч-миграции нескольких ВМ подряд

Блок 3 — GuestOps подготовка (через VMware Tools)

ЗадачаЧто делаетGuestOps | mkdir migration dirСоздаёт C:\Temp в гостевой ОС. retries: 10, delay: 5 — VMware Tools может быть ещё не готов сразу после старта ВМGuestOps | Upload PS scriptsЗагружает 5 PowerShell-скриптов (килобайты) через govc guest.upload. Важно: архив с драйверами (virtio-drivers.zip, 30-40 МБ) больше НЕ загружается — драйверы идут через ISO (см. ниже)GuestOps | Mount virtio-win ISO as CD-ROMgovc device.cdrom.insert + govc device.connect монтирует virtio-win.iso с NFS-датастора как CD-ROM. Мгновенно — нет передачи по сетиGuestOps | Run preparation scriptЗапускает guestops-prepare-windows.ps1 (см. описание скрипта ниже)Pull network-before.jsonЗабирает сохранённые сетевые параметры ВМ (IP/маска/шлюз/DNS) с гостя на Ansible-хост для дальнейшего использования на Proxmox-стороне

Блок 4 — Snapshot и svMotion

ЗадачаЧто делаетVMware | List/remove old snapshotsУдаляет снапшоты от предыдущих неудачных попыток миграции этой же ВМVMware | Create snapshotСоздаёт снапшот pre-proxmox-migration-YYYYMMDD-HHmmss (страховка перед cutover)GuestOps | Eject virtio-win ISO before svMotionОтключает и извлекает ISO — VMware не даст перенести ВМ с примонтированным файлом с датастораVMware | svMotion to stagingПеремещает VMDK на NFS staging-датастор, видимый и vSphere, и Proxmox

Блок 5 — Cutover gate + GuestOps cleanbreak

ЗадачаЧто делаетCutover gateSafety gate. Если execute_cutover=false — плейбук останавливается здесь с понятным сообщением. Всё что выше (подготовка драйверов, snapshot, svMotion) уже выполнено, но сама ВМ ещё не выключена и не тронута необратимоGuestOps | CleanBreak (remove VMware Tools) + shutdownЗапускает guestops-cleanbreak-shutdown.ps1 — нейтрализует VMware Tools, освобождает IP, выключает ВМ (подробности ниже)VMware | Wait poweredOffЖдёт до 5 минут корректного выключения, затем принудительно останавливает если не выключилась сама

Блок 6 — Создание ВМ в Proxmox

ЗадачаЧто делаетProxmox | Create shell VM if missingqm create с параметрами: cpu=host, machine=q35, scsihw=virtio-scsi-single, agent=enabled=1, --ostype берётся индивидуально для каждой ВМ (win10/win11), сетевой адаптер virtio с нужным bridge/VLAN/MACProxmox | Add EFI disk (UEFI only, once)Если BIOS=ovmf — добавляет efidisk0 (pre-enrolled-keys=0 для совместимости с Secure Boot)Proxmox | Add vTPM for Win11 (swtpm v2.0)Если ostype=win11 и BIOS=ovmf — автоматически добавляет tpmstate0 (программный TPM 2.0 через Proxmox swtpm). Не выполняется для win10

Блок 7 — Импорт диска и Phase A boot

ЗадачаЧто делаетProxmox | Import disk from stagingqm disk import конвертирует VMDK → формат хранилища (Ceph RBD)Proxmox | Attach dummy disk (scsi0) + main disk (sata0)Основной диск подключается как sata0 (загрузка через встроенный AHCI-контроллер), плюс создаётся временный 1 ГБ "dummy" диск как scsi0 — единственная цель этого диска: заставить Windows через PnP обнаружить virtio-scsi контроллер и установить vioscsi.sysProxmox | Start VM (Phase A)Запускает ВМ в конфигурации Phase AProxmox | Phase A: wait for QGAЖдёт до 90 попыток × 10 сек = 15 минут появления QEMU Guest Agent. Долгий таймаут учитывает возможную установку Windows Update при первой загрузке с рестартомProxmox | Verify vioscsi RunningЧерез QGA проверяет что служба vioscsi действительно поднялась (значит PnP отработал и драйвер встал)

Блок 8 — Настройка сети через QGA

ЗадачаЧто делаетQGA | Configure static IP on VirtIO-Net (retry-safe)Пушит и запускает qga-configure-network.ps1 с параметрами IP/маска/шлюз/DNS, взятыми из network-before.json. Адаптер не переименовывается (оставлен как есть). Результат подтверждается через маркер-файл qga-net-result.txt (устойчиво к разрыву virtio-serial канала во время смены IP)

Блок 9 — Phase B: flip дисков

ЗадачаЧто делаетProxmox | Phase B: flip disks SATA -> SCSIВыключает ВМ, удаляет dummy-диск scsi0, перемещает основной диск sata0 → scsi0, выставляет boot order=scsi0. Автоматически подчищает мелкие "unused"-диски (<2 ГБ) оставшиеся от dummy/efidiskProxmox | Start VM (Phase B - final boot)Финальный старт уже полностью на virtio-scsiProxmox | Phase B: wait for QGA (final boot)До 60 попыток × 10 сек = 10 минут ожидания финальной загрузки

Блок 10 — Пост-обработка внутри гостя

ЗадачаЧто делаетGuestOps | Push + run fix-vmtools-rdp-error.ps1Убирает vmtoolsd из автозагрузки — устраняет ошибку 0xc0000096 при входе по RDP после миграции

Блок 11 — Smoke-тест

ЗадачаЧто делаетSmoke | ICMP (best-effort)До 6 попыток × 5 сек пинга. failed_when: false — ICMP часто блокируется брандмауэром Windows, это не признак поломкиSmoke | Fallback - verify IP via QGA when ICMP failedЕсли пинг не прошёл — спрашивает у QGA напрямую (Get-NetIPAddress) есть ли нужный IP на интерфейсе. Это источник правды, не зависящий от файрволаSmoke | Report network status summaryПонятная сводка по каждой ВМ: ICMP OK / ICMP заблокирован (но сеть настроена)Smoke | TCP portsПроверка доступности портов из check_ports (по умолчанию 3389/RDP)

Блок 12 — Регистрация в Proxmox HA

ЗадачаЧто делаетHA | Register VM in Proxmox HAha-manager add vm:VMID --state started. Идемпотентно — пропускает если ВМ уже в HA. Можно отключить флагом -e enable_ha=falseHA | Verify HA status / HA | Show HA statusПроверяет и выводит текущий статус ВМ в HA-менеджере

промежуточный датастор позволяет быстро импортировать диск в скелет ВМ , к тому же ВМ все лежат на VSAN а Proxmox не поддерживает миграцию с VSAN поэтому он выручает, все задачи с гостевой ОС по максимуму делаю через VMGuesttools и Qemu guest agent тогда не нужно открывать порты SSH, WinRM и можно мигрировать с выключенной сетью, к примеру clone или как вы для проверки

Sign up to leave a comment.

Articles