a radical and experimental distribution based on musl libc and busybox http://sabo.xyz
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

103 lines
2.4 KiB

#!/bin/sh
[ -z "$CONFIG" ] && CONFIG=./config
. "$CONFIG"
export H="$PWD"
ret=0
if [ -z "$R" ] ; then
echo 'no R environment var set, your config is broken'
exit 1
elif [ "$R" = / ] ; then
echo "error: R=/ can't be used with this script, as it would make"
echo "your host sys unusable after returning. (umounting /dev /proc...)"
exit 1
fi
mkdir -p "$R"/src/tarballs
linux32=
if [ $(uname -m) = "x86_64" ] ; then
case "$A" in i?86)
echo "trying to get into 32bit rootfs from 64bit host"
[ -x ./linux32 ] && linux32=./linux32 || {
$CC "$K"/linux32.c -static -s -Os -o ./linux32 && linux32=./linux32 || \
echo -ne "warning: trying to chroot into i386 rootfs on x86_64" \
"kernel and building linux32 command failed\n"
} ;;
esac
fi
uid="$(id -u)"
if [ -d /proc/self/ns ] ; then
CHROOT=./super_chroot
if [ ! -x "$CHROOT" ] ; then
if ! $CC "$K"/super_chroot.c -static -s -Os -o "$CHROOT" 2>/dev/null ; then
echo "error: failed to build super_chroot!"
echo "try: musl-gcc KEEP/super_chroot.c -o super_chroot"
echo "or: re-run ./enter-chroot as root."
exit 1
fi
fi
else
if [ "$uid" != "0" ]; then
printf -- "need to be root. please enter password.\n"
su -c "$0"
exit $?
fi
# prevent from mounting twice
if [ ! -d "$R"/dev/pts ] ; then
mount --bind /dev "$R"/dev
mount --bind /dev/pts "$R"/dev/pts
mount --bind /dev/shm "$R"/dev/shm
mount --bind /proc "$R"/proc
mount --bind "$C" "$R"/src/tarballs
fi
CHROOT=chroot
fi
set_title() {
[ "$TERM" != "linux" ] && [ "$TERM" != "vt100" ] && \
printf "\033]2;%s\007" "$1"
}
if [ -n "$1" ]; then
$linux32 "$CHROOT" "$R" /bin/env -i \
HOME=/root PATH="/local/bin:/bin" TERM="$TERM" PS1='\u:\w$ ' \
"$@"
ret=$?
else
set_title "SABOTAGE CHROOT $(basename $R)"
echo "Entering chroot..."
$linux32 "$CHROOT" "$R" /bin/env -i \
HOME=/root TERM="$TERM" PS1='\u:\w$ ' \
/bin/ash --login
ret=$?
#echo empty line so we get a proper prompt back
echo
fi
tryumount() {
dest="$1"
if ! umount "$dest" 2>/dev/null; then
echo "unmount failure ($dest), retrying in 1 sec..."
sleep 1
if ! umount -f "$dest" 2>/dev/null; then
echo "unmount -f failure ($dest), trying last resort umount -l"
umount -l "$dest"
fi
fi
}
if [ "$CHROOT" = "chroot" ] && [ -d "$R"/dev/pts ] ; then
tryumount "$R"/src/tarballs
tryumount "$R"/dev/pts
tryumount "$R"/dev/shm
tryumount "$R"/dev
tryumount "$R"/proc
fi
exit $ret