首页 > Server, Virtualization > How To : 仅导出Hyper-V R2的虚拟机配置文件

How To : 仅导出Hyper-V R2的虚拟机配置文件

2010年8月7日

最近想把所有实验虚拟机文件搬个机器,但所有的虚拟磁盘模板文件、差异磁盘文件、快照文件等目录错综复杂,参考了苏繁博客的“深入学习 Hyper-V 的导出和导入”一文有些想法:

1、将原有的Hyper-V目录(包括VHD、快照其它XML)拷贝到目标机器相同分区的相同目录

2、在旧环境中导出虚拟机配置文件

3、在新环境中导入备份的虚拟机配置文件

通过以上方法,就可以在不打乱原有目录的情况下快速将虚拟机实现环境转移

问题来了

苏繁的Hyper-V导出截图如下:

1

我自己环境的虚拟机导出截图如下:

2

在我的环境中,根本就没“仅导出虚拟机配置”这个选项,难道是我RP问题?

解决方案

查了微软MSDN后,发现微软在Hyper-V R2中,已经将“仅导出虚拟机配置”这个选项从UI当中移除了(我还以为是苏繁人品爆发了呢Surprised smile),但微软的API中仍保留了此导出功能。没办法,只能通过脚本来直接调用了:

'==================================================================
'
' VBScript Source File
'
' NAME: Hyper-V R2 Configuration only Export
'
' AUTHOR: Billy Fu
'
' DATE  : 2010/8/6
'==================================================================
On Error Resume Next

Dim HyperVServer
Dim VMName
Dim ExportPath
Dim WMIService
Dim Msvm_VirtualSystemManagementService
Dim query
Dim vm
Dim InParam
Dim exportSettingData
Dim OutParam
Dim Job

HyperVServer = InputBox("指定要导出虚拟机的Hyper-V服务器,本机请用点表示:")

VMName = InputBox("指定要导出配置的虚拟机名称:")

ExportPath = InputBox("指定导出配置文件的存放路径:")

Set WMIService = GetObject("winmgmts:\" & HyperVServer & "rootvirtualization")

Set Msvm_VirtualSystemManagementService = WMIService.ExecQuery("Select * from Msvm_VirtualSystemManagementService").ItemIndex(0)

query = "select * from Msvm_ComputerSystem where ElementName = '" & VMName & "'"
Set vm = WMIService.ExecQuery(query).ItemIndex(0)

Set InParam = Msvm_VirtualSystemManagementService.Methods_("ExportVirtualSystemEx").InParameters.SpawnInstance_()
InParam.ComputerSystem = vm.Path_.Path

Set exportSettingData = (vm.Associators_("Msvm_SystemExportSettingData", "Msvm_VirtualSystemExportSettingData")).ItemIndex(0)  

exportSettingData.CopyVmStorage = False
exportSettingData.CopyVmRuntimeInformation = true
exportSettingData.CreateVmExportSubdirectory = true
exportSettingData.CopySnapshotConfiguration = 0    

InParam.ExportSettingData = exportSettingData.GetText_(1)
InParam.ExportDirectory = ExportPath

Set OutParam = Msvm_VirtualSystemManagementService.ExecMethod_("ExportVirtualSystemEx", InParam) 

if (OutParam.ReturnValue = 0) then
   Wscript.Echo "虚拟机配置导出成功!"
elseif (OutParam.ReturnValue <> 4096) then
   Wscript.Echo "虚拟机配置导出失败!"
else   

   set Job = WMIService.Get(OutParam.Job)

   While (Job.JobState = 3) or (Job.JobState = 4)
      Wscript.Echo "正在导出. "
      WScript.Sleep(1000)

      set Job = WMIService.Get(OutParam.Job)
   Wend

   if (Job.JobState <> 7) Then
      Wscript.Echo "虚拟机配置导出失败!"
      Wscript.Echo "错误代码:" & Job.ErrorCode
      Wscript.Echo "错误描述:" & Job.ErrorDescription
   Else
      Wscript.Echo "虚拟机配置导出成功!"
   end If
end If

通过以上VBS脚本,偶也顺利将虚拟机的配置文件导出了Open-mouthed smile

3

4

5

6

导出后的配置文件情况如下:

7





声明  :  转载请注明出处: 碎片IT资讯





  1. 2010年8月7日23:12 | #1

    哈哈,我正纳闷怎么R2中的导出配置文件没有了,原来是设计使然。不过你这篇博文可解决了这个问题,很有价值。脚本写的这么出色!怎么样我出个好点子你再写个脚本如何!?估计很有很多网友喜爱。

  2. 2010年8月13日00:42 | #2

    @goxia

    你说来我听听呢?但愿不要被难倒。。。

  3. 2010年8月19日01:26 | #3

    @碎片
    选中一个文件或文件夹,鼠标右键将其打包为一个wim文件,或mount wim。如果实现利用率将会非常高!