Quick and Dirty: Space Reclaimation mittels PowerCLI und VAAI Storage

Heute gibt es mal wieder ein kleines Script aus der Quick and Dirty Reihe. Wer VAAI kompatiblen Storage benutzt und VMs Thin provisioniert, muss ab und zu mal eine Space Reclaimation durchführen um die gelöschten VMFS Blöcker wieder nutzen zu können.

In der VMware Knowledge Base ist das Vorgehen mittels „esxcli“ beschrieben, ich finde den Weg über die PowerCLI aber etwas angenehmer und habe daher eine kleine Text-GUI hinzugefügt:

1

So muss nur das Script aus der PowerCLI gestartet werden und dann lassen sich bequem die Datastore auswählen auf dem das „UNMAP“ Kommando ausgeführt werden soll.

Das Script funktioniert mit der PowerCLI 6 und der EMC XtremIO und wahrscheinlich auch mit anderem VAAI kompatiblem Storage. Die Reclaim Unit Size lässt sich in Zeile 8 anpassen. (Standard ist 200 bei 1 MB Blöcke für VMFS3/5).

Hier das Script:

function Reclaim-UnusedDatastoreSpace ($datastore, $ESXiHost)
{
    try 
		{
		write-host "Datastore Name: $datastore"
		write-host "ESX Server: $ESXiHost"
        $ESXCLI = Get-EsxCli -VMHost $ESXiHost
		$RETVAL = $ESXCLI.storage.vmfs.unmap(200, $datastore, $null)
        }
    catch [VMware.VimAutomation.Sdk.Types.V1.ErrorHandling.VimException.ViError]
		{
			
        }
}

$settimeout = Set-PowerCLIConfiguration -WebOperationTimeoutSeconds -1 -Scope Session -Confirm:$false

clear-host
write-host ""
$vcenter = read-host "Enter vCenter Name"

try
	{
		$connect = connect-viserver $vcenter
	}
catch
	{
		write-host "Can't connect vCenter"
		exit 0
	}
do
{
$clusterlist = get-cluster
$clusternumber = 1
$selectcluster = @()
foreach ($cluster in $clusterlist)
	{
		$clustername = $cluster.name
		$selectcluster += new-object PSObject -property @{Number="$Clusternumber";Clustername="$Clustername"}
		$clusternumber++
	}

$selectcluster | ft number,clustername -autosize
	
$selectedclusternumber = read-host "Select Cluster (Enter Number)"
try
	{
		$selectedclustername = ($selectcluster | where {$_.Number -eq $selectedclusternumber} | select Clustername).Clustername
		$esxhost = get-cluster $selectedclustername | get-vmhost | select -first 1
	}
catch
	{
		write-host "Can't get ESX Server"
	}
	
$datastorelist = get-vmhost $esxhost | get-datastore
$datastorenumber = 1
$selectdatastore = @()
foreach ($datastore in $datastorelist)
	{
		$datastorename = $datastore.name
		$selectdatastore += new-object PSObject -property @{Number="$Datastorenumber";DatastoreName="$datastorename"}
		$datastorenumber++
	}
	
$selectdatastore | ft Number,DatastoreName -autosize

$selecteddatastorenumber = read-host "Select Datastore (Enter Number)"
try
	{
		$selecteddatastorename = ($selectdatastore | where {$_.Number -eq $selecteddatastorenumber}).datastorename
		write-host ""
		write-host "Working..."
		write-host ""
		Reclaim-UnusedDatastoreSpace $selecteddatastorename $esxhost
		write-host ""
		write-host "Finished" -foregroundcolor green
		write-host ""
		$newrun = read-host "New run? (Yes/No)"
	}
catch
	{
		write-host "Can't reclaim Space"
	}	
}
while ($newrun -match "Yes" -or $newrun -match "y")

Leave a Comment