How do you monitor the health of a mirrored disk in Windows?
Solution 1
I had the same question a while ago. The first thing I thought of was using WMI, but for some weird reason, WMI doesn't expose the health of a RAID volume through any of the normal Win32_* classes.
I eventually stumbled across the script in this article and made a few modifications to suit my requirements. It parses the output of diskpart.exe's "LIST VOLUME" command. This may seem a little dirty and ugly, but right now its the best option I've seen.
The script as it appears on the linked page is ready to be used with Nagios / NSClient++. If you know a bit of VBScript it's easy enough to modify this to send e-mail instead of printing status information.
If you don't know VBScript, I'll gladly give you a modified version which will do whatever you want it to.
Solution 2
for /f "tokens=4,9 delims= " %a IN ('echo list volume ^| diskpart ^| find "SSD"') do echo %a %b
Replace find "SSD" with "mirror"(or stripe... whatever) or your volume name. (my volumes are named SSD1 + SSD2)
Stick in a batch file with @echo off and ur done. :)
@echo off
for /f "tokens=4,9 delims= " %%a IN ('echo list volume ^| diskpart ^| find "SSD"') do echo %%a %%b
Above line is needed for batch. =)
Notes
- You need to have a volume name for this to work, else change tokens to
tokens=8
Solution 3
I use this ugly batch file to monitor more than one hundred servers to check mirror status and the result is lovely. It is a nsclient++ client plugin to do passive check every four hour to send result to nagios server.
check_mirror.bat
@echo off
echo list volume | diskpart | find "Mirror" > H
for /f %%i in ('type H ^| find /c "Mirror"') do set /a M=%%i
for /f %%i in ('type H ^| find "Mirror" ^| find /c "Health" ') do set /a H=%%i
for /f %%i in ('type H ^| find /c "Risk"') do set /a risk=%%i
@del H /q
rem echo M=%M%, H = %H% Risk=%risk%
if %risk% GTR 0 goto err
IF %M%.==0. goto nomirror
IF %M% EQU %H% goto mirrorok
:err
echo CRITICAL: Something Wrong.
exit /B 1
:mirrorok
echo OK: Mirror Health.
exit /B 0
:nomirror
echo OK: No Mirror Found.
exit /B 1
Solution 4
Here is a Powershell script to monitor the health of RAID arrays on Windows from https://gist.github.com/schakko at https://gist.github.com/schakko/4713248
I tested it on a Windows 10 software raid and a Dell PERC H700 hardware raid on Server 2016. Worked well. We use MegaRaid for notifications.
I'm reproducing it here just in case the Gist goes away, like the target on the accepted answer https://serverfault.com/a/150089/2985
The "Fehlerfre" and "Fehlerhaf" in the script are German translations for result codes.
# A simple PowerShell script for retrieving the RAID status of volumes with help of diskpart.
# The nicer solution would be using WMI (which does not contain the RAID status in the Status field of Win32_DiskDrive, Win32_LogicalDisk or Win32_Volume for unknown reason)
# or using the new PowerShell API introduced with Windows 8 (wrong target system as our customer uses a Windows 7 architecture).
#
# diskpart requires administrative privileges so this script must be executed under an administrative account if it is executed standalone.
# check_mk has this privileges and therefore this script must only be copied to your check_mk/plugins directory and you are done.
#
# Christopher Klein <ckl[at]neos-it[dot]de>
# This script is distributed under the GPL v2 license.
$dp = "list volume" | diskpart | ? { $_ -match "^ [^-]" }
echo `<`<`<local`>`>`>
foreach ($row in $dp) {
# skip first line
if (!$row.Contains("Volume ###")) {
# best match RegExp from http://www.eventlogblog.com/blog/2012/02/how-to-make-the-windows-softwa.html
if ($row -match "\s\s(Volume\s\d)\s+([A-Z])\s+(.*)\s\s(NTFS|FAT)\s+(Mirror|RAID-5|Stripe|Spiegel|Spiegelung|Übergreifend|Spanned)\s+(\d+)\s+(..)\s\s([A-Za-z]*\s?[A-Za-z]*)(\s\s)*.*") {
$disk = $matches[2]
# 0 = OK, 1 = WARNING, 2 = CRITICAL
$statusCode = 1
$status = "WARNING"
$text = "Could not parse line: $row"
$line = $row
if ($line -match "Fehlerfre |OK|Healthy") {
$statusText = "is healthy"
$statusCode = 0
$status = "OK"
}
elseif ($line -match "Rebuild") {
$statusText = "is rebuilding"
$statusCode = 1
}
elseif ($line -match "Failed|At Risk|Fehlerhaf") {
$statusText = "failed"
$statusCode = 2
$status = "CRITICAL"
}
echo "$statusCode microsoft_software_raid - $status - Software RAID on disk ${disk}:\ $statusText"
}
}
}
This version from https://gist.github.com/LionRelaxe also emails error results (https://gist.github.com/schakko/4713248#gistcomment-2256715)
# A simple PowerShell script for retrieving the RAID status of volumes with help of diskpart.
# The nicer solution would be using WMI (which does not contain the RAID status in the Status field of Win32_DiskDrive, Win32_LogicalDisk or Win32_Volume for unknown reason)
# or using the new PowerShell API introduced with Windows 8 (wrong target system as our customer uses a Windows 7 architecture).
#
# diskpart requires administrative privileges so this script must be executed under an administrative account if it is executed standalone.
# check_mk has this privileges and therefore this script must only be copied to your check_mk/plugins directory and you are done.
#
# Christopher Klein <ckl[at]neos-it[dot]de>
# This script is distributed under the GPL v2 license.
#Volumes:
$dpV = "list volume" | diskpart | ? { $_ -match "^ [^-]" }
foreach ($row in $dpV) {
$OutString = $OutString+$row+"`r`n"
# skip first line
if (!$row.Contains("Volume ###")) {
# best match RegExp from http://www.eventlogblog.com/blog/2012/02/how-to-make-the-windows-softwa.html
if ($row -match "\s\s(Volume\s\d)\s+([A-Z])\s+(.*)\s\s(NTFS|FAT)\s+(Mirror|RAID-5|Stripe|Spiegel|Spiegelung|Übergreifend|Spanned)\s+(\d+)\s+(..)\s\s([A-Za-z]*\s?[A-Za-z]*)(\s\s)*.*") {
$disk = $matches[2]
# 0 = OK, 1 = WARNING, 2 = CRITICAL
$statusCode = 1
$status = "WARNING"
$text = "Could not parse line: $row"
$line = $row
if ($line -match "Fehlerfre |OK|Healthy") {
$statusText = "is healthy"
$statusCode = 0
$status = "OK"
}
elseif ($line -match "Rebuild") {
$statusText = "is rebuilding"
$statusCode = 1
$VolumeErrorFound = 1
}
elseif ($line -match "Failed|At Risk|Fehlerhaf") {
$statusText = "failed"
$statusCode = 2
$status = "CRITICAL"
$VolumeErrorFound = 1
}
#echo "$statusCode microsoft_software_raid - $status - Software RAID on disk ${disk}:\ $statusText"
}
}
}
$OutString = $OutString+"`r`n"
#Disk:
$dpD = "list disk" | diskpart | ? { $_ -match "^ [^-]" }
foreach ($row in $dpD) {
# skip first line
if (!$row.Contains("Volume ###")) {
$OutString = $OutString+$row+"`r`n"
# best match RegExp from http://www.eventlogblog.com/blog/2012/02/how-to-make-the-windows-softwa.html
if ($row -match "Errors") {
#echo "$row"
$DiskErrorFound = 1
}
}
}
if (($DiskErrorFound) -Or ($VolumeErrorFound)) {
$SMTPServer = "your.smtp.server"
$SMTPPort = 25
$EmailTo = "[email protected]"
$EmailFrom = "[email protected]"
$EmailSubject = "Disk or Volume Error on $env:computername"
$EmailBody = $OutString
Send-MailMessage -To $EmailTo -From $EmailFrom -Subject $EmailSubject -Body $EmailBody -SmtpServer $SMTPServer -Port $SMTPPort
}
Solution 5
Smartmontools (http://sourceforge.net/apps/trac/smartmontools/wiki) has a windows version, but I don't know it runs on 2K8
Related videos on Youtube
NitroxDM
Updated on September 17, 2022Comments
-
NitroxDM almost 2 years
I have a Mirrored Dynamic disk on my Windows 2003 Server. How do you monitor the health of the volume?
Is there a way to have the server send an email when there is an issue with the volume? Is there a way to have the server run S.M.A.R.T. tests?
EDIT: Nothing says WTF like logging into a client server, running DISKPART LIST VOLUME and seeing this.
Volume ### Ltr Label Fs Type Size Status Info ---------- --- ----------- ----- ---------- ------- --------- -------- Volume 0 X xDrive NTFS Mirror 233 GB Failed Rd Volume 1 C NTFS Simple 57 GB Healthy System Volume 2 D DVD-ROM 0 B Healthy Volume 3 F RAW Partition 466 GB Healthy Volume 4 E New Volume NTFS Partition 932 GB Healthy
-
Chris_K about 14 yearsWe're talking a software mirror here, right? If so, great question.
-
NitroxDM about 14 years@Chris_k Correct. Last time a disk failed I only found out by chance. On a enterprise system that is completely unacceptable. I have a back up system. But that is not the point of doing a mirror.
-
NitroxDM about 14 yearsWith info like that I guess now is a good time to test out that script. Windows for the win!
-
NitroxDM almost 14 yearsI'm working on a solution using both of the answers listed here.
-
-
NitroxDM about 14 yearsVBScript not so much. C# on the other hand ;) The script doesn't look too bad.
-
Lucky Luke over 12 yearsAnother article on this topic and how to work-around this problem: eventlogblog.com/blog/2012/02/…
-
NitroxDM over 11 yearsTools like what?
-
longneck over 11 yearsSolar winds, n-able, what's up, spice works, even HP insight manager
-
Master DJon over 7 yearsThose (@LuckyLuke & ThatGraemeGuy scripts) are great, but lacking of language support. Both of my servers are in English, so good. But, my download machine is in French. I've been able to figure (from ThatGraemeGuy script)
RE0.Pattern = "Healthy|Sain" RE1.Pattern = "Mirror|RAID-5|Miroir"
, but notRE2
&RE3
that are "Failed|At risk" & "Rebuild". Unfortunately, this is bad because those, mostly theRE2
, are the important ones. Do you where I could get those translated in French or maybe another way around that would not rely on the language? -
Lucky Luke over 7 yearsI don't see how your answer is relevant or helpful, it's just an opinion. There are lot more capable tools than Solarwinds (n-able is from Solarwinds btw). Things also have changed, and software raid is not "shoe-string" anymore: smbitjournal.com/2016/12/the-software-raid-inflection-point
-
Lucky Luke over 7 yearsGood point - but it would be very time consuming to install Windows in every language and observe the strings. If I were you then I would install a French Windows in a VM and simulate a RAID failure with Virtual Disks. You can probably extract the strings from a DLL somewhere, but that would probably equally time consuming.