[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