- grub.cfg: add "load to RAM (toram)" entry to advanced submenu - install_to_ram.go: resume from existing /dev/shm/bee-live copy if source medium is unavailable after bee-web restart - tasks.go: fix "Recovered after bee-web restart" shown on every run (check j.lines before first append, not after) - bee-install: retry unsquashfs up to 5x with wait-for-remount on source loss; clear error message with bee-remount-medium hint - bee-remount-medium: new script to find and remount live ISO source after USB/CD reconnect; supports --wait polling mode - 9000-bee-setup: chmod +x for bee-install and bee-remount-medium Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
101 lines
3.2 KiB
Bash
101 lines
3.2 KiB
Bash
#!/bin/bash
|
|
# 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.
|
|
#
|
|
# Usage: bee-remount-medium [--wait]
|
|
# --wait keep retrying every 5 seconds until the medium is found (useful
|
|
# while physically reconnecting the device)
|
|
|
|
set -euo pipefail
|
|
|
|
MEDIUM_DIR="/run/live/medium"
|
|
SQUASHFS_REL="live/filesystem.squashfs"
|
|
WAIT_MODE=0
|
|
|
|
for arg in "$@"; do
|
|
case "$arg" in
|
|
--wait|-w) WAIT_MODE=1 ;;
|
|
--help|-h)
|
|
echo "Usage: bee-remount-medium [--wait]"
|
|
echo " Finds and remounts the live ISO medium to $MEDIUM_DIR"
|
|
echo " --wait retry every 5 s until a medium with squashfs is found"
|
|
exit 0 ;;
|
|
esac
|
|
done
|
|
|
|
log() { echo "[$(date +%H:%M:%S)] $*"; }
|
|
die() { log "ERROR: $*" >&2; exit 1; }
|
|
|
|
# Return all candidate block devices (optical + removable USB mass storage)
|
|
find_candidates() {
|
|
# CD/DVD drives
|
|
for dev in /dev/sr* /dev/scd*; do
|
|
[ -b "$dev" ] && echo "$dev"
|
|
done
|
|
# USB/removable disks and partitions
|
|
for dev in /dev/sd* /dev/vd*; do
|
|
[ -b "$dev" ] || continue
|
|
# Only whole disks or partitions — skip the same device we are running from
|
|
local removable
|
|
local base
|
|
base=$(basename "$dev")
|
|
removable=$(cat "/sys/block/${base%%[0-9]*}/removable" 2>/dev/null || echo 0)
|
|
[ "$removable" = "1" ] && echo "$dev"
|
|
done
|
|
}
|
|
|
|
# Try to mount $1 to $MEDIUM_DIR and check for squashfs
|
|
try_mount() {
|
|
local dev="$1"
|
|
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
|
|
# Unmount probe mount and mount properly onto live path
|
|
umount "$tmpdir" 2>/dev/null || true
|
|
rmdir "$tmpdir" 2>/dev/null || true
|
|
# Unmount whatever is currently on MEDIUM_DIR (may be empty/stale)
|
|
umount "$MEDIUM_DIR" 2>/dev/null || true
|
|
mkdir -p "$MEDIUM_DIR"
|
|
if mount -o ro "$dev" "$MEDIUM_DIR"; then
|
|
log "Mounted $dev on $MEDIUM_DIR"
|
|
return 0
|
|
else
|
|
log "Mount of $dev on $MEDIUM_DIR failed"
|
|
return 1
|
|
fi
|
|
fi
|
|
umount "$tmpdir" 2>/dev/null || true
|
|
fi
|
|
rmdir "$tmpdir" 2>/dev/null || true
|
|
return 1
|
|
}
|
|
|
|
attempt() {
|
|
log "Scanning for ISO medium..."
|
|
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))"
|
|
return 0
|
|
fi
|
|
done
|
|
return 1
|
|
}
|
|
|
|
if [ "$WAIT_MODE" = "1" ]; then
|
|
log "Waiting for live medium (press Ctrl+C to abort)..."
|
|
while true; do
|
|
if attempt; then
|
|
exit 0
|
|
fi
|
|
log " Not found — retrying in 5 s (reconnect the disc now)"
|
|
sleep 5
|
|
done
|
|
else
|
|
attempt || die "No ISO medium with ${SQUASHFS_REL} found. Reconnect the disc and re-run, or use --wait."
|
|
fi
|