![获取 SAN 上 VMDK 的实际使用情况](https://linux22.com/image/708500/%E8%8E%B7%E5%8F%96%20SAN%20%E4%B8%8A%20VMDK%20%E7%9A%84%E5%AE%9E%E9%99%85%E4%BD%BF%E7%94%A8%E6%83%85%E5%86%B5.png)
我有一个脚本,可以检索我的 vCenter 群集中所有虚拟机的详细信息。本质上Get-VM | Get-Harddisk
。
我也可以获得Provisioned Space
和Used Space
值,但这些仅适用于整个 VM,并且我想在实际 SAN 上获取每个 VMDK 文件的值。
我运气不错,($vm.extensiondata.layoutex.file|?{$_.name -contains $harddisk.filename.replace(".","-flat.")}).size/1GB
但是这并不能检索到我所有虚拟机的详细信息,我无法弄清楚为什么?
更新 1:
因此,我发现可以通过 获得此信息$vm.ExtensionData.Storage.PerDatastoreUsage
。这将返回每个数据存储的详细信息数组,并显示使用了多少磁盘。现在的问题是,我不知道如何统计哪个条目与哪个磁盘相关(除了手动检查)。如果每个磁盘都在不同的数据存储上,那就没问题了,但是当它们都在同一个数据存储上且大小相同时(即,我们有一个 Windows VM,在同一个数据存储上有 2 个 100GB Thin 磁盘),这更具挑战性。
答案1
我终于找到了这篇文章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/有一个解决方案,包括快照的大小