[arch-releng] [DRAFT] [archiso] Add archiso_shutdown hook.

Gerardo Exequiel Pozzi vmlinuz386 at yahoo.com.ar
Wed Aug 24 19:23:46 EDT 2011


STATUS:
    Works for standard boot and with cow_device :)
TODO:
    Testing needed for archiso_loop_mnt and archiso_pxe_nbd
    Also for copytoram=y, and mix of options/hooks.
NEEDS:
    This commit [#2] in initscripts to work (no release at this time).
    Also this other [#3] for mkinitcpio (fix /run that is mounted as noexec)

This hook is based on work from Tom Gundersen[#1], but adapted for archiso things.

Motivation for this is for unmount property all filesystem, mostly for dm-snapshot persistent.

[#1] http://mailman.archlinux.org/pipermail/arch-projects/2011-July/001549.html
[#2] http://projects.archlinux.org/initscripts.git/commit/?id=1fa7b4b453e96533ae1db3630031285e5fc302b3
[#3] http://mailman.archlinux.org/pipermail/arch-projects/2011-August/001749.html

Signed-off-by: Gerardo Exequiel Pozzi <vmlinuz386 at yahoo.com.ar>
---
 archiso/Makefile                 |    6 ++++++
 archiso/archiso_shutdown         |   22 ++++++++++++++++++++++
 archiso/hooks/archiso_shutdown   |   22 ++++++++++++++++++++++
 archiso/install/archiso_shutdown |   12 ++++++++++++
 4 files changed, 62 insertions(+), 0 deletions(-)
 create mode 100644 archiso/archiso_shutdown
 create mode 100644 archiso/hooks/archiso_shutdown
 create mode 100644 archiso/install/archiso_shutdown

diff --git a/archiso/Makefile b/archiso/Makefile
index a751acd..5eac16f 100644
--- a/archiso/Makefile
+++ b/archiso/Makefile
@@ -12,6 +12,9 @@ install-hooks:
 	# hooks/install are needed by mkinitcpio
 	install -D -m 644 hooks/archiso $(DESTDIR)/lib/initcpio/hooks/archiso
 	install -D -m 644 install/archiso $(DESTDIR)/lib/initcpio/install/archiso
+	install -D -m 755 archiso_shutdown $(DESTDIR)/lib/initcpio/archiso_shutdown
+	install -D -m 644 hooks/archiso_shutdown $(DESTDIR)/lib/initcpio/hooks/archiso_shutdown
+	install -D -m 644 install/archiso_shutdown $(DESTDIR)/lib/initcpio/install/archiso_shutdown
 	install -D -m 644 hooks/archiso_pxe_nbd $(DESTDIR)/lib/initcpio/hooks/archiso_pxe_nbd
 	install -D -m 644 install/archiso_pxe_nbd $(DESTDIR)/lib/initcpio/install/archiso_pxe_nbd
 	install -D -m 644 hooks/archiso_loop_mnt $(DESTDIR)/lib/initcpio/hooks/archiso_loop_mnt
@@ -31,6 +34,9 @@ uninstall:
 	rm -f $(DESTDIR)/usr/bin/testiso
 	rm -f $(DESTDIR)/lib/initcpio/hooks/archiso
 	rm -f $(DESTDIR)/lib/initcpio/install/archiso
+	rm -f $(DESTDIR)/lib/initcpio/archiso_shutdown
+	rm -f $(DESTDIR)/lib/initcpio/hooks/archiso_shutdown
+	rm -f $(DESTDIR)/lib/initcpio/install/archiso_shutdown
 	rm -f $(DESTDIR)/lib/initcpio/hooks/archiso_pxe_nbd
 	rm -f $(DESTDIR)/lib/initcpio/install/archiso_pxe_nbd
 	rm -f $(DESTDIR)/lib/initcpio/hooks/archiso_loop_mnt
diff --git a/archiso/archiso_shutdown b/archiso/archiso_shutdown
new file mode 100644
index 0000000..ffbb416
--- /dev/null
+++ b/archiso/archiso_shutdown
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+# Lazy unmount /oldroot and all things inside.
+umount -l /oldroot
+
+# Remove all dm-snapshot devices.
+dmsetup remove_all
+
+# Detach each loop device in reverse order (archiso start from 100 to N).
+for _lup in $(ls -r /dev/loop???); do
+    losetup -d ${_lup}
+done
+
+# Only in DRAFT!
+/bin/sh
+
+# reboot / poweroff / halt, depending on the argument passed by init
+# if something invalid is passed, we halt
+case "$1" in
+  reboot|poweroff|halt) "$1" -f ;;
+  *) halt -f;;
+esac
diff --git a/archiso/hooks/archiso_shutdown b/archiso/hooks/archiso_shutdown
new file mode 100644
index 0000000..c3940fc
--- /dev/null
+++ b/archiso/hooks/archiso_shutdown
@@ -0,0 +1,22 @@
+run_hook ()
+{
+    msg -n ":: Creating shutdown ramfs..."
+
+    mkdir -p /run/initramfs/usr/bin
+    mkdir /run/initramfs/usr/sbin
+    mkdir /run/initramfs/bin
+    mkdir /run/initramfs/sbin
+    mkdir /run/initramfs/lib
+    mkdir -p /run/initramfs/goodbye
+
+    cp /bin/busybox /run/initramfs/bin/
+    cp /lib/ld-* /run/initramfs/lib/
+    cp /lib/lib* /run/initramfs/lib/
+    cp /sbin/lvm /run/initramfs/sbin/
+    cp /sbin/dmsetup /run/initramfs/sbin/
+
+    chroot /run/initramfs /bin/busybox --install
+    cp /shutdown /run/initramfs/
+
+    msg "done."
+}
diff --git a/archiso/install/archiso_shutdown b/archiso/install/archiso_shutdown
new file mode 100644
index 0000000..d31cf56
--- /dev/null
+++ b/archiso/install/archiso_shutdown
@@ -0,0 +1,12 @@
+build() {
+    SCRIPT="archiso_shutdown"
+    add_binary /lib/initcpio/archiso_shutdown /shutdown
+}
+
+help () {
+    cat <<HELPEOF
+This hook will create a shutdown initrd in /run/mkinitramfs
+that we can pivot to on shutdown in order to unmount /
+(and any submounts such as /usr) cleanly.
+HELPEOF
+}
-- 
1.7.6



More information about the arch-releng mailing list