2014-10-04 00:46:40 +02:00
|
|
|
#!/bin/bash
|
|
|
|
|
|
|
|
#
|
|
|
|
# Assumptions:
|
|
|
|
# 1) User has partitioned, formatted, and mounted partitions on /mnt
|
|
|
|
# 2) Network is functional
|
|
|
|
# 3) Arguments passed to the script are valid pacman targets
|
|
|
|
# 4) A valid mirror appears in /etc/pacman.d/mirrorlist
|
|
|
|
#
|
|
|
|
|
2014-10-08 13:14:28 +02:00
|
|
|
version=@version@
|
|
|
|
|
2014-10-04 00:46:40 +02:00
|
|
|
shopt -s extglob
|
|
|
|
|
2014-11-13 16:31:15 +01:00
|
|
|
[[ -r @libdir@/util-msg.sh ]] && source @libdir@/util-msg.sh
|
|
|
|
[[ -r @libdir@/util-mount.sh ]] && source @libdir@/util-mount.sh
|
2014-10-04 00:46:40 +02:00
|
|
|
|
|
|
|
newroot=/mnt
|
2014-10-04 10:54:55 +02:00
|
|
|
|
2014-10-04 00:46:40 +02:00
|
|
|
hostcache=0
|
|
|
|
copykeyring=1
|
|
|
|
copymirrorlist=1
|
|
|
|
|
|
|
|
usage() {
|
|
|
|
cat <<EOF
|
|
|
|
usage: ${0##*/} [options] root [packages...]
|
|
|
|
|
|
|
|
Options:
|
|
|
|
-C config Use an alternate config file for pacman
|
|
|
|
-c Use the package cache on the host, rather than the target
|
|
|
|
-d Allow installation to a non-mountpoint directory
|
|
|
|
-G Avoid copying the host's pacman keyring to the target
|
|
|
|
-i Avoid auto-confirmation of package selections
|
|
|
|
-M Avoid copying the host's mirrorlist to the target
|
|
|
|
|
|
|
|
-h Print this help message
|
|
|
|
|
2015-01-12 03:28:06 +01:00
|
|
|
basestrap installs packages to the specified new root directory. If no packages
|
2015-01-12 17:14:14 +01:00
|
|
|
are given, basestrap defaults to the "base" group.
|
2014-10-04 00:46:40 +02:00
|
|
|
|
|
|
|
EOF
|
|
|
|
}
|
|
|
|
|
|
|
|
if [[ -z $1 || $1 = @(-h|--help) ]]; then
|
|
|
|
usage
|
|
|
|
exit $(( $# ? 0 : 1 ))
|
|
|
|
fi
|
|
|
|
|
|
|
|
(( EUID == 0 )) || die 'This script must be run with root privileges'
|
|
|
|
|
|
|
|
while getopts ':C:cdGiM' flag; do
|
|
|
|
case $flag in
|
2014-10-04 15:41:22 +02:00
|
|
|
C) pacman_config=$OPTARG ;;
|
|
|
|
d) directory=1 ;;
|
|
|
|
c) hostcache=1 ;;
|
|
|
|
i) interactive=1 ;;
|
|
|
|
G) copykeyring=0 ;;
|
|
|
|
M) copymirrorlist=0 ;;
|
|
|
|
:) die '%s: option requires an argument -- '\''%s'\' "${0##*/}" "$OPTARG" ;;
|
|
|
|
?) die '%s: invalid option -- '\''%s'\' "${0##*/}" "$OPTARG" ;;
|
2014-10-04 00:46:40 +02:00
|
|
|
esac
|
|
|
|
done
|
|
|
|
shift $(( OPTIND - 1 ))
|
|
|
|
|
|
|
|
(( $# )) || die "No root directory specified"
|
|
|
|
newroot=$1; shift
|
|
|
|
pacman_args=("${@:-base}")
|
|
|
|
|
|
|
|
if (( ! hostcache )); then
|
|
|
|
pacman_args+=(--cachedir="$newroot/var/cache/pacman/pkg")
|
|
|
|
fi
|
|
|
|
|
|
|
|
if (( ! interactive )); then
|
|
|
|
pacman_args+=(--noconfirm)
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [[ $pacman_config ]]; then
|
|
|
|
pacman_args+=(--config="$pacman_config")
|
|
|
|
fi
|
|
|
|
|
|
|
|
[[ -d $newroot ]] || die "%s is not a directory" "$newroot"
|
|
|
|
if ! mountpoint -q "$newroot" && (( ! directory )); then
|
|
|
|
die '%s is not a mountpoint!' "$newroot"
|
|
|
|
fi
|
|
|
|
|
|
|
|
# create obligatory directories
|
|
|
|
msg 'Creating install root at %s' "$newroot"
|
|
|
|
mkdir -m 0755 -p "$newroot"/var/{cache/pacman/pkg,lib/pacman,log} "$newroot"/{dev,run,etc}
|
|
|
|
mkdir -m 1777 -p "$newroot"/tmp
|
|
|
|
mkdir -m 0555 -p "$newroot"/{sys,proc}
|
|
|
|
|
|
|
|
# mount API filesystems
|
2015-01-13 04:45:52 +01:00
|
|
|
chroot_api_mount "$newroot" || die "failed to setup API filesystems in new root"
|
2014-10-04 00:46:40 +02:00
|
|
|
|
|
|
|
msg 'Installing packages to %s' "$newroot"
|
|
|
|
if ! pacman -r "$newroot" -Sy "${pacman_args[@]}"; then
|
|
|
|
die 'Failed to install packages to new root'
|
|
|
|
fi
|
|
|
|
|
2015-01-11 10:23:21 +01:00
|
|
|
# enable to have more debug info
|
|
|
|
#msg "machine-id (etc): $(cat $newroot/etc/machine-id)"
|
|
|
|
#[[ -e $newroot/var/lib/dbus/machine-id ]] && msg "machine-id (lib): $(cat $newroot/var/lib/dbus/machine-id)"
|
|
|
|
#msg "running processes: "
|
|
|
|
#lsof | grep $newroot
|
|
|
|
|
|
|
|
# kill chroot process if needed (TODO: check if needed at all)
|
2015-01-12 03:28:06 +01:00
|
|
|
# TODO: test if old manjaroiso code in mkiso produces also the umount error
|
|
|
|
# if not, comment out the pid kill
|
2015-01-11 03:47:13 +01:00
|
|
|
PREFIX="$newroot"
|
|
|
|
for ROOT in /proc/*/root; do
|
2015-01-11 10:36:51 +01:00
|
|
|
LINK=$(readlink $ROOT)
|
|
|
|
if [ "x$LINK" != "x" ]; then
|
|
|
|
if [ "x${LINK:0:${#PREFIX}}" = "x$PREFIX" ]; then
|
|
|
|
# this process is in the chroot...
|
|
|
|
PID=$(basename $(dirname "$ROOT"))
|
|
|
|
NAME=$(ps -p $PID -o comm=)
|
|
|
|
msg "Killing chroot process: $NAME ($PID)"
|
|
|
|
kill -9 "$PID"
|
|
|
|
fi
|
2015-01-11 03:47:13 +01:00
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
2014-10-04 00:46:40 +02:00
|
|
|
if (( copykeyring )); then
|
|
|
|
# if there's a keyring on the host, copy it into the new root, unless it exists already
|
|
|
|
if [[ -d /etc/pacman.d/gnupg && ! -d $newroot/etc/pacman.d/gnupg ]]; then
|
|
|
|
cp -a /etc/pacman.d/gnupg "$newroot/etc/pacman.d/"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
if (( copymirrorlist )); then
|
|
|
|
# install the host's mirrorlist onto the new root
|
|
|
|
cp -a /etc/pacman.d/mirrorlist "$newroot/etc/pacman.d/"
|
|
|
|
fi
|
|
|
|
|
|
|
|
# vim: et ts=2 sw=2 ft=sh:
|