1#!/bin/sh 2# 3# Simple wrapper for debootstrap, run in the docker build context 4# 5FAKEROOT=$(which fakeroot 2> /dev/null) 6# debootstrap < 1.0.67 generates empty sources.list, see Debian#732255 7MIN_DEBOOTSTRAP_VERSION=1.0.67 8 9exit_and_skip() 10{ 11 exit 3 12} 13 14# 15# fakeroot is needed to run the bootstrap stage 16# 17if [ -z $FAKEROOT ]; then 18 echo "Please install fakeroot to enable bootstraping" >&2 19 exit_and_skip 20 21fi 22 23if [ -z "${DEB_ARCH}" ]; then 24 echo "Please set DEB_ARCH to choose an architecture (e.g. armhf)" >&2 25 exit_and_skip 26 27fi 28 29if [ -z "${DEB_TYPE}" ]; then 30 echo "Please set DEB_TYPE to a Debian archive name (e.g. testing)" >&2 31 exit_and_skip 32 33fi 34 35# The following allow finer grain control over the defaults 36if [ -z "${DEB_VARIANT}" ]; then 37 DEB_VARIANT=buildd 38fi 39 40if [ -z "${DEB_URL}" ]; then 41 DEB_URL="http://httpredir.debian.org/debian" 42fi 43 44# We check in order for 45# 46# - DEBOOTSTRAP_DIR pointing at a development checkout 47# - PATH for the debootstrap script (installed) 48# 49# If neither option works then we checkout debootstrap from its 50# upstream SCM and run it from there. 51# 52 53if [ -z $DEBOOTSTRAP_DIR ]; then 54 NEED_DEBOOTSTRAP=false 55 DEBOOTSTRAP=$(which debootstrap 2> /dev/null) 56 if [ -z $DEBOOTSTRAP ]; then 57 echo "No debootstrap installed, attempting to install from SCM" 58 NEED_DEBOOTSTRAP=true 59 else 60 INSTALLED_VERSION=$(${DEBOOTSTRAP} --version | sed 's/debootstrap \([0-9\.]*\)[^0-9\.]*.*/\1/') 61 if ! (echo "${MIN_DEBOOTSTRAP_VERSION}" ; echo "${INSTALLED_VERSION}") \ 62 | sort -t . -n -k 1,1 -k 2,2 -k 3,3 -C ; then 63 echo "debootstrap too old, attempting to install from SCM" 64 NEED_DEBOOTSTRAP=true 65 fi 66 fi 67 if $NEED_DEBOOTSTRAP; then 68 DEBOOTSTRAP_SOURCE=https://salsa.debian.org/installer-team/debootstrap.git 69 git clone ${DEBOOTSTRAP_SOURCE} ./debootstrap.git 70 export DEBOOTSTRAP_DIR=./debootstrap.git 71 DEBOOTSTRAP=./debootstrap.git/debootstrap 72 (cd "${DEBOOTSTRAP_DIR}" && "${FAKEROOT}" make ) 73 fi 74else 75 DEBOOTSTRAP=${DEBOOTSTRAP_DIR}/debootstrap 76 if [ ! -f $DEBOOTSTRAP ]; then 77 echo "Couldn't find script at ${DEBOOTSTRAP}" >&2 78 exit_and_skip 79 fi 80fi 81 82# 83# Add optional args 84# 85if [ -n "${DEB_KEYRING}" ]; then 86 DEBOOTSTRAP="${DEBOOTSTRAP} --keyring=${DEB_KEYRING}" 87fi 88 89# 90# Finally check to see if any qemu's are installed 91# 92BINFMT_DIR=/proc/sys/fs/binfmt_misc 93if [ ! -e $BINFMT_DIR ]; then 94 echo "binfmt_misc needs enabling for a QEMU bootstrap to work" >&2 95 exit_and_skip 96else 97 # DEB_ARCH and QEMU arch names are not totally aligned 98 case "${DEB_ARCH}" in 99 amd64) 100 QEMU=qemu-i386 101 ;; 102 armel|armhf) 103 QEMU=qemu-arm 104 ;; 105 arm64) 106 QEMU=qemu-aarch64 107 ;; 108 powerpc) 109 QEMU=qemu-ppc 110 ;; 111 ppc64el) 112 QEMU=qemu-ppc64le 113 ;; 114 s390) 115 QEMU=qemu-s390x 116 ;; 117 *) 118 QEMU=qemu-${DEB_ARCH} 119 ;; 120 esac 121 if [ ! -e "${BINFMT_DIR}/$QEMU" ]; then 122 echo "No binfmt_misc rule to run $QEMU, can't bootstrap" >&2 123 exit_and_skip 124 fi 125fi 126 127echo "Building a rootfs using ${FAKEROOT} and ${DEBOOTSTRAP} ${DEB_ARCH}/${DEB_TYPE}" 128 129${FAKEROOT} ${DEBOOTSTRAP} --variant=$DEB_VARIANT --foreign --arch=$DEB_ARCH $DEB_TYPE . $DEB_URL || exit 1 130exit 0 131