log (){ date +"[%T] $*" | tee -a "${LOG_FILE}" } export -f log bootstrap(){ local BOOTSTRAP_CMD=debootstrap local BOOTSTRAP_ARGS=() export http_proxy=${APT_PROXY} BOOTSTRAP_ARGS+=(--arch arm64) BOOTSTRAP_ARGS+=(--include gnupg) BOOTSTRAP_ARGS+=(--components "main,contrib,non-free") #BOOTSTRAP_ARGS+=(--keyring "${STAGE_DIR}/files/raspberrypi.gpg") BOOTSTRAP_ARGS+=(--exclude=info) BOOTSTRAP_ARGS+=(--include=ca-certificates) BOOTSTRAP_ARGS+=("$@") printf -v BOOTSTRAP_STR '%q ' "${BOOTSTRAP_ARGS[@]}" capsh $CAPSH_ARG -- -c "'${BOOTSTRAP_CMD}' $BOOTSTRAP_STR" || true if [ -d "$2/debootstrap" ] && ! rmdir "$2/debootstrap"; then cp "$2/debootstrap/debootstrap.log" "${STAGE_WORK_DIR}" log "bootstrap failed: please check ${STAGE_WORK_DIR}/debootstrap.log" return 1 fi } export -f bootstrap copy_previous(){ if [ ! -d "${PREV_ROOTFS_DIR}" ]; then echo "Previous stage rootfs not found" false fi mkdir -p "${ROOTFS_DIR}" rsync -aHAXx --exclude var/cache/apt/archives "${PREV_ROOTFS_DIR}/" "${ROOTFS_DIR}/" } export -f copy_previous unmount(){ if [ -z "$1" ]; then DIR=$PWD else DIR=$1 fi while mount | grep -q "$DIR"; do local LOCS LOCS=$(mount | grep "$DIR" | cut -f 3 -d ' ' | sort -r) for loc in $LOCS; do umount "$loc" done done } export -f unmount unmount_image(){ sync sleep 1 LOOP_DEVICE=$(losetup --list | grep "$1" | cut -f1 -d' ') if [ -n "$LOOP_DEVICE" ]; then for part in "$LOOP_DEVICE"p*; do if DIR=$(findmnt -n -o target -S "$part"); then unmount "$DIR" fi done losetup -d "$LOOP_DEVICE" fi } export -f unmount_image on_chroot() { if ! mount | grep -q "$(realpath "${ROOTFS_DIR}"/proc)"; then mount -t proc proc "${ROOTFS_DIR}/proc" fi if ! mount | grep -q "$(realpath "${ROOTFS_DIR}"/dev)"; then mount --bind /dev "${ROOTFS_DIR}/dev" fi if ! mount | grep -q "$(realpath "${ROOTFS_DIR}"/dev/pts)"; then mount --bind /dev/pts "${ROOTFS_DIR}/dev/pts" fi if ! mount | grep -q "$(realpath "${ROOTFS_DIR}"/sys)"; then mount --bind /sys "${ROOTFS_DIR}/sys" fi if ! mount | grep -q "$(realpath "${ROOTFS_DIR}"/run)"; then mount -t tmpfs tmpfs "${ROOTFS_DIR}/run" fi if ! mount | grep -q "$(realpath "${ROOTFS_DIR}"/tmp)"; then mount -t tmpfs tmpfs "${ROOTFS_DIR}/tmp" fi capsh $CAPSH_ARG "--chroot=${ROOTFS_DIR}/" -- -e "$@" } export -f on_chroot update_issue() { echo -e "Raspberry Pi reference ${IMG_DATE}\nGenerated using ${PI_GEN}, ${PI_GEN_REPO}, ${GIT_HASH}, ${1}" > "${ROOTFS_DIR}/etc/rpi-issue" } export -f update_issue ensure_next_loopdev() { local loopdev loopdev="$(losetup -f)" loopmaj="$(echo "$loopdev" | sed -E 's/.*[^0-9]*?([0-9]+)$/\1/')" [[ -b "$loopdev" ]] || mknod "$loopdev" b 7 "$loopmaj" } export -f ensure_next_loopdev