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

Очистка неиспользуемых файлов vhd и снимков Hyper-V R2?

Мы используем Hyper-V R2 в качестве платформы для виртуализации среды разработки и тестирования.

После месяца использования, с созданием / удалением большого количества виртуальных машин, хранилище vhd заполняется большим количеством файлов vhd и avhd. Некоторые из них представляют собой диски удаленных виртуальных машин.

Как я могу очистить папку виртуального диска?

Есть ли какая-нибудь командная строка (PowerShell?), Которая может перечислить все привязки дисков виртуальных компьютеров (чтобы я мог удалить все, кроме этого списка)?

[Редактировать] Небольшой прогресс

Я могу перечислить все xml-файлы для определений виртуальных машин и проанализировать разделы контроллера:

<controller0>
  <drive0>
    <pathname type="string">V:\Hyper-V\Virtual Hard Disks\my_computer_7679176A-F7AE-4D40-AC28-67FFDE7E2FEB.avhd</pathname>
    <type type="string">VHD</type>
  </drive0>
  <drive1>
    <pathname type="string">V:\Hyper-V\Virtual Hard Disks\my_computer_60892A6B-6AB4-44D7-8F08-509BF0E70A05.avhd</pathname>
    <type type="string">VHD</type>
  </drive1>
</controller0>

Однако, поскольку компьютер может иметь моментальные снимки, он перечисляет только подключенные диски, а не их родительские диски, которые также необходимы.

Покопавшись, я воспользовался этим методом:

Сначала получите все диски всех виртуальных машин (мой сервер на французском языке, вы должны заменить «Disque dur» на «Hard drive» для английских систем):

$disks = Get-vm | Get-VMDisk | ? { $_.DriveName -Match "disque dur" }

Затем я извлекаю все пути VHD:

$vhds = @()
$disks | % { Get-VHDInfo $_.DiskPath } | % { $vhds+= $_.Path }
$vhds = $vhds | select -unique
write-host $vhds.Length -Foreground Yellow

Наконец, я запускаю следующий код по мере необходимости. Я останавливаюсь, когда длина массива перестает расти:

$disks | % { Get-VHDInfo $_.DiskPath }  | select ParentPath | ? {$_.ParentPath.Length -Gt 0} | % { $vhds+= $_.ParentPath }
$vhds = $vhds | select -unique
write-host $vhds.Length -Foreground Yellow

$vhds | % { Get-VHDInfo $_ }  | select ParentPath | ? {$_.ParentPath.Length -Gt 0} | % { $vhds+= $_.ParentPath }
$vhds = $vhds | select -unique
write-host $vhds.Length -Foreground Yellow

#Repeat while Length grows

В конце, $vhds содержит все использованные диски и их родители. Просто перечислите все файлы .vhd и .avhd и вычтите массив $ vhd, чтобы найти бесполезные диски.

Я знаю, что это можно переписать красивым сценарием, но это решило мою проблему.

Эти командлеты включены в Windows Server 2012, являются отдельная загрузка для предыдущих ОС.