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