archiso/archiso/mkarchiso
Aaron Griffin 2b6515271d Remove mkinitcpio functionality
We don't want to tie the archiso scripts to the way the ISO
should boot the live system. This can and should be done at
the build (Makefile) level beforehand

Signed-off-by: Aaron Griffin <aaronmgriffin@gmail.com>
2008-10-19 23:31:50 -05:00

229 lines
6.6 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 <working dir> : install packages to the working dir"
echo " squash <working dir> <sqfs name> : generate a squashfs image of the working dir"
echo " image <working 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
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 " mount description file: ${MOUNTFILE}"
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"
USE_GRUB=1
bootflags=""
if [ "$USE_GRUB" = "1" ]; then
_pacman grub #grub-gfx ??
mkdir -p "${work_dir}/boot/grub"
cp "${work_dir}/usr/lib/grub/i386-pc/*" "${work_dir}/boot/grub"
# copy over kernel and grub configs for boot
if [ -d "${work_dir}/boot" -a -e "${DEF_CONFIG_DIR}/boot" ]; then
rm -rf "${work_dir}/boot"
cp -r "${work_dir}/boot" "${work_dir}"
cp -rf "${DEF_CONFIG_DIR}/boot" "${work_dir}"
fi
bootflags="boot/grub/stage2_eltorito"
else
_pacman isolinux
bootflags="boot/whatever/isolinux"
fi
if [ "x$IMG_TYPE" == "xdisk" ]; then
echo "Creating DISK image..."
mkusbimg "${work_dir}" "${imgname}"
else
echo "Creating ISO image..."
if [ -z "$bootflags" ]; then
echo "Eeek, no boot flags found. This probably won't be bootable"
fi
qflag=""
[ "${QUIET}" = "y" ] && qflag="-q"
mkisofs ${qflag} -r -l $bootflags -uid 0 -gid 0 \
-no-emul-boot -boot-load-size 4 -boot-info-table \
-publisher "Arch Linux <archlinux.org>" \
-input-charset=UTF-8 -p "prepared by mkarchiso" \
-A "Arch Linux Live/Rescue CD" \
-o "${imgname}" "${work_dir}"
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: