【问题标题】:Error when converting VmWare virtual disk to HyperV将 VmWare 虚拟磁盘转换为 HyperV 时出错
【发布时间】:2016-09-25 16:34:27
【问题描述】:

出于某些测试目的,我从客户端收到了 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

【问题讨论】:

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

标签: vmware hyper-v virtual-disk


【解决方案1】:

现代 VMDK 文件有一个主描述符文件和单独的数据文件。无需使用 dsfo/dsfi 工具。

  • Ubuntu.vmdk 描述符

  • Ubuntu-s001.vmdk、Ubuntu-s002.vmdk 等 数据文件

在这种情况下,您只需要注释掉该行:

#ddb.toolsInstallType = "4"

【讨论】:

    【解决方案2】:

    我找到了一些临时解决方案 - 可能有点破解,但至少可以工作。

    深入研究在 google 上发现的类似问题,我找到了一个从 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
    • 对另一个磁盘重复这些步骤(我的 VM 有两个 .vmdk 文件)
    • 重新发出ConvertTo-MvmcVirtualHardDisk 命令

    备注

    在Hyper-V中创建虚拟机后,机器无法启动,一直黑屏,光标快速闪烁(所谓的黑屏死机)。我不知道这是否是由转换引起的,或者是由于 VMWare 中的原始磁盘在我将它们作为 IDE 连接时一直是 SCSI 的。为了修复它,我附加了带有 Windows 映像的 DVD 并从 DVD 启动。我运行了 Rapair 系统,启动命令行并运行

    bootrec.exe /fixBoot
    

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

    【讨论】:

    • 完美答案!但是对我来说,违规行是ddb.uuid.image="bb194edb-6cd9-416d-9241-bef35d41745f",所以我删除了所有ddb.uuid.* 条目。 (它是一个 vmdk,但以前是用 virtualbox 而不是 vmware 创建的,所以这可能是原因)
    • @pHiL 我也必须这样做。我正在将 Oracle VM 转换为 Hyper-V。
    • ConvertTo-MvmcVirtualHardDisk 命令花费了很长时间,但它有效(使用上述方法)。转换一个 150[GB] 的 VMDK 文件大约需要 12 个小时。尽管它在大约 1 小时内达到了 150[GB] 大小,但之后它仍以相同的速度(多次通过?)继续写入 11 多个小时。
    • 这个方法其实只用了40分钟。 VBoxManage.exe clonehd --format VHD "My.vmdk" "My.vhd"
    • 无法再从上面的链接下载dsof 工具。有人有这个工具的备份吗?
    【解决方案3】:

    这是一个使用 powershell/.net 的答案,不需要您额外下载任何内容。这对我有用。 这里写了一点:https://badflyer.com/vmdx-to-vhd-conversion/

    VMDK 描述符中可能存在转换 cmdlet 无法理解的内容。在这种情况下,只需将其注释掉就足够了。

    如果您没有安装 notepad++,则需要更改打开的编辑器。

    第 1 步:

    # Open VM-ware disk, read 1024 bytes at position 512
    $vmdkFileName = 'D:\VM\CNC Windows 7 Professional\Windows 7 Professional-cl1.vmdk'
    $vmdkFileStream = [System.IO.File]::Open($vmdkFileName, [System.IO.FileMode]::Open, [System.IO.FileAccess]::ReadWrite)
    $vmdkFileStream.Position = 512
    
    $bytes = [byte[]]::new(1024);
    $vmdkFileStream.Read($bytes, 0, 1024)
    
    # Write to a temp file
    $tempPath = [System.IO.Path]::Combine([System.IO.Path]::GetTempPath(), [System.IO.Path]::GetTempFileName())
    $tempfile = [System.IO.File]::OpenWrite($tempPath)
    $tempfile.Write($bytes, 0, 1024)
    $tempfile.Dispose()
    
    # Open the editor. Wait for exit doesn't always seem to work for npp...
    # Use whichever edit you like, it needs to show text, and also helpful if it can show whitespace/control characters
    $editor = Start-Process 'C:\Program Files\Notepad++\notepad++.exe' -ArgumentList $tempPath -PassThru -Wait
    $editor.WaitForExit()
    
    # TODO, change what is causing the problem in the opened file.
    

    如果错误消息抱怨“1”,则在描述符中查找值为“1”的行。例如:ddb.toolsInstallType = "1" 您可以将其注释掉:

    # ddb.toolsInstallType = "1"
    

    然后保存编辑器并将字节写回 VMDK。确保保存时使用的编辑器不会更改数据的编码...

    第二步:

    # Read back the temp file
    $tempfile = [System.IO.File]::OpenRead($tempPath)
    $tempfile.Read($bytes, 0, 1024);
    $tempfile.Dispose()
    
    # Write back to the vmdk
    $vmdkFileStream.Position = 512
    $vmdkFileStream.Write($bytes, 0, 1024)
    
    # Cleanup
    $vmdkFileStream.Dispose();
    del $tempPath
    

    现在再次尝试转换。

    【讨论】:

    • 为我工作!不会撒谎,我希望你的Step1Step2 合并。我移动得太快了,甚至没有看到Step2,它没有工作,然后在仔细查看代码后,我无法弄清楚它应该如何工作......然后Step2 关闭了所有内容。我有一个稍微不同的描述符错误,但我只是 # 注释掉了一堆描述符并且它起作用了。我更喜欢这个解决方案,因为没有什么可下载的,它尽可能地直接解决实际问题。
    【解决方案4】:

    我尝试了上述解决方案,但在我的描述符中没有 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
    

    此工具的文档在这里QEMU Documentation -p 标志允许您查看转换的进度。

    我还发现它更易于使用,因为它是一种便携式工具。在这种特定情况下,它也不需要修复引导加载程序,我只是将 vhdx 附加到新 VM 并成功启动。

    【讨论】:

    • 我知道这是旧的,但只是想补充一点,您可以通过查看输出目录中不断增长的文件大小来查看进度。如果您知道输入文件的大小,则输出将大致相同。
    • 我使用这个工具将 vmdk 转换为 vhdx。该工具有效,但生成的 vhdx 无法启动。有没有让它可启动的技巧?
    • 根据我的经验,我遇到了同样的问题,必须使用新建虚拟机向导来创建我的虚拟机并指定第 1 代,而不是使用快速创建。
    • 我只是想补充一点,您可以使用“-p”参数显示此工具的进度
    • 在转换 6.03GB(对我来说是总文件的 1%)后,大小停止增加。我等了半个小时,但它看起来像卡住了。所以我想取消这个操作并再次运行它。当我按下 Ctrl+C 时,进度立即从 0% 跃升至 1% 并继续工作。我不知道那是什么鬼。我只是想让未来的读者知道。因此,如果它卡住了,请在完全取消操作之前尝试一下。通过检查文件大小而不是 CLI 中的进度来确保它被卡住。
    【解决方案5】:

    对于这个问题,我有另一个对我有用的解决方案,所以我想我会将它添加到任何未来读者的组合中。

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

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

    它支持多种目标格式,并为您提供了一个很好的向导来演练。选择所有选项后,您会看到如下所示的进度屏幕:

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

    【讨论】:

    • 太简单了,闭嘴拿我的钱! (但有恶意软件风险吗?)
    • 我知道的没错! - 它是一个免费的小工具,就像一个魅力。此外,Starwind 软件似乎是一家信誉良好的公司,因此没有恶意软件。我已经使用了一段时间了,非常高兴
    • 非常适合我,在 Windows 10 上,转换了一个非常旧的 Windows XP vmdk。
    • 这对我来说是最好的解决方案。通常我对这些工具持谨慎态度,但您无法摆脱困境。比深入研究生产 VMDK 并冒任何损坏风险要安全得多。我唯一的抱怨是在虚拟机关闭之前它无法做任何事情。如果它可以像 MS MVMC 那样关闭虚拟机就好了。
    【解决方案6】:

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

    在我的情况下,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
    

    【讨论】:

      【解决方案7】:

      我在尝试将 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 Database 行及其下方的所有行,使我的文件如下所示:

      # 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 (....vmdk"0),但我留下了它,它工作了,没问题。谢谢。
      • 如此简单,如此美妙。
      • 这对我来说非常有效。我使用 Visual Studio Code 打开了主 vmdk 文件,从 # The Disk Data Base 开始删除了所有内容,然后转换成功。
      猜你喜欢
      • 2018-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-19
      • 2014-03-30
      • 1970-01-01
      • 2017-01-01
      相关资源
      最近更新 更多