Назад | Перейти на главную страницу

Каковы возможные причины, по которым Hyper-V не может сжать VHD?

Я размещаю несколько виртуальных машин на хосте с Hyper-V Server 2008 R2. Изначально диски были подготовлены на другом сервере (2008, а не R2) около 16 месяцев назад и были перенесены на этот сервер год назад. Большинство гостей работают под управлением Windows 7.

Недавно я сравнивал размер VHD с используемым пространством, указанным гостем, и заметил, что на нескольких машинах файлы VHD были на 50–100% больше, чем было необходимо. Поэтому я решил попробовать сжать файлы VHD, чтобы освободить место на хосте. Я выполнил инструкции, которые нашел в Интернете, примерно так:

  1. Запустите CHKDSK на гостевой машине
  2. Запустите дефрагментацию на гостевой машине (встроенная дефрагментация Windows)
  3. Выключи гостя
  4. Откройте инструмент «Редактировать диск ...» в диспетчере Hyper-V.
  5. Выберите интересующий VHD и выберите его сжатие

В первый раз, когда я попробовал это, он работал безупречно и уменьшил размер моего VHD примерно на 50%. Но для дисков всех остальных гостей я получаю это сообщение об ошибке:

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

Ни у одного гостя не включено сжатие NTFS. Снимков этих дисков нет. Что еще могло вызвать эту ошибку?

редактировать: Бонусные баллы для всех, кто описывает решение для автоматического контроля динамических размеров VHD.

Удалите теневые копии с гостя. Вот и все!

vssadmin delete shadows /all

В интересах консолидации поиска в Интернете: в конце концов нашел эту ссылку, это подход, который работал, когда HyperV compact не работал: https://fiddley.wordpress.com/2014/01/27/dynamically-expanding-vhd-not-compacting-in-hyper-v/

В административной командной строке запустите DISKPART

В командной строке DISKPART

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

Помимо предложения удаления теневых копий вы должны использовать SDelete для обнуления пустого пространства перед уплотнением, так как иногда это позволяет уплотнить гораздо больше неиспользуемого пространства. Например, для обнуления пустого места в C: вы должны запустить это изнутри виртуальная машина:

sdelete -z c:

В моем случае у меня был файл виртуального диска общим размером 80 ГБ, первое сжатие уменьшило его только до 78 ГБ, удаление теневых копий и повторное сжатие уменьшило его до 72 ГБ, но после запуска sdelete следующее сжатие уменьшило размер файла до 56 ГБ.