Задача: перенести виртуальную машину с Xen или KVM на VMware Workstation или ESXi без переустановки системы. Пересоздавать машину и переносить данные вручную не нужно — достаточно сконвертировать образ диска в формат VMDK и подключить его к новой ВМ.
Коротко: остановите ВМ и выполните qemu-img convert -p -f raw -O vmdk disk.img disk.vmdk (для образов KVM обычно -f qcow2). Для ESXi или упаковки в OVA используйте -o subformat=streamOptimized, для Workstation подойдёт формат по умолчанию monolithicSparse. С Windows-гостями заранее решите вопрос с драйвером дискового контроллера, иначе система не загрузится.
Подготовка
Утилита qemu-img входит в пакет qemu-utils в Debian и Ubuntu и в пакет qemu-img в AlmaLinux и Rocky:
sudo apt install qemu-utils # Debian 12/13, Ubuntu 22.04/24.04
sudo dnf install qemu-img # AlmaLinux, Rocky 9–10
Перед конвертацией машину нужно выключить. Если копировать диск работающей ВМ, файловая система внутри окажется в несогласованном состоянии.
# KVM / libvirt
virsh shutdown vm01
virsh domblklist vm01 # путь к файлу диска
# Xen
xl shutdown vm01
grep disk /etc/xen/vm01.cfg
Места на целевом диске нужно не меньше, чем реально занято данными в образе. Посмотрите формат и размеры исходника:
qemu-img info /var/lib/libvirt/images/vm01.qcow2
В выводе важны три поля: file format — формат образа, virtual size — размер диска, который видит гость, disk size — сколько образ реально занимает на хосте.
Откуда брать образ
| Источник | Где лежит диск | Ключ -f |
|---|---|---|
| KVM / libvirt, Proxmox VE (на каталоговом хранилище) | файл .qcow2 | qcow2 |
| KVM с raw-образами | файл .img или .raw | raw |
| Xen с файловыми образами | файл .img | raw |
| Xen или KVM на LVM | логический том, например /dev/vg0/vm01-disk | raw |
| XenServer / XCP-ng | файл .vhd | vpc |
Ключ -f можно не указывать, тогда qemu-img определит формат сам. Но для raw-образов я всегда задаю его явно: так автоопределение не примет содержимое диска за заголовок другого формата.
Конвертация в VMDK
Базовая команда — та же, что работала у нас много лет на виртуалках с Windows. Для удобства добавлен индикатор прогресса -p:
qemu-img convert -p -f raw -O vmdk vm01.img vm01.vmdk
qemu-img convert -p -f qcow2 -O vmdk vm01.qcow2 vm01.vmdk
qemu-img convert -p -f raw -O vmdk /dev/vg0/vm01-disk vm01.vmdk
Формат VMDK в qemu-img поддерживает несколько параметров, они передаются через -o:
subformat— подформат VMDK:monolithicSparse(по умолчанию),monolithicFlat,twoGbMaxExtentSparse,twoGbMaxExtentFlat,streamOptimized;adapter_type— тип контроллера в дескрипторе:ide(по умолчанию),lsilogic,buslogic,legacyESX;compat6илиhwversion— версия виртуального оборудования VMware (вместе их указывать нельзя).
Какой подформат выбрать
monolithicSparse — один растущий файл. Его без доработки открывают VMware Workstation и Player. streamOptimized — сжатый формат для передачи по сети и упаковки в OVF/OVA, обычно получается самым компактным. monolithicFlat — дескриптор плюс файл данных полного размера.
qemu-img convert -p -f qcow2 -O vmdk \
-o subformat=streamOptimized,adapter_type=lsilogic \
vm01.qcow2 vm01.vmdk
ESXi хранит диски на VMFS в своём формате, поэтому «настольный» VMDK после загрузки в datastore обычно нужно преобразовать штатной утилитой ESXi, например в тонкий диск:
vmkfstools -i /vmfs/volumes/datastore1/vm01/vm01.vmdk \
/vmfs/volumes/datastore1/vm01/vm01-esxi.vmdk -d thin
Проверка результата
qemu-img info vm01.vmdk
qemu-img compare -f qcow2 -F vmdk vm01.qcow2 vm01.vmdk
qemu-img info должен показать file format: vmdk и тот же virtual size, что у исходника. qemu-img compare сравнивает содержимое двух образов и при совпадении пишет «Images are identical.» На больших дисках сравнение идёт долго, но для важных машин я его не пропускаю.
Windows: драйвер дискового контроллера
Главная проблема переноса Windows — не формат файла, а драйвер загрузочного контроллера. В KVM диск часто подключён через VirtIO (драйверы viostor или vioscsi), а в VMware его увидят как SATA, LSI Logic SAS или PVSCSI. Если драйвер нового контроллера не включён на этапе загрузки, Windows падает с ошибкой INACCESSIBLE_BOOT_DEVICE.
Как я делаю:
- Ещё в KVM переключаю системный диск с VirtIO на SATA (в libvirt —
bus='sata'в описании диска,virsh edit vm01) и проверяю, что Windows загружается. Драйвер AHCI встроен в Windows, поэтому после этой проверки диск запустится и в VMware. - Если на SATA Windows не стартует, загружаю её в безопасном режиме: перед выключением в KVM выполняю
bcdedit /set {current} safeboot minimal, загружаюсь уже с SATA-контроллером, затемbcdedit /deletevalue {current} safebootи обычная перезагрузка. - В VMware создаю ВМ с контроллером SATA или LSI Logic SAS и подключаю сконвертированный диск. На PVSCSI переключаю уже после установки VMware Tools — в них есть его драйвер.
- После первой загрузки удаляю гостевые утилиты VirtIO и QEMU Guest Agent и ставлю VMware Tools.
Сетевая карта тоже сменится (VirtIO → E1000E или VMXNET3), поэтому статический IP придётся задать заново. Windows может запросить повторную активацию. Linux-гости переносятся проще: драйверы AHCI и LSI обычно уже есть в initramfs, но имя сетевого интерфейса может поменяться, и сеть придётся поправить. Как устроены драйверы VirtIO в Windows, подробно описано в статье Windows в KVM и Proxmox: драйверы VirtIO.
Обратная конвертация: VMDK в qcow2 или raw
Для переезда с VMware на KVM или Proxmox та же утилита работает в обратную сторону:
qemu-img convert -p -f vmdk -O qcow2 vm01.vmdk vm01.qcow2
qemu-img convert -p -f vmdk -O raw vm01.vmdk vm01.raw
Если диск ESXi состоит из дескриптора vm01.vmdk и файла данных vm01-flat.vmdk, указывайте дескриптор, а оба файла держите в одном каталоге. Снимки (файлы вида vm01-000001.vmdk) перед выгрузкой лучше удалить с объединением, чтобы конвертировать один цельный диск. Для Windows путь обратный: сначала загрузка на SATA, затем установка драйверов VirtIO. Другие операции с образами — создание, изменение размера, снимки — собраны в статье qemu-img: создание и конвертация образов дисков.
Частые вопросы
Можно ли конвертировать диск работающей ВМ?
Технически qemu-img прочитает файл, но копия будет несогласованной, как после внезапного отключения питания. Выключите машину или конвертируйте из снимка, сделанного средствами гипервизора.
Почему VMDK получился больше или меньше исходного образа?
Разреженные подформаты (monolithicSparse, streamOptimized) не хранят пустые области, поэтому VMDK обычно меньше raw-образа. Если внутри гостя много удалённых, но не обнулённых данных, они тоже копируются, и файл получается крупнее, чем ожидалось. Ориентируйтесь на virtual size: он должен совпадать.
Windows после переноса уходит в синий экран INACCESSIBLE_BOOT_DEVICE. Что делать?
Проще всего подключить диск в VMware к контроллеру IDE или SATA. Если не помогает, верните диск в KVM, загрузитесь на SATA-контроллере (при необходимости через безопасный режим, как описано выше) и сконвертируйте образ заново.