Проблема при попытке сжать VHD-файл

При использовании виртуализации на основе Hyper-V иногда возникает потребность сжать (compact) динамический VHD-файл. Как правило все проходит без проблем, но иногда при попытке сжатия возникает ошибка:

The requested operation could not be completed due to a file system limitation

Такая ошибка возникает тогда, когда динамический VHD-файл содержит внутри себя теневые копии. Для того, чтобы сжать такой файл, теневые копии необходимо удалить. Сделать это можно запустив в виртуальной машине, к которой относится этот файл, следующую команду:

vssadmin.exe delete shadows /all

Если после выполнения этой команды возникает ошибка

Snapshots were found, but they were outside your allowed context. Try removing them with the backup application which created them.

То следует воспользоваться командой diskshadow:

DiskShadow.exe
DISKSHADOW>Delete Shadows All


Все команды необходимо запускать в командной строке, запущенной с правами администратора.
Не забудьте после удаления теневых копий выключить виртуальную машину и можно запускать сжатие vhd-файла в оснастке Hyper-V.

Также сжатие vhd можно выполнить из командной строки с помощью diskpart, что может быть полезно в случае использования Hyper-V Server, у которого нет GUI:

Diskpart
select vdisk file="путь к vhd-файлу"
attach vdisk readonly
compact vdisk
detach vdisk