It is an interesting thing to know how to parse and process Linux Software RAID events.
It is also beneficial as you can automatically take appropriate action immediately after a certain event occurs.
Shell script
Create mdmonitor.sh
shell script to parse Linux Software RAID events.
#!/bin/sh # Parse and process software raid [mdadm] events # Script requires an action and parameter to get started if [ "$#" -lt 2 ]; then echo "Illegal number of parameters" exit 1; fi # Get action action=$1; shift; # Parse action case "$action" in "Fail") # Sample: Fail /dev/md1 /dev/sdb2 # Action requires 2 parameters if [ "$#" -ne 2 ]; then logger --priority "local0.debug" --tag "mdadm" \ "Action [Fail] Illegal number of parameters: $*"; exit 1; fi # Perform custom action logger --priority "local0.notice" --tag "mdadm" "Device $2 failed on array $1"; ;; "FailSpare") # Sample: FailSpare /dev/md1 /dev/sdb2 # Action requires 2 parameters if [ "$#" -ne 2 ]; then logger --priority "local0.debug" --tag "mdadm" \ "Action [FailSpare] Illegal number of parameters: $*"; exit 1; fi # Perform custom action logger --priority "local0.notice" --tag "mdadm" "Spare device $2 failed on array $1"; ;; "RebuildStarted") # Sample: RebuildStarted /dev/md1 # Action requires 1 parameter if [ "$#" -ne 1 ]; then logger --priority "local0.debug" --tag "mdadm" \ "Action [RebuildStarted] Illegal number of parameters: $*"; exit 1; fi # Perform custom action logger --priority "local0.notice" --tag "mdadm" "Rebuild started on array $1"; ;; "RebuildFinished") # Sample: RebuildFinished /dev/md1 # Action requires 1 parameter if [ "$#" -ne 1 ]; then logger --priority "local0.debug" --tag "mdadm" \ "Action [RebuildFinished] Illegal number of parameters: $*"; exit 1; fi # Perform custom action logger --priority "local0.notice" --tag "mdadm" "Rebuild finished on array $1"; ;; "SpareActive") # Sample: SpareActive /dev/md1 /dev/sdb2 # Action requires 2 parameters if [ "$#" -ne 2 ]; then logger --priority "local0.debug" --tag "mdadm" \ "Action [SpareActive] Illegal number of parameters: $*"; exit 1; fi # Perform custom action logger --priority "local0.notice" --tag "mdadm" "Spare device $2 activated on array $1"; ;; "DeviceDisappeared") # Sample: DeviceDisappeared /dev/md/1 # Action requires 1 parameter if [ "$#" -ne 1 ]; then logger --priority "local0.debug" --tag "mdadm" \ "Action [DeviceDisappeared] Illegal number of parameters: $*"; exit 1; fi # Perform custom action logger --priority "local0.notice" --tag "mdadm" "Array $1 disappeared"; ;; "NewArray") # Sample: NewArray /dev/md1 # Action requires 1 parameter if [ "$#" -ne 1 ]; then logger --priority "local0.debug" --tag "mdadm" \ "Action [NewArray] Illegal number of parameters: $*"; exit 1; fi # Perform custom action logger --priority "local0.notice" --tag "mdadm" "New array $1 has been detected"; ;; *) # Perform test action logger --priority "local0.debug" --tag "mdadm" "Unknow action $action $*"; ;; esac
Replace logger
command that makes entries in the system log with your own solution. You can create a database entry or just pass information to your own monitoring application.
Monitoring service
Create a systemd service file to monitor Linux Software RAID events.
$ sudo cat > /etc/systemd/system/mdmonitor.service << EOF [Unit] Description=Linux Software RAID monitor [Service] Type=forking ExecStart=mdadm --monitor --scan --program /path/to/script/mdmonitor.sh --daemonize --pid-file /var/run/mdadm/monitor.pid --no-sharing PIDFile=/var/run/mdadm/monitor.pid [Install] WantedBy=multi-user.target EOF
Remember to replace
/path/to/script/mdmonitor.sh
.Reload systemd manager configuration.
$ sudo systemctl daemon-reload
Enable service at boot time.
$ sudo systemctl enable mdmonitor.service
Start service immediately.
$ sudo systemctl start mdmonitor.service
References
systemd.service — Service unit configuration [freedesktop.org]
mdadm – a tool for managing Linux Software RAID arrays [neil.brown.name]