#!/bin/bash -e [[ -w / ]] || exec sudo env HOME="$HOME" "$0" "$@" if [[ -z ${UNSHARE} ]] ; then mount_args= if type -P unshare >&/dev/null ; then UNSHARE=true exec unshare -m -- "$0" "$@" fi else mount_args='-n' fi unset UNSHARE mounts="proc sys dev dev/pts usr/portage usr/portage/distfiles" chroot=${0%/*} case ${chroot} in .) chroot=${PWD} ;; ./*) chroot=${PWD}/${chroot#./} ;; esac cd "${chroot}" do_umount() { mounts=$(mount | grep ${chroot} | awk '{print $3}' | tac) for m in ${mounts} ; do echo "unmounting $m" umount $m done if [[ -z ${mounts} ]] ; then echo "nothing mounted in ${chroot}" fi exit 0 } while [[ -n $1 ]] ; do case $1 in -u) do_umount ;; -*) echo "unknown option $1"; exit 1 ;; *) break ;; esac done maybe_mount() { local src=/$1 dst=${chroot}/${2:-$1} [[ -d ${src} ]] || return 0 mkdir -p "${dst}" grep -sq "${dst}" /proc/mounts || mount ${mount_args} --bind "${src}" "${dst}" } for m in ${mounts} ; do maybe_mount ${m} done get_type() { case $(file "$1") in *x86-64*) echo x86_64;; *"Intel 80386"*) echo i386;; *32-bit*PowerPC*) echo ppc;; *64-bit*PowerPC*) echo ppc64;; esac } bin_dst=$(get_type bin/bash) setarch= if [[ -n ${bin_dst} ]] && type -P setarch &>/dev/null ; then setarch="setarch ${bin_dst}" fi if [[ ! -L etc/mtab ]] ; then rm -f etc/mtab ln -sf /proc/mounts etc/mtab fi etc=" hosts locale.gen localtime resolv.conf " home=" .inputrc .gdbinit .gitconfig .nanorc " for f in \ $(printf 'etc/%s ' ${etc}) \ ; do if [ -e "/${f}" ] ; then cp /${f} ${f} fi done for f in ${home} ; do cp ~/${f} root/${f} done unset LS_COLORS # format changes over time [[ $# -eq 0 ]] && set -- env HOME=/root /bin/bash -l exec \ ${setarch} \ chroot "${chroot}" \ "$@"