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=1fa7b4b453e96533ae1... [#3] http://mailman.archlinux.org/pipermail/arch-projects/2011-August/001749.html Signed-off-by: Gerardo Exequiel Pozzi <vmlinuz386@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