log (){ date +"[%T] $*" | tee -a "${LOG_FILE}" } export -f log bootstrap(){ local BOOTSTRAP_CMD=debootstrap local BOOTSTRAP_ARGS=() #export http_proxy=${APT_PROXY} # qemu-debootstrap is deprecated. Please use regular debootstrap directly # # if [ "$(dpkg --print-architecture)" != "armhf" ] && [ "$(dpkg --print-architecture)" != "arm64" ]; then # BOOTSTRAP_CMD=qemu-debootstrap # fi BOOTSTRAP_ARGS+=(--arch ${TARGET_ARCH}) BOOTSTRAP_ARGS+=(--include gnupg) BOOTSTRAP_ARGS+=(--components "main,contrib,non-free") #BOOTSTRAP_ARGS+=(--keyring "${STAGE_DIR}/files/raspberrypi.gpg") BOOTSTRAP_ARGS+=("$@") printf -v BOOTSTRAP_STR '%q ' "${BOOTSTRAP_ARGS[@]}" capsh --drop=cap_setfcap -- -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 local LOOP_DEVICES LOOP_DEVICES=$(losetup --list | grep "$(basename "${1}")" | cut -f1 -d' ') for LOOP_DEV in ${LOOP_DEVICES}; do if [ -n "${LOOP_DEV}" ]; then local MOUNTED_DIR MOUNTED_DIR=$(mount | grep "$(basename "${LOOP_DEV}")" | head -n 1 | cut -f 3 -d ' ') if [ -n "${MOUNTED_DIR}" ] && [ "${MOUNTED_DIR}" != "/" ]; then unmount "$(dirname "${MOUNTED_DIR}")" fi sleep 1 losetup -d "${LOOP_DEV}" fi done } 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 # run as root 'dpkg-reconfigure locales' enable 'en_US.UTF-8' # perhaps run as root 'update-locale LC_MEASUREMENT=en_US.UTF-8 LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8' export LC_MEASUREMENT=en_US.UTF-8 export LC_ALL=en_US.UTF-8 export LANG=en_US.UTF-8 setarch linux32 capsh --drop=cap_setfcap "--chroot=${ROOTFS_DIR}/" -- -e "$@" } export -f on_chroot print_issue() { echo "GNU/Linux ${IMG_DATE} UTC" if [ -n "${CUSTOM_NAME}" -a -n "${CUSTOM_VERSION}" ]; then echo "${CUSTOM_NAME} version ${CUSTOM_VERSION}" fi echo "Generated using ${PI_GEN}, ${PI_GEN_REPO}, ${GIT_HASH}, ${1}" if [ -f "$ROOTFS_DIR/usr/share/doc/raspberrypi-kernel/changelog.Debian.gz" ]; then firmware=$(zgrep "firmware as of" \ "$ROOTFS_DIR/usr/share/doc/raspberrypi-kernel/changelog.Debian.gz" | \ head -n1 | sed -n 's|.* \([^ ]*\)$|\1|p') printf "\nFirmware: https://github.com/raspberrypi/firmware/tree/%s\n" "$firmware" kernel="$(curl -s -L "https://github.com/raspberrypi/firmware/raw/$firmware/extra/git_hash")" printf "Kernel: https://github.com/raspberrypi/linux/tree/%s\n" "$kernel" uname="$(curl -s -L "https://github.com/raspberrypi/firmware/raw/$firmware/extra/uname_string7")" printf "Uname string: %s\n" "$uname" fi printf "\nPackages:\n" dpkg -l --root "$ROOTFS_DIR" } export -f print_issue