Limpando arquivos vhd e snapshot não usados do Hyper-V R2?

2

Estamos usando o Hyper-V R2 como uma plataforma para virtualizar o ambiente de desenvolvimento e teste.

Após o mês de uso, com a criação / exclusão de muitas máquinas virtuais, o repositório vhd é preenchido com muitos arquivos vhd e avhd. Alguns deles são unidades de excluir computadores virtuais.

Como posso limpar a pasta da unidade virtual?

Existe alguma linha de comando (PowerShell?) que pode enumerar a ligação de disco de todos os computadores virtuais (para que eu possa remover todos, exceto essa lista)?

[Editar] Um pouco de progresso

Eu posso listar todo o arquivo xml para definições de VM e analisar as seções do controlador:

<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>

No entanto, como o computador pode ter instantâneos, ele apenas enumera os discos anexados, e não os discos dos pais, que também são necessários.

    
por Steve B 19.01.2012 / 09:47

1 resposta

2

Depois de cavar, usei este método:

Primeiro, obtenha todos os discos de todas as máquinas virtuais (meu servidor está em francês, você deve substituir "Disque dur" por "Disco rígido" para sistemas em inglês):

$disks = Get-vm | Get-VMDisk | ? { $_.DriveName -Match "disque dur" }

Em seguida, extraio todos os caminhos VHD:

$vhds = @()
$disks | % { Get-VHDInfo $_.DiskPath } | % { $vhds+= $_.Path }
$vhds = $vhds | select -unique
write-host $vhds.Length -Foreground Yellow

Por fim, executo o código a seguir com a frequência necessária. Eu paro quando o tamanho do array pára de crescer:

$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

No final, $vhds contém todos os drives usados e seus pais. Basta enumerar todos os arquivos .vhd e .avhd e subtrair a matriz $ vhd para encontrar discos inúteis.

Eu sei que isso pode ser reescrito em um bom script, mas isso resolveu meu problema.

Esses cmdlets estão incluídos no Windows Server 2012, são um download separado para sistemas operacionais anteriores .

    
por 01.02.2012 / 11:34