У меня есть сценарий, который извлекает сведения обо всех виртуальных машинах в моем кластере vCenter. По существу Get-VM | Get-Harddisk
.
Я также могу получить Provisioned Space
и Used Space
значения, но они предназначены только для виртуальной машины в целом, и я хотел бы получить их для каждого файла VMDK в реальной сети SAN.
Мне повезло с ($vm.extensiondata.layoutex.file|?{$_.name -contains $harddisk.filename.replace(".","-flat.")}).size/1GB
но это не позволяет получить подробную информацию обо всех моих виртуальных машинах, и я не могу понять, почему?
ОБНОВЛЕНИЕ 1: Итак, я обнаружил, что эта информация доступна через $vm.ExtensionData.Storage.PerDatastoreUsage
. Это возвращает массив сведений о каждом хранилище данных и показывает, сколько диска используется. Проблема в том, что я не знаю, как подсчитать, какая запись относится к какому диску (кроме проверки вручную). Это нормально, если каждый диск находится в разных хранилищах данных, но когда все они находятся в одном хранилище данных и имеют одинаковый размер (т.е. у нас есть виртуальная машина Windows с 2 тонкими дисками по 100 ГБ в одном хранилище данных), это оказывается более сложной задачей.
В конце концов я нашел этот пост https://communities.vmware.com/message/1816389#1816389 на сайте сообществ VMware, который дает следующий код в качестве решения, которое я могу адаптировать:
Get-View -ViewType VirtualMachine -Property Name, Config.Hardware.Device, LayoutEx | %{
$viewVM = $_; $viewVM.Config.Hardware.Device | ?{$_ -is [VMware.Vim.VirtualDisk]} | %{
## for each VirtualDisk device, get some info
$oThisVirtualDisk = $_
## get the LayoutEx Disk item that corresponds to this VirtualDisk
$oLayoutExDisk = $viewVM.LayoutEx.Disk | ?{$_.Key -eq $oThisVirtualDisk.Key}
## get the FileKeys that correspond to the LayoutEx -> File items for this VirtualDisk
$arrLayoutExDiskFileKeys = $oLayoutExDisk.Chain | ?{$_ -is [VMware.Vim.VirtualMachineFileLayoutExDiskUnit]}
New-Object -TypeName PSObject -Property @{
## add the VM name
VMName = $viewVM.Name
## the disk label, like "Hard disk 1"
DiskLabel = $_.DeviceInfo.Label
## the datastore path for the VirtualDisk file
DatastorePath = $_.Backing.FileName
## the provisioned size of the VirtualDisk
ProvisionedSizeGB = [Math]::Round($_.CapacityInKB / 1MB, 1)
## get the LayoutEx File items that correspond to the FileKeys for this LayoutEx Disk, and get the size for the items that are "diskExtents" (retrieved as bytes, so converting to GB)
SizeOnDatastoreGB = [Math]::Round(($arrLayoutExDiskFileKeys | %{$_.FileKey} | %{$intFileKey = $_; $viewVM.LayoutEx.File | ?{($_.Key -eq $intFileKey) -and ($_.Type -eq "diskExtent")}} | Measure-Object -Sum Size).Sum / 1GB, 1)
} ## end new-object
} ## end foreach-object
} ## end outer foreach-object
Через сайт сообщества я попал в отличный блог http://www.lucd.info/2010/03/23/yadr-a-vdisk-reporter/ у которого есть решение, которое также включает размер снимков