summaryrefslogtreecommitdiff
path: root/archiso/hooks
diff options
context:
space:
mode:
Diffstat (limited to 'archiso/hooks')
-rw-r--r--archiso/hooks/archiso97
-rw-r--r--archiso/hooks/boot-cd37
-rw-r--r--archiso/hooks/boot-usb35
3 files changed, 169 insertions, 0 deletions
diff --git a/archiso/hooks/archiso b/archiso/hooks/archiso
new file mode 100644
index 0000000..8a6b648
--- /dev/null
+++ b/archiso/hooks/archiso
@@ -0,0 +1,97 @@
+# args: source, mountpoint
+_mnt_bind()
+{
+ msg "::: Binding ${1} to ${2}"
+ mkdir -p /real_root${2}
+ /bin/mount -o bind ${addon_dir}/${1} /real_root${2}
+}
+
+# args: image file
+_mnt_squashfs()
+{
+ msg "::: Adding new union branch: ${1}"
+ /bin/modprobe -q loop >/dev/null 2>&1
+ mkdir -p "/tmpfs/mnt/loop${LOOP_NUM}"
+ if ! /bin/losetup "/dev/loop${LOOP_NUM}" ${1} > /dev/null 2>&1; then
+ echo "ERROR: Cannot mount loop device /dev/loop${LOOP_NUM}"
+ echo " Couldn't mount all addons"
+ break
+ fi
+ /bin/mount -r -t squashfs "/dev/loop${LOOP_NUM}" "/tmpfs/mnt/loop${LOOP_NUM}"
+ /bin/mount -t unionfs -o remount,add=:/tmpfs/mnt/loop${LOOP_NUM}=ro none "/real_root"
+ export LOOP_NUM=$(( $LOOP_NUM + 1 ))
+}
+
+run_hook ()
+{
+ if [ "x${ramdisk_size}" = "x" ]; then
+ ramdisk_size="75%"
+ fi
+ msg -n ":: Mounting tmpfs, size=${ramdisk_size}..."
+ mount -t tmpfs -o "size=${ramdisk_size}" tmpfs /tmpfs
+ msg "done."
+
+ if [ "x${BOOT_MOUNT}" = "x" ]; then
+ echo "ERROR: BOOT_MOUNT is not set. The boot-cd or boot-usb hook MUST"
+ echo " be run before this one. This image was improperly built"
+ exit 1
+ fi
+
+ base_img="${BOOT_MOUNT}/archlive.sqfs"
+ if [ "${copytoram}" = "y" ]; then
+ msg ":: Copying squashfs image to RAM"
+ /bin/cat ${base_img} > /tmpfs/archlive.sqfs
+ base_img="/tmpfs/archlive.sqfs"
+ fi
+
+ msg ":: Mounting squashfs image"
+ /bin/modprobe -q squashfs >/dev/null 2>&1
+
+ msg ":: Mounting root (union) filesystem"
+ /bin/modprobe -q unionfs >/dev/null 2>&1
+ /bin/mount -t unionfs -o dirs=/tmpfs=rw none /real_root
+
+ export LOOP_NUM="0"
+ addon_dir="${BOOT_MOUNT}/addons"
+
+ # always layer default configuration
+ _mnt_squashfs "${addon_dir}/default-config.sqfs"
+
+ if [ -e "${addon_dir}/config" ]; then
+ msg ":: Mounting addons"
+ while read img mountpoint type; do
+ # check if this line is a comment (starts with #)
+ [ "${img#"#"}" != "${img}" ] && continue
+
+ if [ "${type}" = "bind" ]; then
+ _mnt_bind ${img} ${mountpoint}
+ elif [ "${type}" = "squashfs" ]; then
+ _mnt_squashfs "${addon_dir}/${img}"
+ fi
+ done < ${addon_dir}/config
+ fi
+
+ # layer the "pristine" base system image last
+ _mnt_squashfs ${base_img}
+
+ if [ -d /proc/sys/dev/cdrom ]; then
+ echo 0 > /proc/sys/dev/cdrom/lock
+ echo 0 > /proc/sys/dev/cdrom/autoeject
+ fi
+
+ if [ "${break}" = "y" ]; then
+ echo ":: Break requested, type 'exit' to resume operation"
+ echo " NOTE: klibc contains no 'ls' binary, use 'echo *' instead"
+ PS1="ramfs$ " /bin/sh -i
+ fi
+
+ udevpid=$(/bin/minips -C udevd -o pid=)
+ [ "x${udevpid}" != "x" ] && /bin/kill -9 $udevpid 2>&1 >/dev/null
+ #Yep, we're bailing out here. We don't need kinit.
+ msg ":: Passing control to Archlinux Initscripts...Please Wait"
+ /bin/umount /sys
+ /bin/umount /proc
+ exec /bin/run-init -c /dev/console /real_root /sbin/init ${CMDLINE}
+}
+
+# vim:ft=sh:ts=4:sw=4:et:
diff --git a/archiso/hooks/boot-cd b/archiso/hooks/boot-cd
new file mode 100644
index 0000000..1670c6b
--- /dev/null
+++ b/archiso/hooks/boot-cd
@@ -0,0 +1,37 @@
+run_hook ()
+{
+ # external drives may need to settle
+ msg ":: Waiting for usb devices to settle..."
+ /sbin/udevtrigger --subsystem-match=usb
+ /sbin/udevsettle
+ sleep 5
+
+ msg ":: Scanning for boot cdrom device..."
+
+ /bin/mkdir -p /bootmnt
+ bootmnt="/bootmnt"
+ found=0
+
+ /bin/modprobe -q isofs >/dev/null 2>&1
+ for cdrom in /dev/cd/*; do
+ if mount -r -t iso9660 "${cdrom}" ${bootmnt} >/dev/null 2>&1; then
+ if [ -e "${bootmnt}/archlive.sqfs" ]; then
+ found=1
+ msg "${cdrom}"
+ break
+ fi
+ else
+ echo "Failed to mount ${cdrom}"
+ fi
+ [ ${found} -eq 0 ] && umount ${bootmnt} >/dev/null 2>&1
+ done
+
+ if [ ${found} -eq 0 ]; then
+ echo "ERROR: cannot find booted cdrom device, cannot continue..."
+ exit 1
+ else
+ export BOOT_MOUNT="${bootmnt}"
+ fi
+}
+
+# vim:ft=sh:ts=4:sw=4:et:
diff --git a/archiso/hooks/boot-usb b/archiso/hooks/boot-usb
new file mode 100644
index 0000000..e84dd1c
--- /dev/null
+++ b/archiso/hooks/boot-usb
@@ -0,0 +1,35 @@
+run_hook ()
+{
+ msg ":: Waiting for usb devices to settle..."
+ /sbin/udevtrigger --subsystem-match=usb
+ /sbin/udevsettle
+ sleep 5
+ msg ":: Scanning for boot usb device..."
+
+ /bin/mkdir -p /bootmnt
+ bootmnt="/bootmnt"
+ found=0
+
+ for usb in /dev/sd[a-z][0-9]; do
+ if mount -r -t vfat "${usb}" ${bootmnt} >/dev/null 2>&1 ||\
+ mount -r -t ext2 "${usb}" ${bootmnt} >/dev/null 2>&1; then
+ if [ -e "${bootmnt}/archlive.sqfs" ]; then
+ found=1
+ msg "${usb}"
+ break
+ fi
+ else
+ echo "Failed to mount ${usb}"
+ fi
+ [ ${found} -eq 0 ] && umount ${bootmnt} >/dev/null 2>&1
+ done
+
+ if [ ${found} -eq 0 ]; then
+ echo "ERROR: cannot find booted usb device, cannot continue..."
+ exit 1
+ else
+ export BOOT_MOUNT="${bootmnt}"
+ fi
+}
+
+# vim:ft=sh:ts=4:sw=4:et: