将VmWare虚拟磁盘转换为HyperV时出错

eXa*_*ier 54 vmware hyper-v virtual-disk

我从客户端收到VmWare映像用于某些测试目的.我需要将其转换为Hyper-V.我按照http://www.askme4tech.com/how-convert-vmware-virtual-machine-hyper-v中的步骤进行操作.我安装了Microsoft Virtual Machine Converter并开始在PowerShell中转换虚拟磁盘.但是我变得很恐怖:

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
Run Code Online (Sandbox Code Playgroud)

eXa*_*ier 80

我找到了一些特殊的解决方案 - 或许有点破解,但至少可行.

深入研究谷歌上发现的类似问题我找到了一个从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"
Run Code Online (Sandbox Code Playgroud)

我收集了错误消息以及提取的描述符的内容,特别是以下行:

ddb.toolsInstallType = "1"
Run Code Online (Sandbox Code Playgroud)

因为它包含1来自我的错误消息的奇怪值.我编辑了描述符 - 只注释掉带有#(哈希标记)的单行,将其注入VMDK并瞧 - 现在转换工作正常.

致谢此链接https://communities.vmware.com/thread/343214?start=0&tstart=0,当然还有Dariusz Stanislawek的工具.

仅供参考,我所做的步骤:

  • 下载并解压缩dsfok工具
  • 用于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命令

备注

在Hyper-V中创建VM后,机器无法启动,它仍然保持黑屏,快速闪烁光标(所谓的黑屏死机).我不知道它是由转换引起的还是由于VMWare中的原始磁盘是SCSI而我将它们作为IDE连接的事实.为了解决这个问题,我附上了带有Windows图像并从DVD启动的DVD.我运行了Rapair系统,启动了命令行并运行

bootrec.exe /fixBoot
Run Code Online (Sandbox Code Playgroud)

最后,VM启动并运行..故事结束.

  • 完美答案!然而对我来说,违规行是`ddb.uuid.image ="bb194edb-6cd9-416d-9241-bef35d41745f"`,所以我删除了所有`ddb.uuid.*`条目.(这是一个vmdk但以前是用virtualbox而不是vmware创建的,所以可能就是这个原因) (4认同)
  • 这种方法实际上只花了40分钟。VBoxManage.exe clonehd --format VHD“ My.vmdk”“ My.vhd” (2认同)

小智 16

我有一个问题,试图将VMWare映像转换为VHD.我的解决方案类似于eXavier,但我只用文本编辑器就能做到.

我可以做一个更简单的修复的原因是我从VMWare获得的vmdk是一个小文本文件,引用了许多其他文件.它看起来像这样:

# 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"
Run Code Online (Sandbox Code Playgroud)

解决方法是使用文本编辑器删除#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"
Run Code Online (Sandbox Code Playgroud)

然后它转换为VHD没有问题.


Bor*_*ink 13

我尝试了上面的解决方案,但在我的描述符中没有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 -p
Run Code Online (Sandbox Code Playgroud)

此工具的文档在此处QEMU文档 -p标志允许您查看转换的进度.

此外,我发现它更容易使用,因为它是一个便携式工具.在这种特定情况下,它也不需要修复引导加载程序,我只是将vhdx连接到新VM并且它已成功启动.

  • 我只是想补充一点,您可以使用“-p”参数显示此工具的进度 (2认同)

Oce*_*rop 7

对于这个问题,我还有另一种解决方案,对我有用,因此我想将其添加到以后的读者中。

我从这里(免费)下载了StarWindConverter工具。

https://www.starwindsoftware.com/tmplink/starwindconverter.exe

它支持多种目标格式,并为您提供了一个不错的向导。选择所有选项后,将显示如下所示的进度屏幕:

进度条

将脱机.vmdk文件转换为.vhdx的过程很简单。

  • 太简单了,闭嘴拿我的钱!(但有恶意软件风险吗?) (2认同)
  • 我知道,对吧!- 它是一个免费的小工具,就像一个魅力。此外,Starwind 软件似乎是一家信誉良好的公司,因此没有恶意软件。我已经使用它一段时间了,很高兴 (2认同)
  • 在 Windows 10 上,转换非常非常旧的 Windows XP vmdk 非常适合我。 (2认同)
  • 这对我来说是最好的解决方案。通常我对这些工具很警惕,但你无法摆脱它们。比深入研究生产 VMDK 并冒任何损坏的风险要安全得多。我唯一的抱怨是在虚拟机关闭之前它无法执行任何操作。如果它能像 MS MVMC 一样关闭虚拟机就好了。 (2认同)