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

Gerardo Exequiel Pozzi vmlinuz386 at yahoo.com.ar
Sat Aug 27 02:31:26 EDT 2011


v3:
  * Do not use lazy unmount, walk each mount point then unmount.
  * Checks for copytoram= and loopback iso mount (archiso_loop_mnt hook)

STATUS: Working (std boot, loop_mnt, pxe) with copytoram=[y|n].

NEEDS: initscript > 2011.07.3, mkinitcpio > 0.7.2, mkinitcpio-busybox > 1.18.5-1

Purpose: we need this for propertly unmount $cow_device,
used for persistent dm-snapshot devices.

This hook is based on work from Tom Gundersen[#1],
but adapted for archiso things (specially the shutdown script)

[#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>
---
 README                           |    7 ++++-
 archiso/Makefile                 |    6 +++++
 archiso/archiso_shutdown         |   40 ++++++++++++++++++++++++++++++++++++++
 archiso/hooks/archiso_shutdown   |   21 +++++++++++++++++++
 archiso/install/archiso_shutdown |   13 ++++++++++++
 configs/releng/build.sh          |    3 +-
 configs/releng/mkinitcpio.conf   |    2 +-
 7 files changed, 88 insertions(+), 4 deletions(-)
 create mode 100644 archiso/archiso_shutdown
 create mode 100644 archiso/hooks/archiso_shutdown
 create mode 100644 archiso/install/archiso_shutdown

diff --git a/README b/README
index 55e84d8..c8549cd 100644
--- a/README
+++ b/README
@@ -81,8 +81,10 @@ INDEX
 
 ** hooks/archiso_loop_mnt
 
-* img_dev=          Device where archiso-image.iso reside.
+* img_label=        Set the filesystem label where archiso-image.iso.
                     Default: (unset)
+* img_dev=          Device where archiso-image.iso reside.
+                    Default: (unset) or "/dev/disk/by-label/${img_label}"
 * img_loop=         Full path where archiso-image.iso is located on ${img_dev}
                     Default: (unset)
 
@@ -122,7 +124,8 @@ if nothing is specified on command line.
 * archiso_pxe_nbd
  + mkinitcpio-nfs-utils    for ipconfig
  + nbd                     for nbd-client
-
+* archiso_shutdown
+ + (none)
 
 
 *** Image types generated by mkarchiso.
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..eacf6d3
--- /dev/null
+++ b/archiso/archiso_shutdown
@@ -0,0 +1,40 @@
+#!/bin/sh
+
+# /oldroot depends on things inside /oldroot/run/archiso...
+mkdir /oldrun
+mount --move /oldroot/run /oldrun
+
+# Unmount all mounts now.
+umount $(mount | awk '$3 ~/^\/oldroot/ {print $3}' | sort -r)
+
+# Remove all dm-snapshot devices.
+dmsetup remove_all
+
+# Remove all loopback devices made for dm-snapshots devices
+# other misc loops like used for pure squashfs images
+# and unmount/detach *.fs.sfs images.
+for _lup in $(ls -r /dev/loop[1-9][0-9][0-9]); do
+    if ! losetup -d ${_lup} 2> /dev/null; then
+        umount -d ${_lup}
+    fi
+done
+
+# Unmount the space used to store *.cow.
+umount /oldrun/archiso/cowspace
+
+# Unmount boot device if needed (no copytoram=y used)
+if [[ ! -d /oldrun/archiso/copytoram ]]; then
+    umount /oldrun/archiso/bootmnt
+    # Detach img_loop= and unmount img_dev= (archiso_loop_mnt hook)
+    if [[ -f /oldrun/archiso/img_dev_loop ]]; then
+        losetup -d $(cat /oldrun/archiso/img_dev_loop)
+        umount /oldrun/archiso/img_dev
+    fi
+fi
+
+# 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..cb9ad8a
--- /dev/null
+++ b/archiso/hooks/archiso_shutdown
@@ -0,0 +1,21 @@
+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
+    cp /bin/busybox /run/initramfs/bin/
+    cp /lib/ld-* /run/initramfs/lib/
+    cp /lib/lib* /run/initramfs/lib/
+    cp /sbin/blockdev /run/initramfs/sbin/
+    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..49dfc8c
--- /dev/null
+++ b/archiso/install/archiso_shutdown
@@ -0,0 +1,13 @@
+build() {
+    SCRIPT="archiso_shutdown"
+    add_binary /lib/initcpio/archiso_shutdown /shutdown
+}
+
+help () {
+    cat <<HELPEOF
+This hook will create a shutdown initramfs in /run/initramfs
+that we can pivot to on shutdown in order to unmount / and
+and others mount points, dm-snapshot devices and loopback devices.
+Mostly usefull for dm-snapshot persistent.
+HELPEOF
+}
diff --git a/configs/releng/build.sh b/configs/releng/build.sh
index feac4a8..aefdb9e 100755
--- a/configs/releng/build.sh
+++ b/configs/releng/build.sh
@@ -43,10 +43,11 @@ make_customize_root_image() {
 make_setup_mkinitcpio() {
    if [[ ! -e ${work_dir}/build.${FUNCNAME} ]]; then
         local _hook
-        for _hook in archiso archiso_pxe_nbd archiso_loop_mnt; do
+        for _hook in archiso archiso_pxe_nbd archiso_loop_mnt archiso_shutdown; do
             cp /lib/initcpio/hooks/${_hook} ${work_dir}/root-image/lib/initcpio/hooks
             cp /lib/initcpio/install/${_hook} ${work_dir}/root-image/lib/initcpio/install
         done
+        cp /lib/initcpio/archiso_shutdown ${work_dir}/root-image/lib/initcpio
         : > ${work_dir}/build.${FUNCNAME}
    fi
 }
diff --git a/configs/releng/mkinitcpio.conf b/configs/releng/mkinitcpio.conf
index df833eb..b8aa656 100644
--- a/configs/releng/mkinitcpio.conf
+++ b/configs/releng/mkinitcpio.conf
@@ -1,2 +1,2 @@
-HOOKS="base udev memdisk archiso archiso_pxe_nbd archiso_loop_mnt pata scsi sata usb fw pcmcia filesystems usbinput"
+HOOKS="base udev memdisk archiso archiso_pxe_nbd archiso_loop_mnt archiso_shutdown pata scsi sata usb fw pcmcia filesystems usbinput"
 COMPRESSION="xz"
-- 
1.7.6



More information about the arch-releng mailing list