0

我正在使用 Powershell 并尝试检索物理磁盘资源的大小和可用空间。

我希望此代码在一个 Windows Server 2008 R2 机器(监控服务器)上运行,并在同一域上的三个远程集群上轮询资源。其中 2 个集群也运行 Windows Server 2008 R2,但一个运行的是 Windows Server 2012 (x64)。返回的数据将作为监控应用程序的一部分插入数据库。

目前我使用的代码是:

$clusters = "cluster1.domain.local","cluster2.domain.local","cluster3.domain.local"
foreach ( $cluster in $clusters) {
    $resources = Get-ClusterResource -Cluster $cluster | where-object {$_.ResourceType -match "Physical Disk"}
    foreach ( $resource in $resources) {
        $details = Get-ClusterResource -Cluster $cluster -Name $resource.Name | fc *
        <how to get disk size & space from $details?>
    }
}

“Get-ClusterResource | fc *”返回的数据不包括物理磁盘大小或可用空间,我不知道如何得出这些信息。返回的信息对所有集群资源都是通用的 - 可以在此处查看示例(示例 2)。下面的示例 3 几乎很有帮助,但不包括磁盘大小或可用空间。

我已经检查了这个问题,但答案使用了 WMI 查询,当我尝试这个时,我遇到了各种安全和兼容性问题。如果可能的话,我更愿意坚持直接使用 PowerShell,尤其是因为监控应用程序也使用纯 PowerShell 来检查 Exchange 邮箱大小和 DFS 复制积压。

请注意,我不是在尝试查询集群共享卷——它们有自己的、独立的 PowerShell 函数,我没有问题。它专门用于物理磁盘资源,我无法让它工作。

我知道物理磁盘是许多资源类型之一,因此通用 Get-ClusterResource 命令不会返回任何特定于磁盘的内容,但我希望我可以调用另一个函数,传入 Get-ClusterResource 的返回值来检索磁盘空间/可用空间

任何帮助将不胜感激,谢谢

山姆


Ansgar Wiechers 的更新

  • 你的目标是什么?如前所述,创建一系列“数据收集器”powershell 脚本,从需要监控的多个系统收集数据,并将这些数据注入数据库,以提供警报、保留历史记录并普遍增强我们的监控能力。我们目前的监控工具套件涵盖了我们需要的 90%,但只是遗漏了一些小东西,我希望使用这种方法来纠正

  • 为什么需要物理磁盘参数而不是 CSV 参数?因为 CSV 不是集群中唯一使用的磁盘类型。例如,我们有一个 2 个服务器、7 个实例、31 个卷的 SQL 集群。必须监视所有卷上的可用磁盘空间,原因我认为是显而易见的。此监控目前是手动完成的,缺乏历史保留

  • 哪些物理磁盘?无论我指定哪个。一个理想的解决方案将能够监控任何正在使用(即不是“可用”)的集群磁盘资源。我不打算监控“无用”磁盘,例如我们 SQL 集群上的 DTC 卷或 Quorum 卷,但如果我选择监控这些,我没有理由不能监控

  • 以及为什么要通过集群获取这些信息,而不是监视集群成员的物理磁盘信息 虽然可以通过 SNMP MIB 获取其中一些信息,但获取、解释和翻译这些信息要困难得多。我可以对此进行详细介绍,但这会分散问题的注意力,只要说 Powershell 是我的首选方法就足够了

4

2 回答 2

1

您无法获取物理磁盘级别的可用空间信息。这种信息仅在文件系统/卷级别上可用。出于监控目的,我只需做一个

$filter = 'DriveType=3 AND DriveLetter IS NOT NULL'

gwmi Win32_Volume -Filter $filter | select DriveLetter, Capacity, FreeSpace

在每个集群节点上。这将为您提供“常规”卷的大小和可用空间。您可以通过将主机名数组传递给-Computer选项来运行远程 WMI 查询。在这种情况下,我建议SystemName在输出中包含该属性:

$filter = 'DriveType=3 AND DriveLetter IS NOT NULL'
$nodes  = Get-ClusterNode -Cluster $cluster `
            | ? { $_.State -eq 'up' } `
            | % { $_.Name }

gwmi Win32_Volume -Computer $nodes -Filter $filter |
    select SystemName, DriveLetter, Capacity, FreeSpace

CSV 不能像那样被监控,所以它们的数据必须像这样获取:

Get-ClusterSharedVolume -Cluster $cluster `
  | select -Expand SharedVolumeInfo `
  | select FriendlyVolumeName, @{n="Capacity";e={$_.Partition.Size}},
      @{n="FreeSpace";e={$_.Partition.Size - $_.Partition.UsedSpace}}

如果您在回答我的问题时使用不那么居高临下的语气,我将不胜感激。这不像我必须解决你的问题。

于 2013-07-26T09:29:34.160 回答
0

我知道这有点老了,但它的搜索结果很高,但只处理了我正在搜索的部分内容,然后才决定我应该从头开始写一些东西。

我仍在完善它,并将其处理成类似于原始帖子中描述的嵌套“foreach”循环的内容,但是如果您查看“卷”而不是物理磁盘(并让 PowerShell 为你),你可以从中得到一些有用的输出......

Get-Volume | ft @{Expression={[math]::Round(($_.SizeRemaining / $_.Size),3)};Label="Percent Remaining";width=9}, FileSystemLabel, FileSystem, HealthStatus, Size, SizeRemaining 

或者,如果您启用了 WinRM,您可以使用...远程对一堆 Hyper-V 主机运行它。

invoke-command -computername $HostNameOfClusterNode -scriptblock {Get-Volume | ft @{Expression={[math]::Round(($_.SizeRemaining / $_.Size),3)};Label="Percent Remaining";width=9}, FileSystemLabel, FileSystem, HealthStatus, Size, SizeRemaining} 
于 2015-09-24T01:49:59.230 回答