if [[ -z ${UNSHARE} ]] ; then
mount_args=
if type -P unshare >&/dev/null ; then
+ test_arg() { unshare "$@" -- true >&/dev/null && uargs+=( "$@" ) || :; }
uargs=( -m )
- unshare -u -- true >&/dev/null && uargs+=( -u )
- unshare -i -- true >&/dev/null && uargs+=( -i )
- unshare -p -- true >&/dev/null && uargs+=( -p -f --mount-proc )
+ test_arg -u
+ test_arg -i
+ test_arg -p -f --mount-proc
+ test_arg --propagation=private
UNSHARE=true exec unshare "${uargs[@]}" -- "$0" "$@"
fi
else
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;;
- *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;;
+ *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
}
main() {
bootstrap "$@"
- local mounts=( proc sys tmp dev dev/pts dev/shm run usr/portage usr/portage/distfiles usr/local/src )
+ local mounts=( proc sys tmp dev dev/shm run usr/portage usr/portage/distfiles usr/local/src )
local chroot=${0%/*}
case ${chroot} in
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