<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>http://vwiki.co.uk/index.php?action=history&amp;feed=atom&amp;title=Storage_Script_Extracts_and_Examples</id>
	<title>Storage Script Extracts and Examples - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://vwiki.co.uk/index.php?action=history&amp;feed=atom&amp;title=Storage_Script_Extracts_and_Examples"/>
	<link rel="alternate" type="text/html" href="http://vwiki.co.uk/index.php?title=Storage_Script_Extracts_and_Examples&amp;action=history"/>
	<updated>2026-05-09T14:55:19Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://vwiki.co.uk/index.php?title=Storage_Script_Extracts_and_Examples&amp;diff=1652&amp;oldid=prev</id>
		<title>Sstrutt: Added VMware category</title>
		<link rel="alternate" type="text/html" href="http://vwiki.co.uk/index.php?title=Storage_Script_Extracts_and_Examples&amp;diff=1652&amp;oldid=prev"/>
		<updated>2012-01-24T15:26:59Z</updated>

		<summary type="html">&lt;p&gt;Added VMware category&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en-GB&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 15:26, 24 January 2012&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l193&quot;&gt;Line 193:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 193:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:PowerCLI]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:PowerCLI]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:VMware]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Sstrutt</name></author>
	</entry>
	<entry>
		<id>http://vwiki.co.uk/index.php?title=Storage_Script_Extracts_and_Examples&amp;diff=1648&amp;oldid=prev</id>
		<title>Sstrutt: Initial creation - content from Script_Extracts_and_Examples_(PowerCLI) page</title>
		<link rel="alternate" type="text/html" href="http://vwiki.co.uk/index.php?title=Storage_Script_Extracts_and_Examples&amp;diff=1648&amp;oldid=prev"/>
		<updated>2012-01-20T14:16:24Z</updated>

		<summary type="html">&lt;p&gt;Initial creation - content from Script_Extracts_and_Examples_(PowerCLI) page&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== VM&amp;#039;s with Datastores List ==&lt;br /&gt;
List of Virtual Machines, and their datastores (with usage)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;powershell&amp;quot;&amp;gt;&lt;br /&gt;
$datastoreExp = @{N=&amp;quot;Datastore&amp;quot;; E={ ($_ | get-datastore | select-object -first 1).Name }}&lt;br /&gt;
$diskSizeExp = @{N=&amp;quot;Total Disk&amp;quot;; E={ ($_ | get-harddisk | measure-object -property CapacityKB -sum).Sum }}&lt;br /&gt;
get-vm | select Name, $datastoreExp, $diskSizeExp | sort -property Datastore,&amp;quot;Total Disk&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VM Storage Usage ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Total&amp;#039;&amp;#039;&amp;#039; storage usage (including any snapshots, logs, etc, etc), not just the VMDK files.&lt;br /&gt;
Adapted from post by Arnim van Lieshout http://www.van-lieshout.com/2009/07/how-big-is-my-vm/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;powershell&amp;quot;&amp;gt;&lt;br /&gt;
function Get-VMDiskUsage($vm2do)&lt;br /&gt;
{&lt;br /&gt;
    #Initialize variables&lt;br /&gt;
    $VMDirs =@()&lt;br /&gt;
    $VMSize = 0&lt;br /&gt;
&lt;br /&gt;
    $searchSpec = New-Object VMware.Vim.HostDatastoreBrowserSearchSpec&lt;br /&gt;
    $searchSpec.details = New-Object VMware.Vim.FileQueryFlags&lt;br /&gt;
    $searchSpec.details.fileSize = $TRUE&lt;br /&gt;
&lt;br /&gt;
    Get-View -VIObject $vm2do | % {&lt;br /&gt;
        #Create an array with the vm&amp;#039;s directories&lt;br /&gt;
        $VMDirs += $_.Config.Files.VmPathName.split(&amp;quot;/&amp;quot;)[0]&lt;br /&gt;
        $VMDirs += $_.Config.Files.SnapshotDirectory.split(&amp;quot;/&amp;quot;)[0]&lt;br /&gt;
        $VMDirs += $_.Config.Files.SuspendDirectory.split(&amp;quot;/&amp;quot;)[0]&lt;br /&gt;
        $VMDirs += $_.Config.Files.LogDirectory.split(&amp;quot;/&amp;quot;)[0]&lt;br /&gt;
        #Add directories of the vm&amp;#039;s virtual disk files&lt;br /&gt;
        foreach ($disk in $_.Layout.Disk) {&lt;br /&gt;
            foreach ($diskfile in $disk.diskfile){&lt;br /&gt;
                $VMDirs += $diskfile.split(&amp;quot;/&amp;quot;)[0]&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        #Only take unique array items&lt;br /&gt;
        $VMDirs = $VMDirs | Sort | Get-Unique&lt;br /&gt;
&lt;br /&gt;
        foreach ($dir in $VMDirs){&lt;br /&gt;
            $ds = Get-Datastore ($dir.split(&amp;quot;[&amp;quot;)[1]).split(&amp;quot;]&amp;quot;)[0]&lt;br /&gt;
            $dsb = Get-View (($ds | get-view).Browser)&lt;br /&gt;
            $taskMoRef  = $dsb.SearchDatastoreSubFolders_Task($dir,$searchSpec)&lt;br /&gt;
            $task = Get-View $taskMoRef &lt;br /&gt;
&lt;br /&gt;
            while($task.Info.State -eq &amp;quot;running&amp;quot; -or $task.Info.State -eq &amp;quot;queued&amp;quot;){$task = Get-View $taskMoRef }&lt;br /&gt;
            foreach ($result in $task.Info.Result){&lt;br /&gt;
                foreach ($file in $result.File){&lt;br /&gt;
                    $VMSize += $file.FileSize&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # VM disk usage in GB&lt;br /&gt;
    $VMSize/1048576000&lt;br /&gt;
}&lt;br /&gt;
Get-VMDiskUsage (Get-VM &amp;quot;MyVM&amp;quot;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ESX Storage Events ==&lt;br /&gt;
Creates a CSV of storage events (eg path up/downs).  Useful in order to be analyse storage events, for example if you need to tally up to SAN logs etc.  Note the &amp;lt;code&amp;gt; get-VIEvent &amp;lt;/code&amp;gt; is limited to 1000 results, which will typically get 1 - 2 days worth depending on your infrastructure.  To get a longer history would  require multiple calls to &amp;lt;code&amp;gt; get-VIEvent &amp;lt;/code&amp;gt; using the &amp;lt;code&amp;gt;-Start&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;-Finish&amp;lt;/code&amp;gt; parameters&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Powershell&amp;quot;&amp;gt;&lt;br /&gt;
$OutputFile = &amp;quot;ESX-EventsStorage.csv&amp;quot;&lt;br /&gt;
&lt;br /&gt;
$Results = @()&lt;br /&gt;
$events = Get-VIEvent -MaxSamples 1000 | Where {$_.EventTypeID -like &amp;quot;esx.*.storage.*&amp;quot;}&lt;br /&gt;
foreach ($event in $events) {&lt;br /&gt;
    $row = &amp;quot;&amp;quot; | Select Date, Host, EventID, Device, Datastore, Path&lt;br /&gt;
    $row.Date = $event.CreatedTime&lt;br /&gt;
    $row.Host = $event.Host.Name.Split(&amp;quot;.&amp;quot;)[0]&lt;br /&gt;
    $row.EventID = $event.EventTypeID&lt;br /&gt;
    # Allow for Argument Keys being mixed up between &amp;quot;problem&amp;quot; aka fault start and &amp;quot;clear&amp;quot; aka fault end events&lt;br /&gt;
    $row.Device = $event.Arguments[0].Value&lt;br /&gt;
    if ($row.EventID -like &amp;quot;esx.problem.*&amp;quot;) {&lt;br /&gt;
        $row.Datastore = $event.Arguments[2].Value&lt;br /&gt;
        $row.Path = $event.Arguments[1].Value&lt;br /&gt;
    } elseif ($row.EventID -like &amp;quot;esx.clear.*&amp;quot;) {&lt;br /&gt;
        $row.Datastore = $event.Arguments[1].Value&lt;br /&gt;
        $row.Path = $event.Arguments[2].Value&lt;br /&gt;
    } else {&lt;br /&gt;
        Write-Host &amp;quot;ERROR: Unexpected EventTypeID - &amp;quot; $row.EventID&lt;br /&gt;
    }&lt;br /&gt;
    $Results = $Results + $row&lt;br /&gt;
}&lt;br /&gt;
$Results | Format-Table *&lt;br /&gt;
$Results | Export-Csv -path $OutputFile -NoTypeInformation&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ESX Datastore to LUN Mapping (ESX3) ==&lt;br /&gt;
Its bizarrely difficult to be able to map VMware presented datastore names to the underlying LUN&amp;#039;s, despite the fact that its readily available via the VI Client.  The following was adapted from the work of &amp;#039;&amp;#039;Catman&amp;#039;&amp;#039; found in this forum thread - http://communities.vmware.com/thread/240466#240466.  As I expect to maybe want some of the other fields available during the working my notes from working through this are to be found [[Datastore to LUN Mapping (PowerCLI)|here]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;powershell&amp;quot;&amp;gt;&lt;br /&gt;
# Thieved and adapted from the good work by catman...&lt;br /&gt;
# http://communities.vmware.com/thread/240466#240466&lt;br /&gt;
&lt;br /&gt;
$objESX = Get-VMHost &amp;quot;My_ESX*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Get .NET views for host and storage system&lt;br /&gt;
$objViewESX = Get-View -id $objESX.id&lt;br /&gt;
$objViewESXstorageSys = Get-View -id $objViewESX.ConfigManager.StorageSystem&lt;br /&gt;
&lt;br /&gt;
# Get FC HBAs&lt;br /&gt;
$HBAs = $objViewESXstorageSys.StorageDeviceInfo.HostBusAdapter | Where-Object {$_.Key -like &amp;quot;*FibreChannelHba*&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
foreach ($hba in $HBAs) {&lt;br /&gt;
    # Enumerate LUNs&lt;br /&gt;
    $LUNcount = $objViewESXstorageSys.StorageDeviceInfo.MultiPathInfo.Lun.Length&lt;br /&gt;
    &lt;br /&gt;
    for ($LUNidx = 0; $LUNidx -lt $LUNcount; $LUNidx++ ) {&lt;br /&gt;
        $objScsiLUN = $objViewESXstorageSys.StorageDeviceInfo.MultiPathInfo.Lun[$LUNidx]&lt;br /&gt;
        &lt;br /&gt;
        # Enumerate paths on LUN&lt;br /&gt;
        $PathCount = $objScsiLUN.Path.Length&lt;br /&gt;
        &lt;br /&gt;
        for ($PathIdx = 0; $PathIdx -lt $PathCount; $PathIdx++) {&lt;br /&gt;
            $objSCSIpath = $objViewESXstorageSys.StorageDeviceInfo.MultiPathInfo.Lun[$LUNidx].Path[$PathIdx]&lt;br /&gt;
            &lt;br /&gt;
            # Only care about one path, active on current HBA&lt;br /&gt;
            if (($objSCSIpath.PathState -eq &amp;quot;active&amp;quot;) -and ($objSCSIpath.Adapter -eq $hba.Key)) {&lt;br /&gt;
                # Now get the disk that we want&lt;br /&gt;
                $objSCSIdisk = $objViewESXstorageSys.StorageDeviceInfo.ScsiLun | Where-Object{ ($_.CanonicalName -eq $objScsiLUN.Id) -and ($_.DeviceType -eq &amp;quot;disk&amp;quot;) }&lt;br /&gt;
                &lt;br /&gt;
                # Now get the datastore info for disk&lt;br /&gt;
                $MountCount = $objViewESXstorageSys.FileSystemVolumeInfo.MountInfo.Length&lt;br /&gt;
                &lt;br /&gt;
                for ($MountIdx = 0; $MountIdx -lt $MountCount; $MountIdx++ ) {&lt;br /&gt;
                    if ($objViewESXstorageSys.FileSystemVolumeInfo.MountInfo[$MountIdx].Volume.Type -eq &amp;quot;VMFS&amp;quot; ) {&lt;br /&gt;
                        $objVolume = $objViewESXstorageSys.FileSystemVolumeInfo.MountInfo[$MountIdx].Volume&lt;br /&gt;
                        &lt;br /&gt;
                        $ExtentCount = $objVolume.Extent.Length&lt;br /&gt;
                        &lt;br /&gt;
                        for ($ExtentIdx = 0; $ExtentIdx -lt $ExtentCount; $ExtentIdx++ ) {&lt;br /&gt;
                            $objExtent = $objVolume.Extent[$ExtentIdx]&lt;br /&gt;
                            &lt;br /&gt;
                            # Match extent name to disk name&lt;br /&gt;
                            if ($objExtent.DiskName -eq $objSCSIdisk.CanonicalName) {&lt;br /&gt;
                                Write-Host($objSCSIdisk.Vendor + &amp;quot; &amp;quot; + $objSCSIdisk.Model + &amp;quot; &amp;quot; + $objSCSIdisk.CanonicalName + &amp;quot;`t&amp;quot; + $objVolume.Name)&lt;br /&gt;
                            }&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gives an output a bit like this...&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HP       HSV200           vmhba1:0:20   VMFS-DS-08&lt;br /&gt;
HP       HSV200           vmhba1:0:7    VMFS-DS-01&lt;br /&gt;
HP       HSV200           vmhba1:0:22   VMFS-DS-10&lt;br /&gt;
HP       HSV200           vmhba1:0:8    VMFS-DS-02&lt;br /&gt;
HP       HSV200           vmhba1:0:10   VMFS-DS-03&lt;br /&gt;
HP       HSV200           vmhba1:0:18   VMFS-DS-07&lt;br /&gt;
HP       HSV200           vmhba1:0:21   VMFS-DS-09&lt;br /&gt;
HP       HSV200           vmhba1:0:12   VMFS-DS-05&lt;br /&gt;
HP       HSV200           vmhba1:0:11   VMFS-DS-04&lt;br /&gt;
HP       HSV200           vmhba1:0:3    VMFS-DS-Templates&lt;br /&gt;
HP       HSV200           vmhba1:0:2    VMFS-DS-ISOs&lt;br /&gt;
HP       HSV200           vmhba1:0:30   VMFS-DS-SCRATCH&lt;br /&gt;
HP       HSV200           vmhba1:0:13   VMFS-DS-06&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ESX Datastore to LUN Mapping (ESX4) ==&lt;br /&gt;
Produces a similar output to the above, but works for ESX4 servers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;powershell&amp;quot;&amp;gt;&lt;br /&gt;
function Get-DS-LUNs-v4 ($objESXs) {&lt;br /&gt;
    foreach ($cluster in (Get-View -ViewType &amp;quot;ClusterComputeResource&amp;quot;)) {&lt;br /&gt;
      $vmhostsview = $cluster.host | % { Get-View $_ }&lt;br /&gt;
      $vmhostview  = $vmhostsview | Select -first 1&lt;br /&gt;
      $ScsiLuns    = $vmhostsview | % { $_.Config.StorageDevice.ScsiLun } | Select -unique *&lt;br /&gt;
      $UUIDs       = $ScsiLuns | Select -unique UUID&lt;br /&gt;
      $Datastores  = $vmhostsview | % { $_.Config.FileSystemVolume.MountInfo } | % { $_.Volume } | Select -Unique *&lt;br /&gt;
      $HostLUN     = $vmhostsview | % { $_.Config.StorageDevice.ScsiTopology.Adapter } | % { $_.Target | % { $_.LUN } } | Select -unique *&lt;br /&gt;
      foreach ($UUID in $UUIDs) {&lt;br /&gt;
        $Lun = $ScsiLuns | ? { $_.UUID -eq $UUID.UUID } | Select -first 1&lt;br /&gt;
        $objVolume               = &amp;quot;&amp;quot; | Select Datastore, Make, Model, LUN&lt;br /&gt;
&lt;br /&gt;
        $objVolume.LUN       = ($HostLUN | ? { $_.ScsiLun -eq $Lun.Key } | select -unique LUN).LUN&lt;br /&gt;
        $objVolume.Make        = $Lun.Vendor&lt;br /&gt;
        $objVolume.Model         = $Lun.Model&lt;br /&gt;
        foreach ($vol in $Datastores) {&lt;br /&gt;
          if ($vol.extent | % { $_.diskname -eq $Lun.CanonicalName}) {&lt;br /&gt;
            $objVolume.Datastore  = $vol.Name&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        $objVolume&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:PowerCLI]]&lt;/div&gt;</summary>
		<author><name>Sstrutt</name></author>
	</entry>
</feed>