88c0c9db0b
In an unshare environment, /etc/pacman.d/gnupg is owned by the original root, who is now "nobody". cp will warn about this, since we can't create files owned by the original root, and it instead creates them as the unshare'd root (the original user). This is benign, so ignore it.
125 lines
3.0 KiB
Bash
125 lines
3.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)
|
|
|
|
hostcache=0
|
|
copykeyring=1
|
|
copymirrorlist=1
|
|
pacmode=-Sy
|
|
|
|
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
|
|
-G Avoid copying the host's pacman keyring to the target
|
|
-i Prompt for package confirmation when needed (run interactively)
|
|
-M Avoid copying the host's mirrorlist to the target
|
|
-U Use pacman -U to install packages
|
|
|
|
-h Print this help message
|
|
|
|
pacstrap installs packages to the specified new root directory. If no packages
|
|
are given, pacstrap defaults to the "base" group.
|
|
|
|
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:cdGiMU' flag; do
|
|
case $flag in
|
|
C)
|
|
pacman_config=$OPTARG
|
|
;;
|
|
d)
|
|
# retired flag. does nothing.
|
|
;;
|
|
c)
|
|
hostcache=1
|
|
;;
|
|
i)
|
|
interactive=1
|
|
;;
|
|
G)
|
|
copykeyring=0
|
|
;;
|
|
M)
|
|
copymirrorlist=0
|
|
;;
|
|
U)
|
|
pacmode=-U
|
|
;;
|
|
:)
|
|
die '%s: option requires an argument -- '\''%s'\' "${0##*/}" "$OPTARG"
|
|
;;
|
|
?)
|
|
die '%s: invalid option -- '\''%s'\' "${0##*/}" "$OPTARG"
|
|
;;
|
|
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"
|
|
|
|
# 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/pacman.d}
|
|
mkdir -m 1777 -p "$newroot"/tmp
|
|
mkdir -m 0555 -p "$newroot"/{sys,proc}
|
|
|
|
# mount API filesystems
|
|
chroot_setup "$newroot" || die "failed to setup chroot %s" "$newroot"
|
|
|
|
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 --no-preserve=ownership /etc/pacman.d/gnupg "$newroot/etc/pacman.d/"
|
|
fi
|
|
fi
|
|
|
|
msg 'Installing packages to %s' "$newroot"
|
|
if ! unshare --fork --pid pacman -r "$newroot" $pacmode "${pacman_args[@]}"; then
|
|
die 'Failed to install packages to new root'
|
|
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:
|