首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Hyper-V 2012上克隆运行VM的虚拟磁盘?

如何在Hyper-V 2012上克隆运行VM的虚拟磁盘?
EN

Stack Overflow用户
提问于 2013-10-07 13:14:36
回答 2查看 10.8K关注 0票数 1

我想克隆运行在Hyper-V 2012上的虚拟机的虚拟磁盘。

我知道,快照VM将生成一个diff磁盘(文件扩展名.AVHDX)。所有后续的写入都是对此快照的,其父文件是只读的。

但是,该父文件也可能是快照,这意味着我不能简单地复制父文件。

如何在快照之前获得包含所有虚拟硬盘数据的单个文件?

换句话说,如何将当前快照的父文件导出到单个.VHDX文件?

理想情况下,我想知道如何使用Hyper V2 WMI来实现这一点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-07 15:50:10

Hyper 2012及更高版本支持快照的实时合并,但不支持正在运行的VM的导出。

超音波2012年R2支持现场出口。所以,升级并继续前进,这里没什么可看的。

然而..。

如果您获取VM的快照,则可以将差异磁盘添加到快照的父磁盘中,从该磁盘创建VM,导出VM,然后销毁VM,然后销毁差异磁盘。

这看起来很周全,但这是我所知道的“克隆”运行中的超级VM的唯一方法(因为VHD成为问题,可以复制设置和创建新的VM,这些设置不需要‘克隆’)。

如果您的VM没有任何快照,那么您需要创建一个快照来完成此工作。您将“克隆”快照,同时允许运行中的VM状态写回名为“now”的AVHDX。

由于正在创建的这个副本从未打开过,CPU和RAM并不重要。

因为这不是快照,export V为您提供了差异磁盘和父磁盘。

如果您导出快照,您将得到一个虚拟磁盘,因为Hyper-V对AVHDX文件执行特殊操作。

如果您想要一个文件,则合并导出中的diff。合并最终破坏了导出的VM的配置,因为差异磁盘被删除了,所以您必须重命名它。

但同样,我们这样做是为了以一种非常干净(和正确)的方式获得磁盘的副本。

是的,在出口方面有很多工作要做。和避免任何文件锁定问题与虚拟磁盘。

没有时间编写完整的代码,但我遍历了PowerShell,只是为了验证这是可能的。

代码语言:javascript
复制
$snap = Get-VMSnapshot "datest"

PS C:\Windows\system32> $snap.HardDrives

VMName ControllerType ControllerNumber ControllerLocation DiskNumber Path                     
------ -------------- ---------------- ------------------ ---------- ----                     
DATest IDE            0                0                             D:\DATest\Server2012.vhdx


PS C:\Windows\system32> New-VHD -Differencing -ParentPath $snap.HardDrives[0].Path -Path D:\test\test.vhdx


ComputerName            : SWEETUMS
Path                    : D:\test\test.vhdx
VhdFormat               : VHDX
VhdType                 : Differencing
FileSize                : 4194304
Size                    : 42949672960
MinimumSize             : 42948624384
LogicalSectorSize       : 512
PhysicalSectorSize      : 4096
BlockSize               : 2097152
ParentPath              : D:\DATest\Server2012.vhdx
FragmentationPercentage : 
Alignment               : 1
Attached                : False
DiskNumber              : 
IsDeleted               : False
Number                  : 


PS C:\Windows\system32> New-VM -Name Test -Path D:\Test -VHDPath D:\test\test.vhdx 

Name State CPUUsage(%) MemoryAssigned(M) Uptime   Status            
---- ----- ----------- ----------------- ------   ------            
Test Off   0           0                 00:00:00 Operating normally


Export-vm -Name Test -Path d:\newTest -Passthru

# Get the FullName of the parent disk for renaming later

Merge-VHD 'D:\NewTest\Test\Virtual Hard Disks\test.vhdx' -Force

Rename-Item 'D:\NewTest\Test\Virtual Hard Disks\Server2012.vhdx' 'D:\NewTest\Test\Virtual Hard Disks\test.vhdx'

我现在必须写上所有这些..。

票数 1
EN

Stack Overflow用户

发布于 2014-03-03 09:04:01

使用Windows2012 R2?

可以使用VirtualSystemManagementService类直接导出

PowerShell示例泰勒·布朗

代码语言:javascript
复制
# Obtain Msvm_ComputerSystem object corresponding to VM to export
$vmName = "MyVirtualMachine"
$Msvm_ComputerSystem = Get-WmiObject -Namespace root\virtualization\v2 -Class Msvm_ComputerSystem -Filter "ElementName='$vmName'"

# Edit copy of the Msvm_VirtualSystemExportSettingData associated with your VM
$Msvm_VirtualSystemExportSettingData = $Msvm_ComputerSystem.GetRelated("Msvm_VirtualSystemExportSettingData","Msvm_SystemExportSettingData",$null,$null, $null, $null, $false, $null)
$Msvm_VirtualSystemExportSettingData.CopySnapshotConfiguration = 0 # 0=ExportAllSnapshots, 1=ExportNoSnapshots, 2=ExportOneSnapshot

# Call ExportSystemDefinition method of Msvm_VirtualSystemManagementService singleton
$Msvm_VirtualSystemManagementService = Get-WmiObject -Namespace root\virtualization\v2 -Class Msvm_VirtualSystemManagementService
$Msvm_VirtualSystemManagementService.ExportSystemDefinition($Msvm_ComputerSystem, "c:\export_folder", $Msvm_VirtualSystemExportSettingData.GetText(1))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19225886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档