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

Мы используем 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>

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

1 ответ

Решение

После некоторых копаний я использовал этот метод:

Во-первых, получите все диски всех виртуальных машин (мой сервер на французском языке, вы должны заменить "Disque dur" на "Жесткий диск" для английских систем):

$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 и являются отдельной загрузкой для предыдущих ОС.

Другие вопросы по тегам