summaryrefslogtreecommitdiff
path: root/archiso
diff options
context:
space:
mode:
Diffstat (limited to 'archiso')
-rw-r--r--archiso/Makefile6
-rw-r--r--archiso/archiso_shutdown43
-rw-r--r--archiso/hooks/archiso_shutdown22
-rw-r--r--archiso/install/archiso_shutdown13
4 files changed, 84 insertions, 0 deletions
diff --git a/archiso/Makefile b/archiso/Makefile
index 4e8291e..aa137b8 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 archiso_pxe_nbd $(DESTDIR)/lib/initcpio/archiso_pxe_nbd
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
@@ -32,6 +35,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/archiso_pxe_nbd
rm -f $(DESTDIR)/lib/initcpio/hooks/archiso_pxe_nbd
rm -f $(DESTDIR)/lib/initcpio/install/archiso_pxe_nbd
diff --git a/archiso/archiso_shutdown b/archiso/archiso_shutdown
new file mode 100644
index 0000000..de1197e
--- /dev/null
+++ b/archiso/archiso_shutdown
@@ -0,0 +1,43 @@
+#!/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
+ if [[ -f /oldrun/archiso/nbd_client.pid ]]; then
+ nbd-client -d /dev/nbd0
+ 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..1cc6e0e
--- /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
+ cp /bin/busybox /run/initramfs/bin/
+ cp /lib/ld-* /run/initramfs/lib/
+ cp /lib/lib* /run/initramfs/lib/
+ cp /sbin/dmsetup /run/initramfs/sbin/
+ if [[ -x /bin/nbd-client ]]; then
+ cp /bin/nbd-client /run/initramfs/bin/
+ fi
+
+ 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
+}