From 153550e23b76592e5bbdc1df809dcff196f42765 Mon Sep 17 00:00:00 2001 From: Aaron Griffin Date: Sat, 6 Sep 2008 20:39:35 -0500 Subject: Split mkarchiso and configs into logical parts Signed-off-by: Aaron Griffin --- archiso/Makefile | 20 ++++++++++ archiso/hooks/archiso | 97 ++++++++++++++++++++++++++++++++++++++++++++++++ archiso/hooks/boot-cd | 37 ++++++++++++++++++ archiso/hooks/boot-usb | 35 +++++++++++++++++ archiso/install/archiso | 11 ++++++ archiso/install/boot-cd | 17 +++++++++ archiso/install/boot-usb | 16 ++++++++ 7 files changed, 233 insertions(+) create mode 100644 archiso/Makefile create mode 100644 archiso/hooks/archiso create mode 100644 archiso/hooks/boot-cd create mode 100644 archiso/hooks/boot-usb create mode 100644 archiso/install/archiso create mode 100644 archiso/install/boot-cd create mode 100644 archiso/install/boot-usb (limited to 'archiso') diff --git a/archiso/Makefile b/archiso/Makefile new file mode 100644 index 0000000..72abd11 --- /dev/null +++ b/archiso/Makefile @@ -0,0 +1,20 @@ +all: + +install: all + # install to sbin since script only usable by root + mkdir -p $(DESTDIR)/usr/sbin + install -m 755 mkarchiso $(DESTDIR)/usr/sbin + install -m 755 mkusbimg $(DESTDIR)/usr/sbin + # testiso can be used by anyone + mkdir -p $(DESTDIR)/usr/bin + install -m 755 testiso $(DESTDIR)/usr/bin + # hooks/install are needed by mkinitcpio + mkdir -p $(DESTDIR)/lib/initcpio/{hooks,install} + install -m 644 hooks/{archiso,boot-cd,boot-usb} $(DESTDIR)/lib/initcpio/hooks/ + install -m 644 install/{archiso,boot-cd,boot-usb} $(DESTDIR)/lib/initcpio/install/ + +uninstall: + rm -f $(DESTDIR)/usr/sbin/mkarchiso + rm -f $(DESTDIR)/usr/bin/testiso + rm -f $(DESTDIR)/lib/initcpio/hooks/{archiso,boot-cd,boot-usb} + rm -f $(DESTDIR)/lib/initcpio/install/{archiso,boot-cd,boot-usb} 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: diff --git a/archiso/install/archiso b/archiso/install/archiso new file mode 100644 index 0000000..7b58831 --- /dev/null +++ b/archiso/install/archiso @@ -0,0 +1,11 @@ +install () +{ + MODULES="cdrom ide-cd_mod ide-core ide-generic unionfs squashfs isofs loop $(all_modules '/kernel/fs' | grep -v "nls") " + BINARIES="" + FILES="" + add_dir /real_root + add_dir /tmpfs + SCRIPT="archiso" +} + +# vim:ft=sh:ts=4:sw=4:et: diff --git a/archiso/install/boot-cd b/archiso/install/boot-cd new file mode 100644 index 0000000..2d96869 --- /dev/null +++ b/archiso/install/boot-cd @@ -0,0 +1,17 @@ +install () +{ + MODULES="cdrom ide-cd_mod ide-core ide-generic unionfs squashfs isofs $(all_modules '/kernel/fs' | grep -v "nls") " + + # need usb modules for external drives + MODULES="${MODULES} $(checked_modules "/usb/host" | grep -ve "_cs" -e "sl1811-hcd" -e "isp116x-hcd")" + MODULES=$(echo ${MODULES}) #trim whitespace + if [ "x${MODULES}" != "x" ]; then + MODULES="${MODULES} usb_storage sd_mod sr_mod" + fi + + BINARIES="" + FILES="" + SCRIPT="boot-cd" +} + +# vim:ft=sh:ts=4:sw=4:et: diff --git a/archiso/install/boot-usb b/archiso/install/boot-usb new file mode 100644 index 0000000..32d451f --- /dev/null +++ b/archiso/install/boot-usb @@ -0,0 +1,16 @@ +install () +{ + MODULES="cdrom ide-cd_mod ide-core ide-generic unionfs squashfs $(all_modules '/kernel/fs' | grep -v "nls") " + + MODULES="${MODULES} $(checked_modules "/usb/host" | grep -ve "_cs" -e "sl1811-hcd" -e "isp116x-hcd")" + + MODULES=$(echo ${MODULES}) #trim whitespace + if [ "x${MODULES}" != "x" ]; then + MODULES="${MODULES} usb_storage sd_mod sr_mod" + fi + BINARIES="" + FILES="" + SCRIPT="boot-usb" +} + +# vim:ft=sh:ts=4:sw=4:et: -- cgit v1.2.3-70-g09d2