
* Compare mount output using base of dirname If you're building from a bind-mounted directory, the build will fail as it will find two entries to unmount, but a single unmount will remove them both causing an error. Adding a space means that the mountpoint will only match with a single mount entry ; the expected path, rather than the pre bind-mount. * Switch to awk instead of mount, grep, cut pipes Retry unmount 5 times and give up, letting the user know that they need to resolve the issue manually --------- Co-authored-by: David Peverley <pev@analogue-micro.com> Co-authored-by: Serge Schneider <serge@raspberrypi.com>
132 lines
3.3 KiB
Plaintext
132 lines
3.3 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}
|
|
|
|
BOOTSTRAP_ARGS+=(--arch armhf)
|
|
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[@]}"
|
|
|
|
setarch linux32 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
|
|
|
|
for i in {1..6}; do
|
|
if awk "\$2 ~ /^${DIR//\//\\/}/ {print \$2}" /etc/mtab | sort -r | xargs -r umount; then
|
|
break
|
|
elif [ "$i" -eq 6 ]; then
|
|
log "Failed to unmount ${DIR}. Do not try to delete this directory while it contains mountpoints!"
|
|
return 1
|
|
fi
|
|
log "Retrying ($i/5)..."
|
|
sleep 1
|
|
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
|
|
|
|
setarch linux32 capsh $CAPSH_ARG "--chroot=${ROOTFS_DIR}/" -- -e "$@"
|
|
}
|
|
export -f on_chroot
|
|
|
|
update_issue() {
|
|
echo -e "${PI_GEN_RELEASE} ${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
|
|
|
|
ensure_loopdev_partitions() {
|
|
local line
|
|
local partition
|
|
local majmin
|
|
lsblk -r -n -o "NAME,MAJ:MIN" "$1" | grep -v "^${1#/dev/} " | while read -r line; do
|
|
partition="${line%% *}"
|
|
majmin="${line#* }"
|
|
if [ ! -b "/dev/$partition" ]; then
|
|
mknod "/dev/$partition" b "${majmin%:*}" "${majmin#*:}"
|
|
fi
|
|
done
|
|
command -v udevadm >/dev/null 2>&1 || return 0
|
|
udevadm settle 10
|
|
}
|
|
export -f ensure_loopdev_partitions
|