[arch-projects] [mkinitcpio][PATCH 8/8] shutdown: add new hook

Dave Reisner d at falconindy.com
Thu Jan 5 14:26:14 EST 2012


This adds functionality to pivot to back to the initramfs on shutdown,
thereby allowing the system to unmount the real root device. This will
be necessary for anyone with /usr as a separate partition.
---
 Makefile         |    2 +-
 hooks/shutdown   |    7 +++++++
 install/shutdown |   17 +++++++++++++++++
 shutdown         |   29 +++++++++++++++++++++++++++++
 4 files changed, 54 insertions(+), 1 deletions(-)
 create mode 100644 hooks/shutdown
 create mode 100644 install/shutdown
 create mode 100755 shutdown

diff --git a/Makefile b/Makefile
index 3e7966d..e1fe5aa 100644
--- a/Makefile
+++ b/Makefile
@@ -34,7 +34,7 @@ install: all
 	chmod 755 ${DESTDIR}/usr/bin/lsinitcpio ${DESTDIR}/usr/bin/mkinitcpio
 
 	install -m644 mkinitcpio.conf ${DESTDIR}/etc/mkinitcpio.conf
-	install -m755 -t ${DESTDIR}/lib/initcpio init
+	install -m755 -t ${DESTDIR}/lib/initcpio init shutdown
 	install -m644 -t ${DESTDIR}/lib/initcpio init_functions functions
 	install -m644 01-memdisk.rules ${DESTDIR}/lib/initcpio/udev/01-memdisk.rules
 
diff --git a/hooks/shutdown b/hooks/shutdown
new file mode 100644
index 0000000..7c5d9e8
--- /dev/null
+++ b/hooks/shutdown
@@ -0,0 +1,7 @@
+#!/usr/bin/ash
+
+run_hook() {
+    cp -ax / /run/initramfs
+}
+
+# vim: set ft=sh ts=4 sw=4 et:
diff --git a/install/shutdown b/install/shutdown
new file mode 100644
index 0000000..2c533b6
--- /dev/null
+++ b/install/shutdown
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+build() {
+    BINARIES='cp findmnt'
+    SCRIPT='shutdown'
+
+    add_file "/lib/initcpio/shutdown" "/shutdown"
+}
+
+help() {
+    cat <<HELPEOF
+This hook copies the contents of the initramfs into /run/initramfs for reuse
+on shutdown. This is needed when you have /usr mounted on a separate partition.
+HELPEOF
+}
+
+# vim: set ft=sh ts=4 sw=4 et:
diff --git a/shutdown b/shutdown
new file mode 100755
index 0000000..100f505
--- /dev/null
+++ b/shutdown
@@ -0,0 +1,29 @@
+#!/usr/bin/ash
+
+findmnt -Rruno TARGET /oldroot | awk '
+BEGIN { i = 0 }
+! /^\/(proc|dev|sys)/ {
+  i++
+  mounts[i] = $0
+}
+END {
+  for (j = i; j > 0; j--) {
+    print mounts[j]
+  }
+}
+' | while read -r mount; do
+  umount -l "$mount"
+done
+
+case $1 in
+  reboot)
+    type kexec >/dev/null && kexec -e
+    reboot -f
+    ;;
+  poweroff|shutdown|halt)
+    "$1" -f
+    ;;
+  *)
+    poweroff -f
+    ;;
+esac
-- 
1.7.8.1



More information about the arch-projects mailing list