Quelle taille (totale) fait ma VM ? – MAJ

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 /!\

Tags: , ,

Leave a Reply