diff options
Diffstat (limited to 'arch-chroot.in')
| -rw-r--r-- | arch-chroot.in | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/arch-chroot.in b/arch-chroot.in new file mode 100644 index 0000000..a954953 --- /dev/null +++ b/arch-chroot.in @@ -0,0 +1,78 @@ +#!/bin/bash + +shopt -s extglob + +m4_include(common) + +usage() { + cat <<EOF +usage: ${0##*/} chroot-dir [command] + + -h Print this help message + -u <user>[:group] Specify non-root user and optional group to use + +If 'command' is unspecified, ${0##*/} will launch /bin/bash. + +EOF +} + +chroot_add_resolv_conf() { + local chrootdir=$1 resolv_conf=$1/etc/resolv.conf + + # Handle resolv.conf as a symlink to somewhere else. + if [[ -L $chrootdir/etc/resolv.conf ]]; then + # readlink(1) should always give us *something* since we know at this point + # it's a symlink. For simplicity, ignore the case of nested symlinks. + resolv_conf=$(readlink "$chrootdir/etc/resolv.conf") + if [[ $resolv_conf = /* ]]; then + resolv_conf=$chrootdir$resolv_conf + else + resolv_conf=$chrootdir/etc/$resolv_conf + fi + + # ensure file exists to bind mount over + if [[ ! -f $resolv_conf ]]; then + install -Dm644 /dev/null "$resolv_conf" || return 1 + fi + elif [[ ! -e $chrootdir/etc/resolv.conf ]]; then + # The chroot might not have a resolv.conf. + return 0 + fi + + chroot_add_mount /etc/resolv.conf "$resolv_conf" --bind +} + +while getopts ':hu:' flag; do + case $flag in + h) + usage + exit 0 + ;; + u) + userspec=$OPTARG + ;; + :) + die '%s: option requires an argument -- '\''%s'\' "${0##*/}" "$OPTARG" + ;; + ?) + die '%s: invalid option -- '\''%s'\' "${0##*/}" "$OPTARG" + ;; + esac +done +shift $(( OPTIND - 1 )) + +(( EUID == 0 )) || die 'This script must be run with root privileges' +(( $# )) || die 'No chroot directory specified' +chrootdir=$1 +shift + +[[ -d $chrootdir ]] || die "Can't create chroot on non-directory %s" "$chrootdir" + +chroot_setup "$chrootdir" || die "failed to setup chroot %s" "$chrootdir" +chroot_add_resolv_conf "$chrootdir" || die "failed to setup resolv.conf" + +chroot_args=() +[[ $userspec ]] && chroot_args+=(--userspec "$userspec") +chroot_args+=("$chrootdir" "$@") + +SHELL=/bin/bash unshare --fork --pid chroot "${chroot_args[@]}" |
