devtools/mkarchroot
Simo Leone e0f139ad0e Separate mounting from config copying
Copying the configs before installing stuff
caused conflicts. Running the host's pacman
uses the host's configuration anyway, so
there is no need to copy them in this case.

Signed-off-by: Simo Leone <simo@archlinux.org>
Signed-off-by: Dan McGee <dan@archlinux.org>
2008-02-06 10:09:07 -06:00

185 lines
4.9 KiB
Bash
Executable File

#!/bin/bash
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
FORCE="n"
RUN=""
working_dir=""
APPNAME=$(basename "${0}")
# usage: usage <exitvalue>
usage ()
{
echo "usage ${APPNAME} [options] working-dir [package-list | app]"
echo " options:"
echo " -r <app> Run 'app' within the context of the chroot"
echo " -u Update the chroot via pacman"
echo " -f Force overwrite of files in the working-dir"
echo " -C <file> location of a pacman config file"
echo " -M <file> location of a makepkg config file"
echo " -h This message"
exit $1
}
while getopts 'r:ufhC:M:' arg; do
case "${arg}" in
r) RUN="$OPTARG" ;;
u) RUN="pacman -Syu" ;;
f) FORCE="y" ;;
C) pac_conf="$OPTARG" ;;
M) makepkg_conf="$OPTARG" ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done
if [ "$EUID" != "0" ]; then
echo "error: this script must be run as root."
exit 1
fi
shift $(($OPTIND - 1))
if [ "$RUN" = "" -a $# -lt 2 ]; then
echo "you must specify a directory and one or more packages"
usage 1
elif [ $# -lt 1 ]; then
echo "you must specify a directory"
usage 1
fi
working_dir="$(readlink -f ${1})"
shift 1
[ "${working_dir}" = "" ] && echo "error: please specify a working directory" && usage 1
# {{{ functions
chroot_mount ()
{
echo "mounting sysfs : /sys"
[ -e "${working_dir}/sys" ] || mkdir "${working_dir}/sys"
mount -t sysfs sysfs "${working_dir}/sys"
echo "mounting procfs : /proc"
[ -e "${working_dir}/proc" ] || mkdir "${working_dir}/proc"
mount -t proc proc "${working_dir}/proc"
echo "binding device nodes : /dev"
[ -e "${working_dir}/dev" ] || mkdir "${working_dir}/dev"
mount -o bind /dev "${working_dir}/dev"
echo "binding pacman cache : /var/cache/pacman"
[ -e "${working_dir}/var/cache/pacman" ] || mkdir -p "${working_dir}/var/cache/pacman"
mount -o bind /var/cache/pacman "${working_dir}/var/cache/pacman"
trap 'chroot_umount' 0 1 2 15
}
copy_hostconf ()
{
echo "copying mtab : /etc/mtab"
cp /etc/mtab "${working_dir}/etc/mtab"
echo "copying resolv.conf : /etc/resolv.conf"
cp /etc/resolv.conf "${working_dir}/etc/resolv.conf"
}
chroot_umount ()
{
echo "cleaning up mounts"
umount "${working_dir}/proc"
umount "${working_dir}/sys"
umount "${working_dir}/dev"
umount "${working_dir}/var/cache/pacman"
}
# }}}
if [ "$RUN" != "" ]; then
# run chroot {{{
#Sanity check
if [ ! -f "${working_dir}/.arch-chroot" ]; then
echo "error: '${working_dir}' does not appear to be a Arch chroot"
echo " please build the image using mkarchroot"
exit 1
fi
chroot_mount
copy_hostconf
echo "starting chroot ($RUN)"
chroot "${working_dir}" ${RUN}
# }}}
else
# {{{ build chroot
if [ -e "${working_dir}" -a "${FORCE}" = "n" ]; then
echo "error: working dir '${working_dir}' already exists - try using -f"
exit 1
fi
mkdir -p "${working_dir}/var/lib/pacman/"
mkdir -p "${working_dir}/etc/"
chroot_mount
pacargs="--noconfirm -v " #--noprogressbar -v
pacargs="$pacargs --root=${working_dir}"
# pacman takes these as relative to the given root
pacargs="$pacargs --cachedir=/var/cache/pacman/pkg"
if [ "$pac_conf" != "" ]; then
pacargs="$pacargs --config=${pac_conf}"
fi
if [ $# -eq 0 ]; then
echo "no packages to install"
else
echo "installing packages:"
for i in $@; do echo -e "\t$i"; done
op="-Sy"
if [ "$FORCE" = "y" ]; then
op="${op}f"
fi
if ! pacman ${op} ${pacargs} $@; then
echo "error: failed to install all packages"
exit 1
fi
fi
if [ -d "${working_dir}/lib/modules" ]; then
echo "running ldconfig"
ldconfig -r "${working_dir}"
fi
if [ "$pac_conf" != "" ]; then
echo "installing custom pacman.conf"
cp ${pac_conf} ${working_dir}/etc/pacman.conf
fi
if [ "$makepkg_conf" != "" ]; then
echo "installing custom makepkg.conf"
cp ${makepkg_conf} ${working_dir}/etc/makepkg.conf
fi
echo "generating default locales"
cp /etc/locale.gen "${working_dir}/etc/locale.gen"
chroot "${working_dir}" locale-gen
if [ ! -e "${working_dir}/.arch-chroot" ]; then
date +%s > "${working_dir}/.arch-chroot"
fi
# }}}
fi
# vim:ft=sh:ts=4:sw=4:et: