Split live rootfs into smaller squashfs layers
This commit is contained in:
@@ -8,7 +8,7 @@
|
||||
# Layout (UEFI): GPT, /dev/sdX1=EFI 512MB vfat, /dev/sdX2=root ext4
|
||||
# Layout (BIOS): MBR, /dev/sdX1=root ext4
|
||||
#
|
||||
# Squashfs source: /run/live/medium/live/filesystem.squashfs
|
||||
# Squashfs sources: /run/live/medium/live/*.squashfs
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
@@ -62,9 +62,9 @@ for tool in parted mkfs.vfat mkfs.ext4 unsquashfs grub-install update-grub; do
|
||||
fi
|
||||
done
|
||||
|
||||
SQUASHFS="/run/live/medium/live/filesystem.squashfs"
|
||||
if [ ! -f "$SQUASHFS" ]; then
|
||||
echo "ERROR: squashfs not found at $SQUASHFS" >&2
|
||||
mapfile -t SQUASHFS_FILES < <(find /run/live/medium/live -maxdepth 1 -type f -name '*.squashfs' | sort)
|
||||
if [ "${#SQUASHFS_FILES[@]}" -eq 0 ]; then
|
||||
echo "ERROR: no squashfs files found under /run/live/medium/live" >&2
|
||||
echo " The live medium may have been disconnected." >&2
|
||||
echo " Reconnect the disc and run: bee-remount-medium --wait" >&2
|
||||
echo " Then re-run bee-install." >&2
|
||||
@@ -106,7 +106,10 @@ log "=== BEE DISK INSTALLER ==="
|
||||
log "Target device : $DEVICE"
|
||||
log "Root partition: $PART_ROOT"
|
||||
[ "$UEFI" = "1" ] && log "EFI partition : $PART_EFI"
|
||||
log "Squashfs : $SQUASHFS ($(du -sh "$SQUASHFS" | cut -f1))"
|
||||
log "Squashfs : ${#SQUASHFS_FILES[@]} layer(s)"
|
||||
for sf in "${SQUASHFS_FILES[@]}"; do
|
||||
log " - $sf ($(du -sh "$sf" | cut -f1))"
|
||||
done
|
||||
log "Log : $LOGFILE"
|
||||
log ""
|
||||
|
||||
@@ -163,7 +166,9 @@ log " Mounted."
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
log "--- Step 5/7: Unpacking filesystem (this takes 10-20 minutes) ---"
|
||||
log " Source: $SQUASHFS"
|
||||
for sf in "${SQUASHFS_FILES[@]}"; do
|
||||
log " Source: $sf"
|
||||
done
|
||||
log " Target: $MOUNT_ROOT"
|
||||
|
||||
# unsquashfs does not support resume, so retry the entire unpack step if the
|
||||
@@ -177,9 +182,9 @@ while true; do
|
||||
fi
|
||||
[ "$UNPACK_ATTEMPTS" -gt 1 ] && log " Retry attempt $UNPACK_ATTEMPTS / $UNPACK_MAX ..."
|
||||
|
||||
# Re-check squashfs is reachable before each attempt
|
||||
if [ ! -f "$SQUASHFS" ]; then
|
||||
log " SOURCE LOST: $SQUASHFS not found."
|
||||
mapfile -t SQUASHFS_FILES < <(find /run/live/medium/live -maxdepth 1 -type f -name '*.squashfs' | sort)
|
||||
if [ "${#SQUASHFS_FILES[@]}" -eq 0 ]; then
|
||||
log " SOURCE LOST: no squashfs files found under /run/live/medium/live."
|
||||
log " Reconnect the disc and run 'bee-remount-medium --wait' in another terminal,"
|
||||
log " then press Enter here to retry."
|
||||
read -r _
|
||||
@@ -194,12 +199,17 @@ while true; do
|
||||
fi
|
||||
|
||||
UNPACK_OK=0
|
||||
unsquashfs -f -d "$MOUNT_ROOT" "$SQUASHFS" 2>&1 | \
|
||||
grep -E '^\[|^inod|^created|^extract|^ERROR|failed' | \
|
||||
while IFS= read -r line; do log " $line"; done || UNPACK_OK=$?
|
||||
for sf in "${SQUASHFS_FILES[@]}"; do
|
||||
log " Unpacking $(basename "$sf") ..."
|
||||
unsquashfs -f -d "$MOUNT_ROOT" "$sf" 2>&1 | \
|
||||
grep -E '^\[|^inod|^created|^extract|^ERROR|failed' | \
|
||||
while IFS= read -r line; do log " $line"; done || UNPACK_OK=$?
|
||||
[ "$UNPACK_OK" -eq 0 ] || break
|
||||
done
|
||||
|
||||
# Check squashfs is still reachable (gone = disc pulled during copy)
|
||||
if [ ! -f "$SQUASHFS" ]; then
|
||||
mapfile -t SQUASHFS_FILES < <(find /run/live/medium/live -maxdepth 1 -type f -name '*.squashfs' | sort)
|
||||
if [ "${#SQUASHFS_FILES[@]}" -eq 0 ]; then
|
||||
log " WARNING: source medium lost during unpack — will retry after remount."
|
||||
log " Run 'bee-remount-medium --wait' in another terminal, then press Enter."
|
||||
read -r _
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# bee-remount-medium — find and remount the live ISO medium to /run/live/medium
|
||||
#
|
||||
# Run this after reconnecting the ISO source disc (USB/CD) if the live medium
|
||||
# was lost and /run/live/medium/live/filesystem.squashfs is missing.
|
||||
# was lost and /run/live/medium/live/*.squashfs are missing.
|
||||
#
|
||||
# Usage: bee-remount-medium [--wait]
|
||||
# --wait keep retrying every 5 seconds until the medium is found (useful
|
||||
@@ -11,7 +11,7 @@
|
||||
set -euo pipefail
|
||||
|
||||
MEDIUM_DIR="/run/live/medium"
|
||||
SQUASHFS_REL="live/filesystem.squashfs"
|
||||
SQUASHFS_GLOB="live/*.squashfs"
|
||||
WAIT_MODE=0
|
||||
|
||||
for arg in "$@"; do
|
||||
@@ -56,7 +56,7 @@ try_mount() {
|
||||
local tmpdir
|
||||
tmpdir=$(mktemp -d /tmp/bee-probe-XXXXXX)
|
||||
if mount -o ro "$dev" "$tmpdir" 2>/dev/null; then
|
||||
if [ -f "${tmpdir}/${SQUASHFS_REL}" ]; then
|
||||
if find "${tmpdir}/live" -maxdepth 1 -type f -name '*.squashfs' 2>/dev/null | grep -q .; then
|
||||
# Unmount probe mount and mount properly onto live path
|
||||
umount "$tmpdir" 2>/dev/null || true
|
||||
rmdir "$tmpdir" 2>/dev/null || true
|
||||
@@ -82,8 +82,9 @@ attempt() {
|
||||
for dev in $(find_candidates); do
|
||||
log " Trying $dev ..."
|
||||
if try_mount "$dev"; then
|
||||
local sq="${MEDIUM_DIR}/${SQUASHFS_REL}"
|
||||
log "SUCCESS: squashfs available at $sq ($(du -sh "$sq" | cut -f1))"
|
||||
local count
|
||||
count=$(find "${MEDIUM_DIR}/live" -maxdepth 1 -type f -name '*.squashfs' 2>/dev/null | wc -l | tr -d ' ')
|
||||
log "SUCCESS: ${count} squashfs layer(s) available under ${MEDIUM_DIR}/live"
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
@@ -100,5 +101,5 @@ if [ "$WAIT_MODE" = "1" ]; then
|
||||
sleep 5
|
||||
done
|
||||
else
|
||||
attempt || die "No ISO medium with ${SQUASHFS_REL} found. Reconnect the disc and re-run, or use --wait."
|
||||
attempt || die "No ISO medium with ${SQUASHFS_GLOB} found. Reconnect the disc and re-run, or use --wait."
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user