ISO/hooks/archiso
Simo Leone a0a8c9ef09 Implement fstab-like addon config
For now all it handles is bind mounting and squashfs
images that have to overlay at the root. The config
file syntax is obviously borrowed from fstab. This
is far from final, much of it could use some cleanup.

Signed-off-by: Simo Leone <simo@archlinux.org>
2007-10-16 23:49:30 -05:00

87 lines
3.2 KiB
Bash

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
squashimg="${BOOT_MOUNT}/archlive.sqfs"
if [ "${copytoram}" = "y" ]; then
/bin/cat ${squashimg} > /tmpfs/archlive.sqfs
squashimg="/tmpfs/archlive.sqfs"
fi
msg ":: Mounting squashfs image"
/bin/modprobe -q squashfs >/dev/null 2>&1
/bin/mkdir -p /tmpfs/squashfs_root
if ! /bin/losetup /dev/loop0 "${squashimg}" >/dev/null 2>&1; then
echo "ERROR: Cannot mount loop device /dev/loop0...aborting"
exit 1
fi
/bin/mount -r -t squashfs /dev/loop0 /tmpfs/squashfs_root
msg ":: Mounting root (union) filesystem"
/bin/modprobe -q unionfs >/dev/null 2>&1
/bin/mount -t unionfs -o dirs=/tmpfs=rw none /real_root
# 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"
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
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: