future-install-scripts/pacstrap.in
Tom Gundersen e032c0305e pacstrap: copy the mirrorlist from the host to the new root
This would overwrite an existing mirrorlist, but the one at the host
is known to be good at this point, so the loss is minimal.

Signed-off-by: Tom Gundersen <teg@jklm.no>
2012-06-22 18:55:04 -04:00

88 lines
2.0 KiB
Bash

#!/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
#
shopt -s extglob
m4_include(common)
declare newroot=/mnt
usage() {
cat <<EOF
usage: ${0##*/} [options]
Options:
-r root Install to 'root' (default: /mnt)
-d Allow installation to a non-mountpoint directory
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 ':dr:' flag; do
case $flag in
d)
directory=1
;;
r)
newroot=$OPTARG
;;
:)
die '%s: option requires an argument -- '\''%s'\' "${0##*/}" "$OPTARG"
;;
?)
die '%s: invalid option -- '\''%s'\' "${0##*/}" "$OPTARG"
;;
esac
done
shift $(( OPTIND - 1 ))
if (( $# )); then
packages=("$@")
else
packages=('base' 'base-devel')
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 -p "$newroot/var/lib/pacman" "$newroot"/{dev,proc,sys,run,tmp,etc}
# always call umount on quit after this point
trap 'api_fs_umount "$newroot" 2>/dev/null' EXIT
# mount API filesystems
api_fs_mount "$newroot" || die "failed to setup API filesystems in new root"
msg 'Installing packages to %s' "$newroot"
if ! pacman -r "$newroot" -Sy --noconfirm "${packages[@]}"; then
die 'Failed to install packages to new root'
fi
# 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
# install the host's mirrorlist onto the new root
cp -a /etc/pacman.d/mirrorlist "$newroot/etc/pacman.d/"
# vim: et ts=2 sw=2 ft=sh: