diff options
Diffstat (limited to 'pacstrap.in')
| -rw-r--r-- | pacstrap.in | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/pacstrap.in b/pacstrap.in new file mode 100644 index 0000000..72f2809 --- /dev/null +++ b/pacstrap.in @@ -0,0 +1,119 @@ +#!/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 + +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 Avoid auto-confirmation of package selections + -M Avoid copying the host's mirrorlist to the target + + -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:cdGiM' 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 + ;; + :) + 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} +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" + +msg 'Installing packages to %s' "$newroot" +if ! pacman -r "$newroot" -Sy "${pacman_args[@]}"; then + die 'Failed to install packages to new root' +fi + +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: |
