# What are the possible reasons why Hyper-V can't compact a VHD?

I am hosting several virtual machines on a host running Hyper-V Server 2008 R2. The disks were originally provisioned on a different server (2008, not R2) about 16 months ago, and were migrated onto this server one year ago. Most guests are running Windows 7.

Recently I was comparing the VHD size to used space reported by the guest, and noticed that several machines had VHD files that were 50-100% larger than actually needed. So I decided to try compacting the VHD files to free up space on the host. I followed instructions I found on the internet, roughly as follows:

1. Run CHKDSK in the guest machine
2. Run a defrag in the guest machine (Windows built-in defrag)
3. Shut down the guest
4. Open "Edit Disk..." tool in Hyper-V Manager
5. Select the VHD of interest and choose to compact it

The first time I tried this, it worked flawlessly and reduced the size of my VHD by about 50%. But for the disks of every other guest, I get this error message:

The server encountered an error trying to edit the virtual disk.

'The system failed to compact 'C:\example.vhd'. Error Code: The requested
operation could not be completed due to a file system limitation


No guests have NTFS compression enabled. There are no snapshots of these disks. What else could be causing this error?

Edit: Bonus points for anybody who describes a solution to keep dynamic VHD sizes in check automatically.

• do you have guest level shadow copies? – tony roth Feb 10 '12 at 2:05
• Ah, yes. That was the problem. But not why post that as an answer? – Nic Feb 10 '12 at 3:08
• wasn't quite sure of the answer. – tony roth Feb 10 '12 at 21:07
• Also the only way to keep dynamic disks from screwing things up is to not allow dynamic disks. – tony roth Feb 11 '12 at 1:05

## 3 Answers

Remove the shadow copies from the guest. That will do it!

vssadmin delete shadows /all

• If the above command complains about undeleteable shadows, try using diskshadow and issue delete shadows all in it. – Der Hochstapler Mar 25 '17 at 1:06

In the interest of Internet search consolidation: Eventually found this link thas an approach that has worked when HyperV compact did not: https://fiddley.wordpress.com/2014/01/27/dynamically-expanding-vhd-not-compacting-in-hyper-v/

In Administrative command prompt, run DISKPART

At the DISKPART command prompt

select vdisk File=”I:\path\to\your.vhd”
attach vdisk readonly
compact vdisk
detach vdisk


Apart from the suggestion of deleting the shadow copies you should use SDelete for zeroing the empty space before compaction, since sometimes it allows compacting much more unused space. For example, for zeroing the empty space in C: you should run this from inside the virtual machine:

sdelete -z c:


In my case I had a virtual disk file with a total size of 80 GB, the first compaction reduced it only to 78 GB, deleting the shadows copies and compacting again reduced it to 72 GB, but after running sdelete the next compaction reduced the file size to 56 GB.