4

我需要定期从我的 Windows 应用程序检查英特尔控制器上的 RAID 阵列的状态(或收到有关状态更改的通知)。具体来说,我需要查明 RAID 5 阵列是否正常,或者其中一个磁盘是否丢失。

我尝试解析raidcfg32(可从英特尔站点获得,请参阅此自述文件)的输出,但它仅适用于我的应用程序需要监控的服务器之一。在其他服务器上raidcfg32报告“不受支持的硬件”错误。我也试过CmdTool2了,但是完全找不到控制器。

英特尔提供的唯一剩下的 RAID 阵列监控选项是一堆 GUI 应用程序(英特尔矩阵存储管理控制台、英特尔快速存储技术)。

有问题的控制器是:ESB2、631xESB/632xESB。

我相信我已经阅读了 Stack Overflow 上与我的问题相关的几篇文章,但没有一篇包含答案。在回答问题'<a href="https://stackoverflow.com/questions/2501855/can-i-get-raid-disk-status-by-using-ps">我可以通过以下方式获取 Raid 磁盘状态吗?使用 PS?',例如,所建议的实际上允许检查控制器而不是阵列是否健康(总是如此)。

我正在寻找的是一种访问状态信息的自动化方式(具体而言,来自 .NET 应用程序)。任何选项都是好的,无论是通过 WMI、.NET 或本机 API、控制台输出解析或其他方式。

我发现监视 RAID 状态的建议方法是通过 GUI 应用程序令人困惑。在具有数十台服务器的企业部署中使用哪些方法以编程方式执行此操作?

4

3 回答 3

6

我也一直在找这个。我有 ICHxxx 系列控制器,并试图与英特尔联系,以回应公共 API 的存在,但我并不乐观。

这是我短期内想出的。英特尔将 RAID 事件记录到“IAANTmon”下的 Windows 事件日志中。因此,您可以使用 System.Diagnostics.EventLog,挂钩 EventWrittenEventHandler,然后过滤“IAANTmon”。

        EventLog eLog = new EventLog("Application");
        eLog.EntryWritten += new EntryWrittenEventHandler(OnEntryWrittenEvent);
        eLog.EnableRaisingEvents = true;

    public static void OnEntryWrittenEvent(object source, EntryWrittenEventArgs e)
    {
        if (e.Entry.Source == "IAANTmon")
        {
         ...
        }
    }
于 2010-12-08T15:26:37.850 回答
1

我也一直在研究这个,似乎smartmontools是最好的选择。不幸的是,我没有找到适合我的 .NET 需求的包,因为它只是一些基本的东西,所以我没有花几个小时来寻找合适的解决方案。

我求助于在我的应用程序(Process.Start)开始时启动“smartctl --scan”(smartctl --scan 的一部分),从输出中收集设备列表,然后定期为每个设备启动“smartctl -H device-name ” .

这将返回磁盘的SMART整体健康测试结果,只要返回“PASSED”,您应该是安全的。

虽然这远非理想,但它确实表明了我的 RAID 磁盘的健康状况。

于 2018-11-13T07:20:18.860 回答
1

截至 2018 年 11 月 16 日,Windows 10,我遇到了同样的问题,需要检查英特尔 Raid 10 的 raid 状态。

EJA 的回答大多有效——但是,我没有将任何日志写入源“IAANTmon”。

此时我使用了 EJA 的答案,但是,按源“IAStorDataMgrSvc”过滤。这是写我的突袭事件日志的地方。此外,我检查了包含“降级”或“重建”的消息。这将排除启动事件并拉取日志,例如“卷降级”、“卷重建进行中”、“卷重建完成”。

我最终得到了类似的东西:

private static void OnEntryWrittenEvent(object source, EntryWrittenEventArgs e)
      {
         if (e.Entry.Source == "IAStorDataMgrSvc"
            && (e.Entry.Message.Contains("Degraded")
            || e.Entry.Message.Contains("Rebuilding")))
         {
            // Show status message
         }
      }

在启动时,我还检查了前几天的日志,以防在我的程序未运行时驱动器被标记为降级 -

foreach (var entry in eLog.Entries.Cast<EventLogEntry>()
               .Where(x => x.Source == "IAStorDataMgrSvc" 
                      && (x.TimeWritten - DateTime.Today).TotalDays < 3))
            {
               if (entry.Message.Contains("Degraded")
                  || entry.Message.Contains("Rebuilding"))
               {
                  // Show status message
               }
            }
于 2018-11-16T18:59:35.623 回答