如何从Windows应用程序监控Intel控制器上RAID阵列的状态?

时间:2010-08-13 15:11:29

标签: windows intel raid

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

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

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

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

我相信我已经阅读了Stack Overflow上与我的问题相关的几篇文章,但没有一篇文章包含答案。例如,在对问题“Can I get Raid disk status by using PS?”的回答中,建议实际上允许检查控制器,而不是数组是否健康(它始终是)。

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

我发现建议的监控RAID状态的方法是通过GUI应用程序让我感到困惑。有多个服务器的企业部署使用哪些方法以编程方式执行此操作?

3 个答案:

答案 0 :(得分: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")
        {
         ...
        }
    }

答案 1 :(得分:1)

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

我求助于在应用程序(Process.Start)启动时启动“ smartctl --scan”(smartmontools的一部分),从输出中获取设备列表,然后定期启动“ smartctl -H device” -name ”。

这将返回磁盘的SMART总体运行状况测试结果,只要返回“通过”,您应该是安全的。

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

答案 2 :(得分:0)

从18年11月16日的Windows 10开始,我遇到了同样的问题,需要检查intel Raid 10的raid状态。

EJA的答案大都起作用-但是,我没有将任何日志写入源IAANTmon。

这时我使用了EJA的答案,但是,按源“ IAStorDataMgrSvc”进行了过滤。这是我的RAID事件日志的写入位置。此外,我检查了邮件中是否包含“降级”或“正在重建”。这将排除启动事件和拉日志,例如“卷降级”,“正在进行卷重建”,“卷重建完成”。

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

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
               }
            }