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# Finally check to see if any qemu's are installed 84# 85BINFMT_DIR=/proc/sys/fs/binfmt_misc 86if [ ! -e $BINFMT_DIR ]; then 87 echo "binfmt_misc needs enabling for a QEMU bootstrap to work" >&2 88 exit_and_skip 89else 90 # DEB_ARCH and QEMU arch names are not totally aligned 91 case "${DEB_ARCH}" in 92 amd64) 93 QEMU=qemu-i386 94 ;; 95 armel|armhf) 96 QEMU=qemu-arm 97 ;; 98 arm64) 99 QEMU=qemu-aarch64 100 ;; 101 powerpc) 102 QEMU=qemu-ppc 103 ;; 104 ppc64el) 105 QEMU=qemu-ppc64le 106 ;; 107 s390) 108 QEMU=qemu-s390x 109 ;; 110 *) 111 QEMU=qemu-${DEB_ARCH} 112 ;; 113 esac 114 if [ ! -e "${BINFMT_DIR}/$QEMU" ]; then 115 echo "No binfmt_misc rule to run $QEMU, can't bootstrap" >&2 116 exit_and_skip 117 fi 118fi 119 120echo "Building a rootfs using ${FAKEROOT} and ${DEBOOTSTRAP} ${DEB_ARCH}/${DEB_TYPE}" 121 122${FAKEROOT} ${DEBOOTSTRAP} --variant=$DEB_VARIANT --foreign --arch=$DEB_ARCH $DEB_TYPE . $DEB_URL || exit 1 123exit 0 124