diff options
Diffstat (limited to 'build/install-chroot.sh')
-rwxr-xr-x | build/install-chroot.sh | 132 |
1 files changed, 118 insertions, 14 deletions
diff --git a/build/install-chroot.sh b/build/install-chroot.sh index ad0dafa..b80aea0 100755 --- a/build/install-chroot.sh +++ b/build/install-chroot.sh @@ -10,6 +10,63 @@ # N. B. it is unlikely that this script will ever work on anything other than a # Debian-derived system. +usage() { + echo "usage: ${0##*/} [-m mirror] [-g group,...] [-s] [-c]" + echo "-g group,... groups that can use the chroot unauthenticated" + echo " Default: 'admin' and current user's group ('$(id -gn)')" + echo "-m mirror an alternate repository mirror for package downloads" + echo "-s configure default deb-srcs" + echo "-c always copy 64bit helper binaries to 32bit chroot" + echo "-h this help message" +} + +process_opts() { + local OPTNAME OPTIND OPTERR OPTARG + while getopts ":g:m:sch" OPTNAME; do + case "$OPTNAME" in + g) + [ -n "${OPTARG}" ] && + chroot_groups="${chroot_groups}${chroot_groups:+,}${OPTARG}" + ;; + m) + if [ -n "${mirror}" ]; then + echo "You can only specify exactly one mirror location" + usage + exit 1 + fi + mirror="$OPTARG" + ;; + s) + add_srcs="y" + ;; + c) + copy_64="y" + ;; + h) + usage + exit 0 + ;; + \:) + echo "'-$OPTARG' needs an argument." + usage + exit 1 + ;; + *) + echo "invalid command-line option: $OPTARG" + usage + exit 1 + ;; + esac + done + + if [ $# -ge ${OPTIND} ]; then + eval echo "Unexpected command line argument: \${${OPTIND}}" + usage + exit 1 + fi +} + + # Check that we are running as a regular user [ "$(id -nu)" = root ] && { echo "Run this script as a regular user and provide your \"sudo\"" \ @@ -18,6 +75,8 @@ } mkdir -p "$HOME/chroot/" +process_opts "$@" + # Error handler trap 'exit 1' INT TERM QUIT trap 'sudo apt-get clean; tput bel; echo; echo Failed' EXIT @@ -81,6 +140,25 @@ target="${distname}${arch}" } sudo mkdir -p /var/lib/chroot/"${target}" +# Offer to include additional standard repositories for Ubuntu-based chroots. +alt_repos= +grep ubuntu.com /usr/share/debootstrap/scripts/"${distname}" >&/dev/null && { + while :; do + echo "Would you like to add ${distname}-updates and ${distname}-security " + echo -n "to the chroot's sources.list (y/n)? " + read alt_repos + case "${alt_repos}" in + y|Y) + alt_repos="y" + break + ;; + n|N) + break + ;; + esac + done +} + # Remove stale entry from /etc/schroot/schroot.conf. Entries start # with the target name in square brackets, followed by an arbitrary # number of lines. The entry stops when either the end of file has @@ -92,15 +170,20 @@ sudo sed -ni '/^[[]'"${target%bit}"']$/,${:1;n;/^[[]/b2;b1;:2;p;n;b2};p' \ /etc/schroot/schroot.conf # Download base system. This takes some time -grep ubuntu.com /usr/share/debootstrap/scripts/"${distname}" >&/dev/null && - mirror="http://archive.ubuntu.com/ubuntu" || - mirror="http://ftp.us.debian.org/debian" +if [ -z "${mirror}" ]; then + grep ubuntu.com /usr/share/debootstrap/scripts/"${distname}" >&/dev/null && + mirror="http://archive.ubuntu.com/ubuntu" || + mirror="http://ftp.us.debian.org/debian" +fi sudo debootstrap ${archflag} "${distname}" /var/lib/chroot/"${target}" \ "$mirror" # Add new entry to /etc/schroot/schroot.conf grep ubuntu.com /usr/share/debootstrap/scripts/"${distname}" >&/dev/null && brand="Ubuntu" || brand="Debian" +if [ -z "${chroot_groups}" ]; then + chroot_groups="admin,$(id -gn)" +fi sudo sh -c 'cat >>/etc/schroot/schroot.conf' <<EOF [${target%bit}] description=${brand} ${distname} ${arch} @@ -108,8 +191,8 @@ type=directory directory=/var/lib/chroot/${target} priority=3 users=root -groups=admin -root-groups=admin +groups=${chroot_groups} +root-groups=${chroot_groups} personality=linux$([ "${arch}" != 64bit ] && echo 32) script-config=script-${target} @@ -139,15 +222,28 @@ EOF sudo chown root:root /usr/local/bin/"${target%bit}" sudo chmod 755 /usr/local/bin/"${target%bit}" +# Add the standard Ubuntu update repositories if requested. +[ "${alt_repos}" = "y" -a \ + -r "/var/lib/chroot/${target}/etc/apt/sources.list" ] && +sudo sed -i '/^deb .* [^ -]\+ main$/p + s/^\(deb .* [^ -]\+\) main/\1-security main/ + p + t1 + d + :1;s/-security main/-updates main/ + t + d' "/var/lib/chroot/${target}/etc/apt/sources.list" + # Add a few more repositories to the chroot -[ -r /var/lib/chroot/${target}/etc/apt/sources.list ] && +[ "${add_srcs}" = "y" -a \ + -r "/var/lib/chroot/${target}/etc/apt/sources.list" ] && sudo sed -i 's/ main$/ main restricted universe multiverse/ p t1 d :1;s/^deb/deb-src/ t - d' /var/lib/chroot/${target}/etc/apt/sources.list + d' "/var/lib/chroot/${target}/etc/apt/sources.list" # Update packages sudo schroot -c "${target%bit}" -p -- /bin/sh -c ' @@ -177,26 +273,34 @@ sudo schroot -c "${target%bit}" -p -- apt-get -y install \ strace # If running a 32bit environment on a 64bit machine, install a few binaries -# as 64bit. -if [ "${arch}" = 32bit ] && file /bin/bash 2>/dev/null | grep -q x86-64; then +# as 64bit. This is only done automatically if the chroot distro is the same as +# the host, otherwise there might be incompatibilities in build settings or +# runtime dependencies. The user can force it with the '-c' flag. +host_distro=$(grep DISTRIB_CODENAME /etc/lsb-release 2>/dev/null | \ + cut -d "=" -f 2) +if [ "${copy_64}" = "y" -o \ + "${host_distro}" = "${distname}" -a "${arch}" = 32bit ] && \ + file /bin/bash 2>/dev/null | grep -q x86-64; then + readlinepkg=$(sudo schroot -c "${target%bit}" -p -- sh -c \ + 'apt-cache search "lib64readline.\$" | sort | tail -n 1 | cut -d " " -f 1') sudo schroot -c "${target%bit}" -p -- apt-get -y install \ - lib64expat1 lib64ncurses5 lib64readline6 lib64z1 + lib64expat1 lib64ncurses5 ${readlinepkg} lib64z1 dep= for i in binutils gdb strace; do [ -d /usr/share/doc/"$i" ] || dep="$dep $i" done [ -n "$dep" ] && sudo apt-get -y install $dep - sudo cp /usr/bin/gdb /var/lib/chroot/${target}/usr/local/bin/ - sudo cp /usr/bin/ld /var/lib/chroot/${target}/usr/local/bin/ + sudo cp /usr/bin/gdb "/var/lib/chroot/${target}/usr/local/bin/" + sudo cp /usr/bin/ld "/var/lib/chroot/${target}/usr/local/bin/" for i in libbfd libpython; do lib="$({ ldd /usr/bin/ld; ldd /usr/bin/gdb; } | grep "$i" | awk '{ print $3 }')" if [ -n "$lib" -a -r "$lib" ]; then - sudo cp "$lib" /var/lib/chroot/${target}/usr/lib64/ + sudo cp "$lib" "/var/lib/chroot/${target}/usr/lib64/" fi done for lib in libssl libcrypt; do - sudo cp /usr/lib/$lib* /var/lib/chroot/${target}/usr/lib64/ || : + sudo cp /usr/lib/$lib* "/var/lib/chroot/${target}/usr/lib64/" || : done fi |