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