From 169ffac7ad7748c8586fd1d68b7a417d71133140 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Mon, 2 Dec 2013 16:08:04 +1100 Subject: [PATCH] Systemd integration for starting newly-degraded arrays. Normally "mdadm -I" will not start an array if it has reason to expect further devices. This means that if a device is removed while the host is shut down, "mdadm -I" will never start the device. If the array is know to the host, it make sense to start the array anyway after a reasonable timeout. This patch adds systemd/udev infrastructure so that 30 seconds after a known array first becomes able to be assembled as a degraded array, the array will be assembled even if more devices are still expected. Signed-off-by: NeilBrown --- Makefile | 2 ++ systemd/mdadm-last-resort@.service | 7 +++++++ systemd/mdadm-last-resort@.timer | 6 ++++++ udev-md-raid-assembly.rules | 3 ++- 4 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 systemd/mdadm-last-resort@.service create mode 100644 systemd/mdadm-last-resort@.timer diff --git a/Makefile b/Makefile index c60cc2c..ae4a04e 100644 --- a/Makefile +++ b/Makefile @@ -285,6 +285,8 @@ install-udev: udev-md-raid-arrays.rules udev-md-raid-assembly.rules install-systemd: systemd/mdmon@.service $(INSTALL) -D -m 644 systemd/mdmon@.service $(DESTDIR)$(SYSTEMD_DIR)/mdmon@.service + $(INSTALL) -D -m 644 systemd/mdadm-last-resort@.timer $(DESTDIR)$(SYSTEMD_DIR)/mdadm-last-resort@.timer + $(INSTALL) -D -m 644 systemd/mdadm-last-resort@.service $(DESTDIR)$(SYSTEMD_DIR)/mdadm-last-resort@.service uninstall: rm -f $(DESTDIR)$(MAN8DIR)/mdadm.8 $(DESTDIR)$(MAN8DIR)/mdmon.8 $(DESTDIR)$(MAN4DIR)/md.4 $(DESTDIR)$(MAN5DIR)/mdadm.conf.5 $(DESTDIR)$(BINDIR)/mdadm diff --git a/systemd/mdadm-last-resort@.service b/systemd/mdadm-last-resort@.service new file mode 100644 index 0000000..45d3c2a --- /dev/null +++ b/systemd/mdadm-last-resort@.service @@ -0,0 +1,7 @@ +[Unit] +Description=Activate md array even though degraded +DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/sbin/mdadm --run /dev/%i diff --git a/systemd/mdadm-last-resort@.timer b/systemd/mdadm-last-resort@.timer new file mode 100644 index 0000000..6a1cd56 --- /dev/null +++ b/systemd/mdadm-last-resort@.timer @@ -0,0 +1,6 @@ +[Unit] +Description=Timer to wait for more drives before activating degraded array. +DefaultDependencies=no + +[Timer] +OnActiveSec=30 diff --git a/udev-md-raid-assembly.rules b/udev-md-raid-assembly.rules index b653265..72bbed4 100644 --- a/udev-md-raid-assembly.rules +++ b/udev-md-raid-assembly.rules @@ -12,7 +12,8 @@ LABEL="md_inc" # remember you can limit what gets auto/incrementally assembled by # mdadm.conf(5)'s 'AUTO' and selectively whitelist using 'ARRAY' -ACTION=="add", RUN+="/sbin/mdadm --incremental $devnode --offroot" +ACTION=="add", IMPORT{program}="/sbin/mdadm --incremental --export $devnode --offroot" +ACTION=="add", ENV{MD_STARTED}=="*unsafe*", ENV{MD_FOREIGN}=="no", ENV{SYSTEMD_WANTS}+="mdadm-last-resort@$env{MD_DEVICE}.timer" ACTION=="remove", ENV{ID_PATH}=="?*", RUN+="/sbin/mdadm -If $name --path $env{ID_PATH}" ACTION=="remove", ENV{ID_PATH}!="?*", RUN+="/sbin/mdadm -If $name"