3f2ff883c3
There are use cases where pi-gen can be useful that need different image generation that the current defaults. Rather than force such users to require carrying modified versions of the default exports, allow users to specify alternate exports (e.g. instead of export-image and export-noobs, or in addition to these). We do this using a mechanism similar to STAGE_LIST, except that the lists of images are per-stage and default to paying attention to the presence of EXPORT_IMAGE and EXPORT_NOOBS as is currently the case. Signed-off-by: Daniel F. Dickinson <cshored@thecshore.com>
127 lines
2.9 KiB
Plaintext
127 lines
2.9 KiB
Plaintext
log (){
|
|
date +"[%T] $*" | tee -a "${LOG_FILE}"
|
|
}
|
|
export -f log
|
|
|
|
bootstrap(){
|
|
local BOOTSTRAP_CMD=debootstrap
|
|
local BOOTSTRAP_ARGS=()
|
|
|
|
export http_proxy=${APT_PROXY}
|
|
|
|
if [ "$(dpkg --print-architecture)" != "armhf" ] && [ "$(dpkg --print-architecture)" != "aarch64" ]; then
|
|
BOOTSTRAP_CMD=qemu-debootstrap
|
|
fi
|
|
|
|
BOOTSTRAP_ARGS+=(--arch armhf)
|
|
BOOTSTRAP_ARGS+=(--components "main,contrib,non-free")
|
|
BOOTSTRAP_ARGS+=(--keyring "${STAGE_DIR}/files/raspberrypi.gpg")
|
|
BOOTSTRAP_ARGS+=("$@")
|
|
printf -v BOOTSTRAP_STR '%q ' "${BOOTSTRAP_ARGS[@]}"
|
|
|
|
setarch linux32 capsh --drop=cap_setfcap -- -c "'${BOOTSTRAP_CMD}' $BOOTSTRAP_STR" || true
|
|
|
|
if [ -d "$2/debootstrap" ]; then
|
|
rmdir "$2/debootstrap"
|
|
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
|
|
|
|
setarch linux32 capsh --drop=cap_setfcap "--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
|
|
|
|
get_stage_export() {
|
|
local stage_dir="$1"
|
|
local stage_var
|
|
stage_var="$(echo "$(basename "$1")"|tr '\- :/' '_')"
|
|
local export_list_var
|
|
|
|
export_list_var="\$${stage_var}"_EXPORT_LIST
|
|
|
|
eval EXPORT_LIST="$export_list_var"
|
|
|
|
if [ -z "${EXPORT_LIST}" ]; then
|
|
if [ -e "$stage_dir"/EXPORT_IMAGE ]; then
|
|
EXPORT_LIST="export-image"
|
|
fi
|
|
if [ -e "$stage_dir"/EXPORT_NOOBS ]; then
|
|
EXPORT_LIST="${EXPORT_LIST} export-noobs"
|
|
fi
|
|
fi
|
|
|
|
EXPORT_STAGE="$(basename "$1")"
|
|
export EXPORT_STAGE
|
|
export EXPORT_LIST
|
|
}
|
|
|
|
export -f get_stage_export
|