How to check 'mdadm' RAIDs while running?
The point of RAID with redundancy is that it will keep going as long as it can, but obviously it will detect errors that put it into a degraded mode, such as a failing disk. You can show the current status of an array with mdadm -D
:
# mdadm -D /dev/md0
<snip>
0 8 5 0 active sync /dev/sda5
1 8 23 1 active sync /dev/sdb7
Furthermore the return status of mdadm -D
is nonzero if there is any problem such as a failed component (1 indicates an error that the RAID mode compensates for, and 2 indicates a complete failure).
You can also get a quick summary of all RAID device status by looking at /proc/mdstat
. You can get information about a RAID device in /sys/class/block/md*/md/*
as well; see Documentation/md.txt
in the kernel documentation. Some /sys
entries are writable as well; for example you can trigger a full check of md0
with echo check >/sys/class/block/md0/md/sync_action
.
In addition to these spot checks, mdadm can notify you as soon as something bad happens. Make sure that you have MAILADDR root
in /etc/mdadm.conf
(some distributions (e.g. Debian) set this up automatically). Then you will receive an email notification as soon as an error (a degraded array) occurs.
Make sure that you do receive mail send to root on the local machine (some modern distributions omit this, because they consider that all email goes through external providers — but receiving local mail is necessary for any serious system administrator). Test this by sending root a mail: echo hello | mail -s test root@localhost
. Usually, a proper email setup requires two things:
- Run an MTA on your local machine. The MTA must be set up at least to allow local mail delivery. All distributions come with suitable MTAs, pick anything (but not nullmailer if you want the email to be delivered locally).
Redirect mail going to system accounts (at least
root
) to an address that you read regularly. This can be your account on the local machine, or an external email address. With most MTAs, the address can be configured in/etc/aliases
; you should have a line likeroot: djsmiley2k
for local delivery, or
root: [email protected]
for remote delivery. If you choose remote delivery, make sure that your MTA is configured for that. Depending on your MTA, you may need to run the
newaliases
command after editing/etc/aliases
.
You can force a check of the entire array while it's online. For example, to check the array on /dev/md0
, run as root:
echo check > /sys/block/md0/md/sync_action
I also have a cron job that runs the following command once a month:
tar c /dir/of/raid/filesystem > /dev/null
It’s not a thorough check of the drive itself, but it does force the system to periodically verify that (almost) every file can be read successfully off the disk. Yes, some files are going to be read out of memory cache instead of disk. But I figure that if the file is in memory cache, then it’s successfully been read off disk recently, or is about to be written to disk, and either of those operations will also uncover drive errors. Anyway, running this job tests the most important criterion of a RAID array (“Can I successfully read my data?”) and in the three years I’ve been running my array, the one time I had a drive go bad, it was this command that discovered it.
One little warning is that if your filesystem is big, then this command is going to take a long time; my system takes about 6hr/TiB. I run it using ionice
so that the rest of the system doesn’t grind to a halt during the drive check:
ionice -c3 tar c /dir/of/raid/filesystem > /dev/null
the Debian and Ubuntu 'mdadm' package contains the file
/etc/cron.d/mdadm
which in turns the first sunday of each month will run the command
/usr/share/mdadm/checkarray --cron --all --idle --quiet
that will check all your arrays for consistency (unless you set AUTOCHECK to false in /etc/default/mdadm ). A report will be sent to the 'root' user (make sure you receive such emails).