iso/build.sh runs mkarchiso inside a privileged archlinux container, overlays our customizations onto Arch's stock releng profile (systemd unit that launches Flask on 0.0.0.0:5000, the webinstaller under /opt/furtka, extra packages for python/flask/avahi), and drops a hybrid BIOS/UEFI ISO in iso/out/. Verified end to end: Proxmox VM (OVMF, Secure Boot off) boots the ISO, DHCP's onto the LAN, and serves screens 1-3 of the existing wizard at http://<vm-ip>:5000/install/step1. This is the first point at which Furtka is something you can run instead of something you can read about. Two known drive-list bugs surfaced while testing (/dev/loop0 and /dev/sr0 appear as install targets) — captured in the README roadmap. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
62 lines
2 KiB
Bash
Executable file
62 lines
2 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# Build a Furtka live ISO.
|
|
#
|
|
# From the repo root or from iso/ on any host with Docker:
|
|
# ./iso/build.sh
|
|
#
|
|
# The build runs inside a privileged `archlinux:latest` container because
|
|
# mkarchiso needs root + loop mounts + an Arch package manager, which
|
|
# Ubuntu doesn't provide natively. Output ISO goes to iso/out/.
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
OUT_DIR="$SCRIPT_DIR/out"
|
|
|
|
if [[ "${FURTKA_ISO_INNER:-0}" != "1" ]]; then
|
|
mkdir -p "$OUT_DIR"
|
|
echo "==> Launching build container"
|
|
exec docker run --rm --privileged \
|
|
-v "$REPO_ROOT:/work" \
|
|
-w /work \
|
|
-e FURTKA_ISO_INNER=1 \
|
|
archlinux:latest \
|
|
bash /work/iso/build.sh
|
|
fi
|
|
|
|
# ---- inside the container from here on ----
|
|
|
|
echo "==> Syncing pacman, installing archiso"
|
|
pacman -Syu --noconfirm --needed archiso
|
|
|
|
PROFILE_SRC="/usr/share/archiso/configs/releng"
|
|
PROFILE_WORK="/tmp/furtka-profile"
|
|
BUILD_WORK="/tmp/furtka-build"
|
|
OUT_IN_CONTAINER="/work/iso/out"
|
|
|
|
rm -rf "$PROFILE_WORK" "$BUILD_WORK"
|
|
cp -a "$PROFILE_SRC" "$PROFILE_WORK"
|
|
|
|
echo "==> Overlaying Furtka customizations"
|
|
|
|
cat "$SCRIPT_DIR/overlay/packages.extra" >> "$PROFILE_WORK/packages.x86_64"
|
|
|
|
cat "$SCRIPT_DIR/overlay/profiledef.sh" >> "$PROFILE_WORK/profiledef.sh"
|
|
|
|
cp -a "$SCRIPT_DIR/overlay/airootfs/." "$PROFILE_WORK/airootfs/"
|
|
|
|
mkdir -p "$PROFILE_WORK/airootfs/opt/furtka"
|
|
cp -a "$REPO_ROOT/webinstaller/." "$PROFILE_WORK/airootfs/opt/furtka/"
|
|
rm -rf "$PROFILE_WORK/airootfs/opt/furtka/__pycache__"
|
|
|
|
mkdir -p "$PROFILE_WORK/airootfs/etc/systemd/system/avahi-daemon.service.d"
|
|
ln -sf /usr/lib/systemd/system/avahi-daemon.service \
|
|
"$PROFILE_WORK/airootfs/etc/systemd/system/multi-user.target.wants/avahi-daemon.service"
|
|
|
|
echo "==> Building ISO (mkarchiso)"
|
|
mkdir -p "$OUT_IN_CONTAINER"
|
|
mkarchiso -v -w "$BUILD_WORK" -o "$OUT_IN_CONTAINER" "$PROFILE_WORK"
|
|
|
|
echo
|
|
echo "==> Done. ISO(s) in $OUT_IN_CONTAINER (on host: iso/out/):"
|
|
ls -lh "$OUT_IN_CONTAINER"
|