将 VmWare 虚拟磁盘转换为 HyperV 时出错
Error when converting VmWare virtual disk to HyperV
出于某些测试目的,我从客户那里收到了 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
我找到了一些临时解决方案 - 可能有点乱,但至少有效。
深入研究在 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
的 st运行ge 值。我编辑了描述符 - 只需用 #
(哈希标记)注释掉那一行,然后将其注入到 VMDK 中,瞧 - 现在可以进行转换了。
感谢此 link 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 后,机器无法启动,它一直处于黑屏状态,并且光标快速闪烁(所谓的黑屏死机)。我不知道这是由于转换引起的还是由于我将它们附加为 IDE 时 VMWare 中的原始磁盘是 SCSI 的事实。为了修复它,我附上了带有 Windows 图像的 DVD 并从 DVD 启动。我 运行 Rapair 系统,启动命令行和 运行
bootrec.exe /fixBoot
最后,VM 启动并运行。故事结束。
我在尝试将 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。
我尝试了上述解决方案,但在我的描述符中没有 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 并成功启动。
如果您仍然对转换感到困惑,这是对上述答案的补充。
在我的例子中 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
我有另一个对我有用的解决这个问题的方法,所以我想我会把它添加到组合中以供未来的读者使用。
我从这里(免费)下载了 StarWindConverter 工具。
https://www.starwindsoftware.com/tmplink/starwindconverter.exe
它支持多种目标格式,并为您提供了一个很好的演练向导。选择完所有选项后,您会看到如下所示的进度屏幕:
将脱机 .vmdk 文件转换为 .vhdx 的过程很简单。
这是一个使用 powershell/.net 的答案,不需要您额外下载任何东西。这对我有用。
这里有一些关于它的文章:https://badflyer.com/vmdx-to-vhd-conversion/
转换 cmdlet 无法理解 VMDK 描述符中的某些内容。在这种情况下,只需将其注释掉就可以了。
如果你没有安装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。确保在保存时使用的编辑器不会更改数据编码...
第 2 步:
# 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
现在再次尝试转换。
现代 VMDK 文件有一个主描述符文件和单独的数据文件。无需使用 dsfo/dsfi 工具。
Ubuntu.vmdk <- 描述符
Ubuntu-s001.vmdk, Ubuntu-s002.vmdk 等<- 数据文件
在这种情况下,您只需注释掉以下行:
#ddb.toolsInstallType = "4"
出于某些测试目的,我从客户那里收到了 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
我找到了一些临时解决方案 - 可能有点乱,但至少有效。
深入研究在 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
的 st运行ge 值。我编辑了描述符 - 只需用 #
(哈希标记)注释掉那一行,然后将其注入到 VMDK 中,瞧 - 现在可以进行转换了。
感谢此 link 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 后,机器无法启动,它一直处于黑屏状态,并且光标快速闪烁(所谓的黑屏死机)。我不知道这是由于转换引起的还是由于我将它们附加为 IDE 时 VMWare 中的原始磁盘是 SCSI 的事实。为了修复它,我附上了带有 Windows 图像的 DVD 并从 DVD 启动。我 运行 Rapair 系统,启动命令行和 运行
bootrec.exe /fixBoot
最后,VM 启动并运行。故事结束。
我在尝试将 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。
我尝试了上述解决方案,但在我的描述符中没有 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 并成功启动。
如果您仍然对转换感到困惑,这是对上述答案的补充。
在我的例子中 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
我有另一个对我有用的解决这个问题的方法,所以我想我会把它添加到组合中以供未来的读者使用。
我从这里(免费)下载了 StarWindConverter 工具。
https://www.starwindsoftware.com/tmplink/starwindconverter.exe
它支持多种目标格式,并为您提供了一个很好的演练向导。选择完所有选项后,您会看到如下所示的进度屏幕:
将脱机 .vmdk 文件转换为 .vhdx 的过程很简单。
这是一个使用 powershell/.net 的答案,不需要您额外下载任何东西。这对我有用。 这里有一些关于它的文章:https://badflyer.com/vmdx-to-vhd-conversion/
转换 cmdlet 无法理解 VMDK 描述符中的某些内容。在这种情况下,只需将其注释掉就可以了。
如果你没有安装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。确保在保存时使用的编辑器不会更改数据编码...
第 2 步:
# 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
现在再次尝试转换。
现代 VMDK 文件有一个主描述符文件和单独的数据文件。无需使用 dsfo/dsfi 工具。
Ubuntu.vmdk <- 描述符
Ubuntu-s001.vmdk, Ubuntu-s002.vmdk 等<- 数据文件
在这种情况下,您只需注释掉以下行:
#ddb.toolsInstallType = "4"