X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=.bin%2Fcustom-chroot;h=08d76ada03bfa4aedf7429ab16893cb924858bdd;hb=fb5d2cb632ad05e57c8b257f5a3c85bb75c8ac31;hp=1306cb95928709137da5e234dbfbc08d5f84c878;hpb=9ebe6122e5f7dd378bba60dc7249acecc0847cd7;p=home.git diff --git a/.bin/custom-chroot b/.bin/custom-chroot index 1306cb9..08d76ad 100755 --- a/.bin/custom-chroot +++ b/.bin/custom-chroot @@ -1,12 +1,18 @@ #!/bin/bash -e bootstrap() { - [[ -w / ]] || exec sudo env -uUNSHARE HOME="$HOME" "$0" "$@" + [[ $(id -u) -eq 0 ]] || exec sudo env -uUNSHARE HOME="$HOME" "$0" "$@" if [[ -z ${UNSHARE} ]] ; then mount_args= if type -P unshare >&/dev/null ; then - UNSHARE=true exec unshare -m -- "$0" "$@" + test_arg() { unshare "$@" -- true >&/dev/null && uargs+=( "$@" ) || :; } + uargs=( -m ) + test_arg -u + test_arg -i + test_arg -p -f --mount-proc + test_arg --propagation=private + UNSHARE=true exec unshare "${uargs[@]}" -- "$0" "$@" fi else mount_args='-n' @@ -14,23 +20,37 @@ bootstrap() { unset UNSHARE } +is_mounted() { + local dst=$1 + grep -sq "${dst}" /proc/mounts +} + maybe_mount() { local src=/$1 dst=${chroot}/${2:-$1} [[ -d ${src} ]] || return 0 if ! mkdir -p "${dst}" ; then [[ -w ${chroot} ]] && exit 1 || return 0 fi - grep -sq "${dst}" /proc/mounts || mount ${mount_args} --bind "${src}" "${dst}" + is_mounted "${dst}" || mount ${mount_args} --bind "${src}" "${dst}" } 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;; - *32-bit*S/390*) echo s390;; - *64-bit*S/390*) echo s390x;; + *x86-64*) echo x86_64;; + *"Intel 80386"*) echo i386;; + *32-bit*PowerPC*MSB*) echo ppc;; + *64-bit*PowerPC*MSB*) echo ppc64;; + *32-bit*PowerPC*LSB*) echo ppcle;; + *64-bit*PowerPC*LSB*) echo ppc64le;; + *32-bit*S/390*) echo s390;; + *64-bit*S/390*) echo s390x;; + *64-bit*MIPS*) echo mips64;; + *32-bit*MIPS*N32*) echo mips64;; + *32-bit*MIPS*) echo mips;; + *32-bit*PA-RISC*) echo parisc;; + *64-bit*PA-RISC*) echo parisc64;; + *32-bit*SPARC*) echo sparc;; + *64-bit*SPARC*) echo sparc64;; esac } @@ -68,9 +88,11 @@ init_chroot() { fi done - f="${HOME}/.profile.d/aliases.sh" - if [[ -e ${f} ]] ; then - cat "${f}" > root/.bash_profile + if [[ ! -d root/.git ]] ; then + f="${HOME}/.profile.d/aliases.sh" + if [[ -e ${f} ]] ; then + cat "${f}" > root/.bash_profile + fi fi } @@ -93,7 +115,12 @@ usage() { main() { bootstrap "$@" - local mounts=( proc sys tmp dev dev/pts usr/portage usr/portage/distfiles usr/local/src ) + local mounts=( + proc sys tmp dev dev/shm run + usr/portage usr/portage/distfiles + var/db/repos/gentoo var/cache/distfiles + usr/local/src + ) local chroot=${0%/*} case ${chroot} in @@ -107,7 +134,7 @@ main() { -u) cmd='umount' ;; -m) mounts+=( "$2" ); shift ;; -d) chroot=$(realpath "$2"); shift ;; - -h) usage ;; + --help|-h) usage ;; -*) echo "${0##*/}: unknown option $1"; exit 1 ;; *) break ;; esac @@ -121,8 +148,15 @@ main() { local m for m in "${mounts[@]}" ; do - maybe_mount ${m} + maybe_mount "${m}" done + # Handle special mounts that we don't want to just bind mount. + if ! is_mounted "${chroot}/dev/pts" ; then + # Option order matters: on older kernels that don't recognize newinstance, + # parsing stops as soon as it hits that. + mount -t devpts devpts "${chroot}/dev/pts" \ + -o nosuid,noexec,mode=0620,gid=5,ptmxmode=0666,newinstance + fi init_chroot @@ -134,6 +168,8 @@ main() { fi fi + # Doubtful these settings we want to leak into the chroot. + unset ROOT PORTAGE_CONFIGROOT LD_LIBRARY_PATH unset LS_COLORS # format changes over time [[ $# -eq 0 ]] && set -- env HOME=/root /bin/bash -l exec \