nixpkgs/modules/tasks/swraid.nix
Nicolas Pierron b02cf8d20e Check that 'mdadm --assemble' is effective before continuing.
svn path=/nixos/trunk/; revision=19339
2010-01-10 19:36:53 +00:00

91 lines
2.1 KiB
Nix

{ config, pkgs, ... }:
###### implementation
let
tempConf = "/var/run/mdadm.conf";
tempStatus = "/var/run/mdadm.status";
logFile = "/var/log/mdadmEvents.log";
modprobe = config.system.sbin.modprobe;
inherit (pkgs) mdadm diffutils;
mdadmEventHandler = pkgs.writeScript "mdadmEventHandler.sh" ''
#!/bin/sh
echo "$@" >> ${logFile}
case $1 in
(NewArray)
initctl emit -n new-raid-array
;;
(*) ;;
esac
'';
in
{
jobs.swraid = {
startOn = [ "new-raid-array" ];
description = "Assemble RAID arrays.";
script = ''
# Load the necessary RAID personalities.
# !!! hm, doesn't the kernel load these automatically?
for mod in raid0 raid1 raid5; do
${modprobe}/sbin/modprobe $mod || true
done
# Save previous probe
mv ${tempConf} ${tempConf}.old
# Scan /proc/partitions for RAID devices.
${mdadm}/sbin/mdadm --examine --brief --scan -c partitions > ${tempConf}
if ! -q ${diffutils}/bin/diff ${tempConf} ${tempConf}.old > /dev/null; then
try=0
while ! test -e /proc/mdstat || ! ${diffutils}/bin/diff -q /proc/mdstat ${tempStatus} > /dev/null; do
test $try -gt 6 && break
test $try -neq 0 && sleep 10
# Activate each device found.
${mdadm}/sbin/mdadm --assemble -c ${tempConf} --scan
try=$(($try + 1))
done
# Register the new status
cp /proc/mdstat ${tempStatus}
# Send notifications.
initctl emit -n new-devices
fi
# Remove previous configuration.
rm ${tempConf}.old
'';
task = true;
};
jobs.swraidEvents = {
name = "swraid-events";
description = "Watch mdadm events.";
startOn = [ "startup" ];
postStart = ''
echo > ${tempConf}
echo > ${tempStatus}
# Assemble early raid devices.
initctl emit -n new-raid-array
'';
# !!! Someone should ensure that this is indeed doing what the manual says.
exec = "${mdadm}/sbin/mdadm --monitor --scan --program ${mdadmEventHandler}";
};
}