Quelle taille (totale) fait ma VM ?

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)
			$searchSpec = [VMware.Vim.VIConvert]::ToVim4($searchSpec)
			$searchSpec.details.fileOwnerSpecified = $true
			$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/1073741824,2)
WRITE "$size Gb"

/!\ les fichiers de swap (.vswp) ne sont comptabilisés que s’ils sont dans le répertoire de la VM /!\

Tags:

Leave a Reply