aboutsummaryrefslogtreecommitdiff
path: root/contrib/cpt-chroot
blob: 2f7eee7f3253a284a62980dfe853015548a9a7cd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/bin/sh -e
# Enter a chroot

## SYNOPSIS:
## .Nm cpt-chroot
## .Op Ar dir

## DESCRIPTION:
## .Nm
## is a wrapper script to chroot inside other root filesystems. It automatically
## mounts important filesystems in to the chroot directory, and unmounts them
## when the user exits the chroot and cleans up leftover host files.

log() {
    printf '\033[32m->\033[m %s.\n' "$*"
}

usage() { printf '%s [dir]\n' "${0##*/}"; exit 0;}

die() {
    log "$*" >&2
    exit 1
}

clean() {
    log Unmounting /dev, /proc and /sys from chroot; {
        umount "$1/dev"  ||:
        umount "$1/proc" ||:
        umount "$1/sys"  ||:
    }

    log Cleaning leftover host files; {
        rm -f "$1/root/.ash_history"
    }
}

main() {
    case "$1" in ''|--help|-h) usage; esac
    [ -d "$1" ]        || die Given path does not exist
    [ "$(id -u)" = 0 ] || die Script needs to be run as root

    [ "$2" ] || {
        march=$(uname -m 2>/dev/null) ||:
        case "$march" in
            '')     march=native ;;
            x86_64) march=x86-64 ;;
            i*86)   march=i686 ;;
        esac
    }

    trap 'clean "$1"' EXIT INT

    log Mounting /dev, /proc and /sys from host; {
        mountpoint -q "$1/dev"  || mount -o bind /dev "$1/dev"
        mountpoint -q "$1/proc" || mount -t proc proc "$1/proc"
        mountpoint -q "$1/sys"  || mount -t sysfs sys "$1/sys"

    }

    log Copying /etc/resolv.conf from host; {
         [ -f "$1/etc/resolv.conf" ] || cp /etc/resolv.conf "$1/etc"
    }

    log Entering chroot; {
        chroot "$1" /usr/bin/env -i \
            HOME=/root \
            TERM="$TERM" \
            SHELL=/bin/sh \
            USER=root \
            CFLAGS="${CFLAGS:--march=$march -mtune=generic -pipe -Os}" \
            CXXFLAGS="${CXXFLAGS:--march=$march -mtune=generic -pipe -Os}" \
            MAKEFLAGS="${MAKFLAGS:--j$(nproc 2>/dev/null || echo 1)}" \
            /bin/sh -l
    }
}

main "$@"