From c807c29749bc7d6050e350175363ca705c183f5a Mon Sep 17 00:00:00 2001 From: Armaan Bhojwani Date: Wed, 17 Mar 2021 12:47:51 -0400 Subject: [PATCH] chrooter: add script --- chrooter | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100755 chrooter diff --git a/chrooter b/chrooter new file mode 100755 index 0000000..64403d6 --- /dev/null +++ b/chrooter @@ -0,0 +1,74 @@ +#!/bin/sh -e +# Enter a chroot nicely. Stolen from KISS Linux, MIT license Dylan Araps 2020. +# Some slight modifications to make life easier. + +log() { + printf '\033[32m->\033[m %s.\n' "$*" +} + +die() { + log "$*" >&2 + exit 1 +} + +clean() { + log Unmounting /dev, /proc and /sys from chroot; { + umount "$1/sys/firmware/efi/efivars" 2>/dev/null ||: + umount "$1/dev" ||: + umount "$1/proc" ||: + umount "$1/sys" ||: + } + + log Cleaning leftover host files; { + rm -f "$1/root/.ash_history" + rm -f "$1/etc/resolv.conf" + } +} + +mounted() { + # This is a pure shell mountpoint implementation. We're dealing + # with basic (and fixed/known) input so this doesn't need to + # handle more complex cases. + [ -e "$1" ] || return 1 + [ -e /proc/mounts ] || return 1 + + while read -r _ target _; do + [ "$target" = "$1" ] && return 0 + done < /proc/mounts + + return 1 +} + +[ -z "$1" ] && die Need a path to the chroot +[ -d "$1" ] || die Given path does not exist +[ "$(id -u)" = 0 ] || die Script needs to be run as root + +trap 'clean "$1"' EXIT INT + +log Mounting /dev, /proc and /sys from host; { + mounted "$1/dev" || mount -o bind /dev "$1/dev" ||: + mounted "$1/proc" || mount -t proc proc "$1/proc" ||: + mounted "$1/sys" || mount -t sysfs sys "$1/sys" ||: + + mounted "$1/sys/firmware/efi/efivars" || + mount -t efivarfs efivarfs "$1/sys/firmware/efi/efivars" 2>/dev/null ||: +} + +log Copying /etc/resolv.conf from host; { + cp -f /etc/resolv.conf "$1/etc" ||: +} + +NEWSHELL=${2:-"/bin/sh"} \ + +log Entering chroot; { + chroot "$1" /usr/bin/env -i \ + HOME=/root \ + TERM="$TERM" \ + SHELL=${NEWSHELL} \ + USER=root \ + CFLAGS="${CFLAGS:--march=x86-64 -mtune=generic -pipe -Os}" \ + CXXFLAGS="${CXXFLAGS:--march=x86-64 -mtune=generic -pipe -Os}" \ + MAKEFLAGS="${MAKEFLAGS:--j$(nproc 2>/dev/null || echo 1)}" \ + DISPLAY="$DISPLAY" \ + "$NEWSHELL" -l +} -- 2.39.2