我需要定期从我的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应用程序让我感到困惑。有多个服务器的企业部署使用哪些方法以编程方式执行此操作?
答案 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
}
}