我们正在使用 Hyper-V R2 作为虚拟化开发和测试环境的平台。
经过一个月的使用,随着许多虚拟机的创建/删除,vhd 存储中充满了大量的 vhd 和 avhd 文件。其中一些是已删除虚拟计算机的驱动器。
如何清理虚拟驱动器文件夹?
是否有任何命令行(PowerShell?)可以枚举所有虚拟计算机的磁盘绑定(所以我可以删除除此列表之外的所有内容)?
[编辑]有点进步
我可以列出 VM 定义的所有 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”替换为“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 数组即可找到无用的磁盘。
我知道这可以用一个很好的脚本重写,但它解决了我的问题。
这些 cmdlet 包含在 Windows Server 2012 中,是以前的操作系统需要单独下载。