2016-05-27 100 views
24

为了某些测试目的,我从客户端收到了VmWare映像。我需要将其转换为Hyper-V。 我按照http://www.askme4tech.com/how-convert-vmware-virtual-machine-hyper-v中的步骤操作。我安装了Microsoft Virtual Machine Converter并开始在PowerShell中转换虚拟磁盘。但我越来越eror:将VmWare虚拟磁盘转换为HyperV时出错

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 
+0

请看看这个http://sebmatthews.net/2014/06/from-the-datacenter-converting -vmware-to-hyper-v-got-even-easy-part-1-of-2/ – piyushj

+0

@piyushjaiswal实际上,博客中描述的步骤与我遵循的链接中的步骤相同。但有趣的是,在博客的评论中,有些人报告了类似的问题。我回答他们与我的解决方案的链接(但我的评论正在等待审核,所以我认为审核通知以垃圾邮件结束,并且永远不会发布:)) – eXavier

回答

45

我发现了一些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,当然还有Dariusz Stanislawek的工具。

仅供参考,该步骤完成:

  • 下载并解压dsfok工具
  • 使用dsfo.exe "c:\temp\disk2.vmdk" 512 1024 descriptor1.txt提取描述符
  • 编辑在记事本+ +的描述符文件:发表评论上述线路(如我添加了额外的单个字符(#)我也从最后删除了一个NULL字符,以保持1024字节的文件大小(不知道是否需要这样)
  • 使用dsfi.exe "c:\temp\disk2.vmdk" 512 1024 descriptor1.txt注入描述符回VMDK
  • 重复这些步骤为其他盘(我的虚拟机有两个.vmdk文件)
  • 补发ConvertTo-MvmcVirtualHardDisk命令

REMARK

创建后虚拟机在Hyper-V中,机器没有启动,它保持黑屏,快速闪烁光标(所谓的死亡黑屏)。我不知道它是由转换引起的,还是由于VMWare中的原始磁盘是SCSI而我将它们作为IDE连接起来的。为了解决这个问题,我将DVD与Windows映像连接起来并从DVD启动。我运行Rapair系统,启动命令行并运行

bootrec.exe/fixBoot 

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

+0

非常好,谢谢! – Elad

+2

完美答案!但对于我来说,违规行是'ddb.uuid.image =“bb194edb-6cd9-416d-9241-bef35d41745f”',所以我删除了所有的'ddb.uuid。*'条目。 (这是一个vmdk,但以前使用virtualbox创建,而不是vmware,所以可能是原因) – pHiL

+0

@pHiL我必须这样做。我正在将Oracle VM转换为Hyper-V。 – johnny

8

我有一个这个问题,试图将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" 

此修复程序是删除#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没有问题。

+0

这工作。我在最后一行有一些尾部0(.... vmdk“0),但我离开它,它的工作,没有问题。谢谢。 –

5

我试过上述解决方案,但在我的描述符中没有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并成功启动。

+0

我知道这是旧的,但只是想补充说,你可以看到进展在输出目录中查看日益增长的文件大小如果知道输入文件的大小,输出将大致相同 –

+0

我使用此工具将vmdk转换为vhdx该工具可以工作,但生成的vhdx不可启动。是否有一个把它启动的技巧? – Dan

2

如果您仍然坚持转换,则可以作为上述答案的补充。

在我的情况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上述在.VMDK文件注释掉这些属性/dsfo.exe方式:

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