Find a datastore or RDM by LUN ID

Sometimes the storage team wants to clean up their LUNs but they only know the LUN ID. And they ask you, the ESXi admin, where that LUN is used… Not an easy question if you don’t have an administration of your LUNs.

You can use the UI and do some clickin’ but that is sooo much work. So let’s use some PowerCli magic!

# Ask for parameters
$lunid = Read-Host -Prompt "Which LUN ID do you want to find?"
$cluster = Read-Host -Prompt "And in which cluster?"
# Create variable for the first host in the cluster
# (assuming all hosts in the cluster have the same LUNs
$vmhost = (get-cluster $cluster | get-vmhost).Name[0]
$datastorefound = 0
$rdmfound = 0

# Create variable for datastores with the LUN ID
Write-Host
Write-Host "## Creating list of datastores..."
$datastores = Get-Cluster -Name $cluster | Get-Datastore | Select Name,
@{N="LunID";E={
$dev = $_.ExtensionData.Info.Vmfs.Extent[0].DiskName
$esxcli = Get-EsxCli -VMhost $vmhost -V2
$esxcli.storage.nmp.path.list.Invoke(@{'device'=$dev}).RuntimeName.Split(':')[-1].TrimStart('L')}
}

# Search for the LUN ID
Write-Host "## Checking datastores..."
Write-Host
foreach ($datastore in $datastores) {
if ($datastore.LunID -eq $lunid) {
Write-Warning -Message "Datastore found! $($datastore.Name) has ID $lunid"
$datastorefound += 1}
}

if ($datastorefound -eq 0) {Write-Host "No datastores found with LUN ID $lunid"}

# Create variable for RDMs with the LUN ID
Write-Host
Write-Host "## Creating list of RDMs..."
$rdms = Get-Cluster $cluster | Get-VM | Get-Harddisk -DiskType "RawPhysical","RawVirtual" | Select `
@{N="VM";E={$_.Parent.Name}},
Name,
@{N="LunID";E={(Get-ScsiLun -VmHost $vmhost -CanonicalName $_.ScsiCanonicalName).RuntimeName.Split(':')[-1].TrimStart('L')}}

# Search for the LUN ID
Write-Host "## Checking RDMs..."
foreach ($rdm in $rdms) {
if ($rdm.LunID -eq $lunid) {
Write-Warning -Message "RDM found! $($rdm.VM) has RDM with Lun ID $lunid"
$rdmfound += 1}
}

if ($rdmfound -eq 0) {Write-Host "No RDMs found with LUN ID $lunid"}