清理 Hyper-V R2 未使用的 vhd 和快照文件?

清理 Hyper-V R2 未使用的 vhd 和快照文件?

我们正在使用 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 中,是以前的操作系统需要单独下载

相关内容