diff --git a/addon_config b/addon_config index e8bbdea..7288348 100644 --- a/addon_config +++ b/addon_config @@ -1,17 +1,8 @@ -# This script gets run around the end of the archiso hook -# These are some typical examples of what addons may need +# img - location of image/directory to mount relative to addons directory +# mount point - absolute location on the post-initrd root +# type - either 'bind' or 'squashfs' for now -# installer package payload in a plain directory -mkdir -p /real_root/packages -mount -o bind $BOOT_MOUNT/addons/core /real_root/packages +# syntax: -# a squashed livecd-specific overlay for a pristine system -#TODO: we should keep track of used loop devices in case of multiple images -mkdir -p /tmpfs/mnt/live_overlay -if ! /bin/losetup /dev/loop1 "${BOOT_MOUNT}/addons/live_overlay.sqfs" >/dev/null 2>&1; then - echo "ERROR: Cannot mount loop device /dev/loop1...aborting" -fi -/bin/mount -r -t squashfs /dev/loop1 /tmpfs/mnt/live_overlay -mount -t unionfs -o remount,add=/tmpfs/squashfs_root:/tmpfs/mnt/live_overlay=ro none /real_root - -# vim:ft=sh:ts=4:sw=4:et: +core /packages bind +live_overlay.sqfs / squashfs diff --git a/hooks/archiso b/hooks/archiso index e345382..70b06c3 100644 --- a/hooks/archiso +++ b/hooks/archiso @@ -31,14 +31,38 @@ run_hook () msg ":: Mounting root (union) filesystem" /bin/modprobe -q unionfs >/dev/null 2>&1 - /bin/mount -t unionfs -o dirs=/tmpfs=rw:/tmpfs/squashfs_root=ro none /real_root + /bin/mount -t unionfs -o dirs=/tmpfs=rw none /real_root - addon_conf="${BOOT_MOUNT}/addons/config" - if [ -e "${addon_conf}" ]; then + # TODO: some of this could be broken into functions + LOOP_NUM="1" + addon_dir="${BOOT_MOUNT}/addons" + if [ -e "${addon_dir}/config" ]; then msg ":: Mounting addons" - . $addon_conf + while read img mountpoint type; do + # check if this line is a comment (starts with #) + [ "${img#'#'}" != "${img}" ] && continue + + if [ "${type}" = "bind" ]; then + msg " Binding ${img} to ${mountpoint}" + mkdir -p /real_root${mountpoint} + /bin/mount -o bind ${addon_dir}/$img /real_root${mountpoint} + elif [ "${type}" = "squashfs" ]; then + msg " Adding new union branch: ${img}" + mkdir -p "/tmpfs/mnt/loop${LOOP_NUM}" + if ! /bin/losetup "/dev/loop${LOOP_NUM}" ${addon_dir}/$img > /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" + LOOP_NUM=$(( $LOOP_NUM + 1 )) + fi + done < ${addon_dir}/config fi + /bin/mount -t unionfs -o remount,add=:/tmpfs/squashfs_root=ro none /real_root + if [ -d /proc/sys/dev/cdrom ]; then echo 0 > /proc/sys/dev/cdrom/lock echo 1 > /proc/sys/dev/cdrom/autoeject