Ошибка при преобразовании виртуального диска VmWare в HyperV
Я получил изображение VmWare от моего клиента для некоторых целей тестирования. Мне нужно преобразовать его в Hyper-V.
Я выполнил шаги в http://www.askme4tech.com/how-convert-vmware-virtual-machine-hyper-v. Я установил Microsoft Virtual Machine Converter и начал конвертировать виртуальные диски в PowerShell. Однако я получаю eror:
C:\Windows\system32> ConvertTo-MvmcVirtualHardDisk -SourceLiteralPath "c:\temp\disk2.vmdk" -DestinationLiteralPath "c:\data\HyperV\PH\" -VhdType DynamicHardDisk -VhdFormat Vhdx
ConvertTo-MvmcVirtualHardDisk : The entry 1 is not a supported disk database entry for the descriptor.
At line:1 char:1
+ ConvertTo-MvmcVirtualHardDisk -SourceLiteralPath "c:\temp\disk2.vmdk"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : WriteError: (Microsoft.Accel...nversionService:DriveConversionService) [ConvertTo-MvmcVirtualHardDisk], VmdkDescriptorParseException
+ FullyQualifiedErrorId : DiskConversion,Microsoft.Accelerators.Mvmc.Cmdlet.Commands.ConvertToMvmcVirtualHardDiskCommand
ConvertTo-MvmcVirtualHardDisk : One or more errors occurred.
At line:1 char:1
+ ConvertTo-MvmcVirtualHardDisk -SourceLiteralPath "c:\temp\disk2.vmdk"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : WriteError: (Microsoft.Accel...nversionService:DriveConversionService) [ConvertTo-MvmcVirtualHardDisk], AggregateException
+ FullyQualifiedErrorId : DiskConversion,Microsoft.Accelerators.Mvmc.Cmdlet.Commands.ConvertToMvmcVirtualHardDiskCommand
Ответы
Ответ 1
Я нашел некоторое решение adhoc - возможно, немного взломанный, но он работает как минимум.
В поисках похожих проблем я пришел к инструменту для извлечения дескриптора диска из файла VMDK. Содержимое дескриптора для моего VMDK было примерно таким:
# Disk DescriptorFile
version=1
encoding="windows-1252"
CID=5379bf0f
parentCID=ffffffff
isNativeSnapshot="no"
createType="monolithicSparse"
# Extent description
RW 209715200 SPARSE "00054_C8PHS1096_151216-disk2.vmdk"
# The Disk Data Base
#DDB
ddb.adapterType = "lsilogic"
ddb.geometry.biosCylinders = "13054"
ddb.geometry.biosHeads = "255"
ddb.geometry.biosSectors = "63"
ddb.geometry.cylinders = "13054"
ddb.geometry.heads = "255"
ddb.geometry.sectors = "63"
ddb.longContentID = "64d4e008b7227bcce8aa54995379bf0f"
ddb.toolsInstallType = "1"
ddb.toolsVersion = "10241"
ddb.uuid = "60 00 C2 96 f7 70 f2 fd-b5 02 9e 46 6c df 00 2e"
ddb.virtualHWVersion = "10"
Сообщение об ошибке вместе с содержимым извлеченного дескриптора привлекло мое внимание, в частности строка:
ddb.toolsInstallType = "1"
поскольку он содержит странное значение 1
из моего сообщения об ошибке. Я отредактировал дескриптор - просто закомментируйте, что одна строка с #
(хэш-метка), ввела его обратно в VMDK и вуаля - теперь выполняется преобразование.
Кредиты на эту ссылку https://communities.vmware.com/thread/343214?start=0&tstart=0 и, конечно же, инструменты Дариуша Станислава.
Просто для справки, сделанные шаги:
- скачать и извлечь dsfok tools
- используйте
dsfo.exe "c:\temp\disk2.vmdk" 512 1024 descriptor1.txt
для извлечения дескриптора
- отредактируйте файл дескриптора в Notepad ++: прокомментируйте вышеупомянутую строку (поскольку я добавил дополнительный одиночный символ (
#
), я также удалил один символ NULL
с конца, чтобы сохранить размер файла 1024 байта (не уверен если это необходимо).
- используйте
dsfi.exe "c:\temp\disk2.vmdk" 512 1024 descriptor1.txt
, чтобы вставить дескриптор обратно в VMDK
- повторите эти шаги для другого диска (моя VM имеет два файла .vmdk)
- переиздайте команду
ConvertTo-MvmcVirtualHardDisk
З
После создания VM в Hyper-V машина не загрузилась, она осталась на черном экране с быстрым мигающим курсором (так называемый черный экран смерти). Я не знаю, вызвано ли это преобразованием или тем фактом, что оригинальные диски в VMWare были SCSI, а я прикреплял их как IDE. Чтобы исправить это, я подключил DVD с изображением Windows и загрузился с DVD. Я запустил систему Rapair, запустил командную строку и запустил
bootrec.exe/fixBoot
Наконец, VM загружается и запускается. конец истории.
Ответ 2
У меня тоже возникла проблема с преобразованием образа VMWare в VHD. Мое решение похоже на eXavier, но я смог сделать это только с помощью текстового редактора.
Причина, по которой я мог бы сделать более простое исправление, заключалась в том, что vmdk, который я получил из VMWare, был небольшим текстовым файлом, который ссылался на ряд других файлов. Это выглядело так:
# Disk DescriptorFile
version=1
encoding="windows-1252"
CID=4bd4d907
parentCID=ffffffff
isNativeSnapshot="no"
createType="twoGbMaxExtentSparse"
# Extent description
RW 8323072 SPARSE "Windows Server 2012-s001.vmdk"
RW 8323072 SPARSE "Windows Server 2012-s002.vmdk"
RW 8323072 SPARSE "Windows Server 2012-s003.vmdk"
RW 8323072 SPARSE "Windows Server 2012-s004.vmdk"
RW 8323072 SPARSE "Windows Server 2012-s005.vmdk"
RW 8323072 SPARSE "Windows Server 2012-s006.vmdk"
RW 8323072 SPARSE "Windows Server 2012-s007.vmdk"
RW 8323072 SPARSE "Windows Server 2012-s008.vmdk"
RW 8323072 SPARSE "Windows Server 2012-s009.vmdk"
RW 8323072 SPARSE "Windows Server 2012-s010.vmdk"
RW 8323072 SPARSE "Windows Server 2012-s011.vmdk"
RW 8323072 SPARSE "Windows Server 2012-s012.vmdk"
RW 8323072 SPARSE "Windows Server 2012-s013.vmdk"
RW 8323072 SPARSE "Windows Server 2012-s014.vmdk"
RW 8323072 SPARSE "Windows Server 2012-s015.vmdk"
RW 983040 SPARSE "Windows Server 2012-s016.vmdk"
# The Disk Data Base
#DDB
ddb.adapterType = "lsilogic"
ddb.geometry.cylinders = "7832"
ddb.geometry.heads = "255"
ddb.geometry.sectors = "63"
ddb.longContentID = "439d288830654baf53d1f9594bd4d907"
ddb.toolsInstallType = "1"
ddb.toolsVersion = "10240"
ddb.uuid = "60 00 C2 97 21 a0 4e af-fc 21 68 15 2f 12 7f 22"
ddb.virtualHWVersion = "12"
Исправление заключалось в том, чтобы удалить строку базы данных #Disk и все ниже нее, используя текстовый редактор, чтобы мой файл выглядел так:
# Disk DescriptorFile
version=1
encoding="windows-1252"
CID=4bd4d907
parentCID=ffffffff
isNativeSnapshot="no"
createType="twoGbMaxExtentSparse"
# Extent description
RW 8323072 SPARSE "Windows Server 2012-s001.vmdk"
RW 8323072 SPARSE "Windows Server 2012-s002.vmdk"
RW 8323072 SPARSE "Windows Server 2012-s003.vmdk"
RW 8323072 SPARSE "Windows Server 2012-s004.vmdk"
RW 8323072 SPARSE "Windows Server 2012-s005.vmdk"
RW 8323072 SPARSE "Windows Server 2012-s006.vmdk"
RW 8323072 SPARSE "Windows Server 2012-s007.vmdk"
RW 8323072 SPARSE "Windows Server 2012-s008.vmdk"
RW 8323072 SPARSE "Windows Server 2012-s009.vmdk"
RW 8323072 SPARSE "Windows Server 2012-s010.vmdk"
RW 8323072 SPARSE "Windows Server 2012-s011.vmdk"
RW 8323072 SPARSE "Windows Server 2012-s012.vmdk"
RW 8323072 SPARSE "Windows Server 2012-s013.vmdk"
RW 8323072 SPARSE "Windows Server 2012-s014.vmdk"
RW 8323072 SPARSE "Windows Server 2012-s015.vmdk"
RW 983040 SPARSE "Windows Server 2012-s016.vmdk"
Затем он преобразовывается в VHD без проблем.
Ответ 3
Я попробовал вышеуказанное решение, но в моем дескрипторе не было свойства toolsInstallType, чтобы оно не сработало (с той же ошибкой).
После некоторых исследований я нашел этот инструмент: https://cloudbase.it/qemu-img-windows/
Команда была такой:
qemu-img.exe convert c:\PATH_TO_FILE\disk.vmdk -O vhdx c:\PATH_TO_FILE\disk.vhdx
Он не показывает прогресс, но он работал и спас меня в последнюю минуту.
Также мне было легче работать, поскольку это портативный инструмент. В этом конкретном случае не требуется также исправлять загрузчик, я просто привязал vhdx к новой VM, и он начал успешно.
Ответ 4
Дополнительная информация для ответов выше, если вы все еще придерживаетесь преобразования.
В моем случае метод qemu-img.exe convert ...
преуспевает, но результат. Не удалось запустить изображение VHD в Hyper-V:
Virtual hard disk files must be uncompressed and unencrypted and must not be sparse.
Используйте шестнадцатеричный редактор (блок редактирования 0x100..0x200) или описанный выше способ dsfi.exe/dsfo.exe, чтобы прокомментировать эти атрибуты в файле .VMDK:
ddb.uuid.image="... Some guid here ..."
ddb.uuid.parent="00000000-0000-0000-0000-000000000000"
ddb.uuid.modification="00000000-0000-0000-0000-000000000000"
ddb.uuid.parentmodification="00000000-0000-0000-0000-000000000000"
ddb.comment=""
Просто замените ddb -> #db
.
После этого преобразование MMVC преуспеть для меня без сбоев, выходное изображение работает:
Import-Module "C:\Program Files\Microsoft Virtual Machine Converter\MvmcCmdlet.psd1"
ConvertTo-MVMCVirtualHardDisk -SourceLiteralPath .\win10-32-disk1.vmdk -DestinationLiteralPath . -VHDFormat Vhdx -VHDType DynamicHardDisk