Hyper-V checkpoints will not merge, and the disk fills
Differencing disks are accumulating because a merge has not completed, and each one grows until the volume runs out.
What you see
The virtual machine folder is full of .avhdx files, the volume is filling, and the machine slows down. Deleting the checkpoint appears to do nothing.
What is actually wrong
A backup product that took a checkpoint and failed before removing it, a merge that cannot complete for lack of free space, or a chain that has grown too long to merge inside a maintenance window.
Codes and articles
Fixes (2)
Free enough space for the merge to run
The volume is nearly full. A merge needs working space and will not start without it.
Establish the size of the chain and the free space.
Get-VM | Get-VMHardDiskDrive | ForEach-Object { Get-VHD $_.Path } | Format-Table Path,VhdType,FileSize,Size,ParentPath -AutoSizeGet-Volume | Format-Table DriveLetter,FileSystemLabel,SizeRemaining,Size
Do not delete .avhdx files by hand. They are a chain, and removing one destroys everything after it.
This is the single most damaging thing that can be done in this situation, and it is a common instinct when a disk is full. Each differencing disk holds only the changes since its parent; deleting one in the middle makes the whole chain unrecoverable.
Move something else off the volume — an ISO library, an old export, another virtual machine — to create room.
Or move the virtual machine's storage to a volume with space, which can be done while it runs.
Move-VMStorage -VMName VM01 -DestinationStoragePath D:\VMs\VM01Then start the merge.
Get-VMSnapshot -VMName VM01 | Remove-VMSnapshotGet-VM VM01 | Format-List Name,Status
Get-VM VM01 | Get-VMHardDiskDrive | ForEach-Object { Get-VHD $_.Path } | Format-List Path,VhdType,ParentPathComplete the merge and stop it recurring
There is space and the merge is stuck or has not started.
List the checkpoints, including the ones a backup product created and hid.
Get-VMSnapshot -VMName VM01 -SnapshotType All | Format-Table Name,SnapshotType,CreationTime,ParentSnapshotNameRecovery checkpoints created by a backup do not appear in the Hyper-V Manager tree in older versions. Listing all types is what reveals a chain that appears empty in the console.
Remove them, which triggers the merge.
Get-VMSnapshot -VMName VM01 -SnapshotType All | Remove-VMSnapshot -Confirm:$falseWatch the merge progress. It runs in the background and can take hours on a large chain.
Get-VM VM01 | Format-List Name,StatusGet-WinEvent -LogName 'Microsoft-Windows-Hyper-V-VMMS-Admin' -MaxEvents 20 | Format-Table TimeCreated,Id,Message -Wrap
If the merge will not start, shut the virtual machine down and it will merge offline, which is faster and more reliable.
Stop-VM VM01Get-VMSnapshot -VMName VM01 -SnapshotType All | Remove-VMSnapshot
If the chain is orphaned — the .avhdx files exist but Hyper-V has no checkpoint for them — reconnect them with Merge-VHD, working from the newest backwards.
Get-VHD 'D:\VMs\VM01\disk_ABC.avhdx' | Format-List Path,ParentPath,VhdTypeMerge-VHD -Path 'D:\VMs\VM01\disk_ABC.avhdx' -DestinationPath 'D:\VMs\VM01\disk.vhdx'
Fix the backup product's configuration so checkpoints are removed after each job — an accumulating chain is always a symptom of that.
Get-VMSnapshot -VMName VM01 -SnapshotType AllGet-VM VM01 | Get-VMHardDiskDrive | ForEach-Object { Get-VHD $_.Path } | Format-List Path,VhdType,ParentPath
Related faults
Where this stops. This write-up was written and checked by hand. It says what each step changes, how to confirm it worked and how to reverse it, and anything destructive is flagged before you reach it. If it does not match what your machine is doing, search the Support Centre for the exact code or message — and when something needs a person, get in touch.