
Although the loop block device is created before attaching the image to it, the devices for the partition that the image contains are still not created. This patch creates those devices as well, when they are not already available. Fixes #482 Signed-off-by: Vasilis Tsiligiannis <acinonyx@openwrt.gr>
127 lines
3.0 KiB
Plaintext
127 lines
3.0 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
|
|
|
|
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
|
|
|
|
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
|
|
}
|
|
export -f ensure_loopdev_partitions
|