ISO/archiso/mkarchiso
Aaron Griffin ee900303ae Move grub/isolinux stuff to Makefile level
Again, in an attempt to make this feel cleaner, I've moved
more out to the makefile level. Not sure I'm happy with that
but it works for now

Signed-off-by: Aaron Griffin <aaronmgriffin@gmail.com>
2008-10-25 01:32:12 -05:00

253 lines
7.3 KiB
Bash
Executable File

#!/bin/bash
PKGLIST=""
QUIET="y"
FORCE="n"
MOUNTFILE="$(pwd)/mounts"
IMG_TYPE="iso"
APPNAME=$(basename "${0}")
# usage: usage <exitvalue>
usage ()
{
echo "usage ${APPNAME} [options] command <command options>"
echo " general options:"
echo " -f Force overwrite of working files/squashfs image/bootable image"
echo " -p PACKAGE(S) Additional package(s) to install, can be used multiple times"
echo " -t <iso,disk> Type of image to create. Defaults to iso."
echo " -v Enable verbose output."
echo " -h This message."
echo " commands:"
echo " install <dir> : install packages to the working dir"
echo " squash <dir> <sqfs name> : generate a squashfs image of the working dir"
echo " image -p <bootloader> <dir> <image name> : build an image from the working dir"
exit $1
}
while getopts 'i:P:p:a:t:fvh' arg; do
case "${arg}" in
p) PKGLIST="${PKGLIST} ${OPTARG}" ;;
t) IMG_TYPE="${OPTARG}" ;;
f) FORCE="y" ;;
v) QUIET="n" ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done
#trim spaces
PKGLIST="$(echo $PKGLIST)"
shift $(($OPTIND - 1))
echo "ARGS: $@"
# do UID checking here so someone can at least get usage instructions
if [ "$EUID" != "0" ]; then
echo "error: This script must be run as root."
exit 1
fi
command_name="${1}"
work_dir=""
imgname=""
case "${command_name}" in
install) work_dir="${2}"; imgname="none" ;;
squash) work_dir="${2}"; imgname="${3}" ;;
image) work_dir="${2}"; imgname="${3}" ;;
*) echo "invalid command name '${command_name}'"; usage 1 ;;
esac
[ "x${imgname}" = "x" ] && (echo "Image name must be specified" && usage 1)
[ "x${work_dir}" = "x" ] && (echo "Please specify a working directory" && usage 1)
echo "${APPNAME} : Configuration Settings"
echo " working directory: ${work_dir}"
echo " image name: ${imgname}"
echo " image type: ${IMG_TYPE}"
# usage: _pacman <packages>...
_pacman ()
{
local ret
if [ "${QUIET}" = "y" ]; then
mkarchroot -f ${work_dir} $* 2>&1 >/dev/null
ret=$?
else
mkarchroot -f ${work_dir} $*
ret=$?
fi
# Cleanup
find "${work_dir}" -name *.pacnew -name *.pacsave -name *.pacorig -delete
if [ $ret -ne 0 ]; then
exit 1
fi
}
command_install () {
echo "====> Installing packages to '${work_dir}'"
if [ -e "${work_dir}" -a "${FORCE}" = "n" ]; then
echo "error: Working dir '${work_dir}' already exists, aborting."
exit 1
fi
mkdir -p "${work_dir}"
if [ "${PKGLIST}" = "" ]; then
echo "error: no packages to install"
exit 1
fi
echo "Installing packages..."
_pacman "${PKGLIST}"
if [ -d "${work_dir}/lib/modules/" ]; then
echo "Updating kernel module dependencies"
kernelver=$(_kversion)
depmod -a -b "${work_dir}" "${kernelver}"
fi
echo "Cleaning up what we can"
if [ -d "${work_dir}/boot/" ]; then
# remove the initcpio images that were generated for the host system
find "${work_dir}/boot" -name *.img -delete
fi
#TODO is this needed? do it at the Makefile level?
if [ -d "${work_dir}/home/" ]; then
echo "Creating default home directory"
install -d -o1000 -g100 -m0755 "${work_dir}/home/arch"
fi
# delete a lot of unnecessary cache/log files
kill_dirs="var/abs var/cache/man var/cache/pacman var/log/* var/mail tmp/* initrd"
for x in ${kill_dirs}; do
if [ -e "${work_dir}/${x}" ]; then
rm -rf "${work_dir}/${x}"
fi
done
# pacman DBs are big, delete all sync dbs
rm -rf "${work_dir}/var/lib/pacman/sync"
}
# command_squash path image
command_squash () {
echo "====> Generating SquashFS image ${imgname}"
if [ -e "${imgname}" ]; then
if [ "${FORCE}" = "y" ]; then
echo -n "Removing old SquashFS image..."
rm "${imgname}"
echo "done."
else
echo "error: SquashFS image '${imgname}' already exists, aborting."
exit 1
fi
fi
echo "Creating SquashFS image. This may take some time..."
start=$(date +%s)
if [ "${QUIET}" = "y" ]; then
mksquashfs "${work_dir}" "${imgname}" -noappend >/dev/null
else
mksquashfs "${work_dir}" "${imgname}" -noappend
fi
minutes=$(echo $start $(date +%s) | awk '{ printf "%0.2f",($2-$1)/60 }')
echo "Image creation done in $minutes minutes."
}
command_image () {
echo "====> Making bootable image"
if [ -e "${imgname}" ]; then
if [ "${FORCE}" = "y" ]; then
echo "Removing existing bootable image..."
rm -rf "${imgname}"
else
echo "error: Image '${imgname}' already exists, aborting."
exit 1
fi
fi
if [ ! -e "${MOUNTFILE}" ]; then
echo "error: mount file '${MOUNTFILE}' does not exist, aborting."
exit 1
fi
cp "${MOUNTFILE}" "${work_dir}/mounts"
bootflags=""
if [ "$PKGLIST" = "grub" -o "$PKGLIST" = "grub-gfx" ]; then
#test for either (eww, gross)
tst=0
pacman -Qi grub >/dev/null 2>&1
tst=$(($tst + $?))
pacman -Qi grub-gfx >/dev/null 2>&1
tst=$(($tst + $?))
if [ $tst -ge 2 ]; then
echo "grub or grub-gfx not found on host system. Cannot install!"
exit 1
fi
if [ ! -e "${work_dir}/boot/grub/stage2_eltorito" ]; then
echo "error: grub stage files not found in '${work_dir}/boot/grub"
exit 1
fi
bootflags="-b boot/grub/stage2_eltorito"
elif [ "$PKGLIST" = "isolinux" ]; then
if ! pacman -Qi $PKGLIST >/dev/null 2>&1; then
echo "$PKGLIST not found on host system. Cannot install!"
exit 1
fi
if [ ! -e "${work_dir}/boot/isolinux/isolinux.bin" ]; then
echo "error: isolinux bin file not found in '${work_dir}/boot/isolinux"
exit 1
fi
bootflags="-b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat"
else
echo "No bootloader specified. Use the -p flag to specify"
echo " Supported Bootloaders:"
echo " grub"
echo " grub-gfx"
echo " isolinux"
exit 1
fi
if [ "$IMG_TYPE" = "disk" ]; then
echo "Creating DISK image..."
mkusbimg "${work_dir}" "${imgname}"
elif [ "$IMG_TYPE" = "iso" ]; then
echo "Creating ISO image..."
qflag=""
#[ "${QUIET}" = "y" ] && qflag="-q"
mkisofs ${qflag} -r -l $bootflags -uid 0 -gid 0 \
-input-charset utf-8 -p "prepared by mkarchiso" \
-no-emul-boot -boot-load-size 4 -boot-info-table \
-publisher "ArchLinux <archlinux.org>" \
-A "ArchLinux Live/Rescue CD" \
-o "${imgname}" "${work_dir}"
else
echo "Invalid image type '$IMG_TYPE' specified"
exit 1
fi
}
# Go through the main commands in order. If 'all' was specified, then we want
# to do everything. Start with 'install'.
if [ "${command_name}" = "install" ]; then
command_install
fi
if [ "${command_name}" = "squash" ]; then
command_squash
fi
if [ "${command_name}" = "image" ]; then
command_image
fi
# vim:ts=4:sw=4:et: