Hyper-V: Background Merging of AVHD’s… When’s it done?


I think it might be best to start at ground zero with this topic and explain what a snapshot really is and how it work’s (if you already know skip a head…).  Hyper-V introduced a new feature called a snapshot – snapshots allow you to capture and save the point in time state of a running or saved virtual machine and then go back to that state at a latter point in time.  For example you can have a Windows XP RTM virtual machine running take a snapshot, install SP1, take a snapshot and install SP2 and then latter revert back to the SP1 snapshot and either discard the SP2 installation or keep it around so you can apply that state latter.  Snapshot’s are pretty handing in this regard – you can create pretty extensive tree’s of snapshots and you can rapidly apply specific states to virtual machines.  Under the covers snapshots primarily use a technology that was implemented back in the pre-Microsoft days of Virtual PC called differencing VHD’s.  What a differencing VHD effectively does is point back to a parent VHD for it’s data but any updates made to the VHD reside in the new differencing VHD and subsequent requests for that same data will be overridden by the child differencing VHD.  These parent child relationships can get many levels deep and a parent can have many children – however if a parent is ever modified it’s children’s state is now invalid since the child was unaware of the changes.  So back to snapshots – when a snapshot is taken we create a new differencing disk to point the virtual machine to and we call it an AVHD or automatic VHD since it was created automatically by requesting the snapshot – at the same time we will save off the virtual machines running state if it’s running including it’s memory state and it’s device state (network adapter IP etc…).  When you revert back to a previous snapshot you reload the memory and device state and the VM is pointed at a new AVHD from the parent of that time.  And that’s snapshots in a nut shell…

OK now back to topic at hand – when you delete a snapshot the next time the virtual machine is off or saved we will merge the AVHD created by the snapshot back into it’s respective parent…  We do this automatically and in the background – so lets say you wanted to know when it’s was done programmatically…  It’s not too hard just run the following query to see if any merges are going on presently – PS C:\> Get-WmiObject -Namespace "root\virtualization" -Query "select * from Msvm_ConcreteJob" | Where {$_.ElementName – eq ‘Merge in Progress’}.  Below you can see the full output of that query when a merge is occurring.  Hope this helps!


PS C:\> Get-WmiObject -Namespace "root\virtualization" -Query "select * from Msvm_ConcreteJob" | Where {$_.ElementName -eq ‘Merge in Progress’}

__GENUS                 : 2
__CLASS                 : Msvm_ConcreteJob
__SUPERCLASS            : CIM_ConcreteJob
__DYNASTY               : CIM_ManagedElement
__RELPATH               : Msvm_ConcreteJob.InstanceID="E3675DEB-A13C-440D-AEAD-B6CEB5ADF1D7"
__PROPERTY_COUNT        : 36
__DERIVATION            : {CIM_ConcreteJob, CIM_Job, CIM_LogicalElement, CIM_ManagedSystemElement…}
__SERVER                : TAYLORB
__NAMESPACE             : root\virtualization
__PATH                  : \\TAYLORB\root\virtualization:Msvm_ConcreteJob.InstanceID="E3675DEB-A13C-440D-AEAD-B6CEB5ADF1D7"
Cancellable             : True
Caption                 : Merge in Progress
DeleteOnCompletion      : False
Description             : Merge in Progress
ElapsedTime             : 00000000000000.000000:000
ElementName             : Merge in Progress
ErrorCode               : 0
ErrorDescription        :
ErrorSummaryDescription :
HealthState             : 0
InstallDate             : 16010101000000.000000-000
InstanceID              : E3675DEB-A13C-440D-AEAD-B6CEB5ADF1D7
JobRunTimes             : 1
JobState                : 4
JobStatus               :
LocalOrUtcTime          : 2
Name                    : Merge in Progress
Notify                  :
OperationalStatus       : {0, 0, 0}
OtherRecoveryAction     :
Owner                   :
PercentComplete         : 13                          <—-Percent Complete
Priority                : 0
RecoveryAction          : 0
RunDay                  : 0
RunDayOfWeek            : 0
RunMonth                : 0
RunStartInterval        : 00000000000000.000000:000
ScheduledStartTime      : 16010101000000.000000-000
StartTime               : 16010101000000.000000-000
Status                  :
StatusDescriptions      : {, , }
TimeBeforeRemoval       : 00000000000500.000000:000
TimeOfLastStateChange   : 20090309234922.000000-000
TimeSubmitted           : 16010101000000.000000-000
UntilTime               : 16010101000000.000000-000

Taylor Brown
Hyper-V Integration Test Lead


Comments (9)

  1. markeboyle says:

    can we safely cancel the merge?

    is there a way to know how long it took? either an event in the application or system log of parent or host?

  2. Peter says:

    Get-WmiObject -Namespace "rootvirtualization" -Query "select * from Msvm_ConcreteJob" | Where {$_.ElementName – eq 'Merge in Progress'}


    There should be no space after the eq

    Picky me 🙂

  3. Josh Watts says:

    Great article! Thanks…my SP 2010 AVHDs were growing like crazy…



  4. Mezz Cowles says:

    Hey Taylor,

    I take it this is system-wide.  Is there a way to determine if there is a merge in progress for a particular virtual machine?  Does the InstanceID above refer to the GUID of the virtual machine?



  5. Jake says:

    can i run this query in CMD prompt, also it comes up with this error this cmd is not reconized as an internal external cmd

    Please help

  6. KD says:

    The merge process on a VM happens when the vm is in a turned off state. You are also notified via the Hyper-V Manager that a Merge is in Progress. It should be very clear something is happening especially since the VM is in a turned off or Saved state. Maybe its just me that doesn't see the point of that command.

  7. We can see Merge is in progress via the Hyper-V Manager. But we can't see the progress and know when it done via vmm console. And I try the powershell command, but there is an error: "Get-WmiObject : Invalid namespace".Anyone has any ideas?  Thanks a lot.

  8. Shanmuk says:

    Hey Taylor,

    Repeating what Mezz said..

    I take it this is system-wide.  Is there a way to determine if there is a merge in progress for a particular virtual machine?