a0a8c9ef09
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>
87 lines
3.2 KiB
Bash
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:
|