Quelle taille (totale) fait ma VM ? – MAJ
Posted by NiTRo | Filed under Tips & Tricks, VMware
MAJ 19/05/2011 : Mise à jour du script pour supporter vCenter 4.1 U1
MAJ 29/03/2011 : Mise à jour du script pour supporter vCenter 4.1
En cherchant un moyen élégant de remonter dans rapport la taille occupée par les différents snapshots d’une VM, nous sommes tombés sur un script powershell récemment posté par Arnim van Lieshout : How big is my VM?
Malheureusement, son script n’est pas compatible avec vCenter 4.0, à cause d’un petit bug d’API repéré par plusieurs membres de la communauté VMware lors de l’adaptation d’un script peremetant de lister les vmdk orphelins.
C’est grâce à Yasen Kalchev que nous avons pu modifier ce script et le rendre opérationnel pour vCenter 4.0 :
param( [string] $vm) function Get-VmSize($vm) { #Initialize variables $VmDirs =@() $VmSize = 0 $fileQueryFlags = New-Object VMware.Vim.FileQueryFlags $fileQueryFlags.FileSize = $true #$fileQueryFlags.FileType = $true #$fileQueryFlags.Modification = $true $searchSpec = New-Object VMware.Vim.HostDatastoreBrowserSearchSpec $searchSpec.details = $fileQueryFlags Get-View -ViewType VirtualMachine -Filter @{"Name" = "^$vm$" } | % { #Create an array with the vm's directories $VmDirs += $_.Config.Files.VmPathName.split("/")[0] $VmDirs += $_.Config.Files.SnapshotDirectory.split("/")[0] $VmDirs += $_.Config.Files.SuspendDirectory.split("/")[0] $VmDirs += $_.Config.Files.LogDirectory.split("/")[0] #Add directories of the vm's virtual disk files foreach ($disk in $_.Layout.Disk) { foreach ($diskfile in $disk.diskfile){ $VmDirs += $diskfile.split("/")[0] } } #Only take unique array items $VmDirs = $VmDirs | Sort | Get-Unique foreach ($dir in $VmDirs){ $ds = Get-Datastore ($dir.split("[")[1]).split("]")[0] $dsb = Get-View (($ds | get-view).Browser) if (($global:DefaultVIServer).Version -cge "4.1"){$searchSpec = [VMware.Vim.VIConvert]::ToVim41($searchSpec)} elseif (($global:DefaultVIServer).Version -eq "4.0.0"){$searchSpec = [VMware.Vim.VIConvert]::ToVim4($searchSpec)} $searchSpec.details.fileOwnerSpecified = $true if (($global:DefaultVIServer).Version -cge "4.1"){$dsBrowserMoRef = [VMware.Vim.VIConvert]::ToVim41($dsb.MoRef)} elseif (($global:DefaultVIServer).Version -eq "4.0.0"){$dsBrowserMoRef = [VMware.Vim.VIConvert]::ToVim4($dsb.MoRef)} $taskMoRef = $dsb.Client.VimService.SearchDatastoreSubFolders_Task($dsBrowserMoRef, $dir, $searchSpec) $task = [VMware.Vim.VIConvert]::ToVim($dsb.WaitForTask([VMware.Vim.VIConvert]::ToVim($taskMoRef))) foreach ($result in $task){ foreach ($file in $result.File){ $VmSize += $file.FileSize } } } } return $VmSize } $size = Get-VmSize($vm) $size = [math]::round($size/1GB,2) WRITE "$size Gb"
/!\ les fichiers de swap (.vswp) ne sont comptabilisés que s’ils sont dans le répertoire de la VM /!\