Files
hiperiso/scripts/build_initramfs.sh
T

93 lines
4.6 KiB
Bash
Executable File

#!/bin/bash
#
# build_initramfs.sh — Pack the hiperiso host initramfs
# ---------------------------------------------------------------------------
# Takes the staging directory (build/staging) and assembles a cpio.gz from:
# - host/initramfs/* (init scripts — written by the initramfs task)
# - busybox (static binary, built/downloaded separately)
# - qemu-system-x86_64 (from the QEMU build, already in staging)
# - hiperiso-log (from logging/hiperiso-log, already in staging)
# - OVMF.fd (from the EDK2 build, already in staging)
#
# Usage: build_initramfs.sh <staging_dir>
#
set -euo pipefail
STAGING="${1:?usage: build_initramfs.sh <staging_dir>}"
STAGING="$(cd "$STAGING" && pwd)"
[ -d "$STAGING" ] || { echo "ERROR: staging dir '$STAGING' not found" >&2; exit 1; }
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
ROOT="$STAGING/initramfs"
echo "=== Building initramfs in $ROOT ==="
# ── Directory tree ──────────────────────────────────────────────────────────
mkdir -p "$ROOT"/{bin,sbin,etc,proc,sys,dev,tmp,run,mnt/usb,mnt/efi,usr/bin,usr/sbin,EFI/hiperiso/trace}
# ── Init scripts (from host/initramfs/) — copied to root of initramfs ───────
if [ -d "$REPO_ROOT/host/initramfs" ]; then
cp -a "$REPO_ROOT/host/initramfs/." "$ROOT/"
chmod +x "$ROOT"/init "$ROOT"/*.sh 2>/dev/null || true
echo " [ok] copied init scripts"
else
echo " [warn] host/initramfs/ missing — init scripts not packed yet"
fi
# ── busybox (static binary) ─────────────────────────────────────────────────
BUSYBOX="${BUSYBOX:-$STAGING/busybox}"
if [ -x "$BUSYBOX" ]; then
install -m0755 "$BUSYBOX" "$ROOT/bin/busybox"
# Create common applet symlinks
for app in sh mount umount ls cat echo mkdir mkfifo poweroff reboot sync sleep ln cp mv rm switch_root date grep cut sed awk head tail tr wc basename dirname find mktemp dd mknod losetup blkid dmesg ps kill chmod chown env uname stat tar; do
ln -sf busybox "$ROOT/bin/$app"
done
echo " [ok] busybox installed"
else
echo " [warn] busybox not found at $BUSYBOX (set BUSYBOX=path)"
fi
# ── qemu-system-x86_64 (stripped, from QEMU build) ──────────────────────────
if [ -x "$STAGING/qemu-system-x86_64" ]; then
install -m0755 "$STAGING/qemu-system-x86_64" "$ROOT/usr/bin/qemu-system-x86_64"
echo " [ok] qemu-system-x86_64 installed"
else
echo " [warn] qemu-system-x86_64 missing in staging"
fi
# ── hiperiso-log (log analysis tool) ────────────────────────────────────────
if [ -x "$STAGING/hiperiso-log" ]; then
install -m0755 "$STAGING/hiperiso-log" "$ROOT/usr/bin/hiperiso-log"
echo " [ok] hiperiso-log installed"
else
echo " [warn] hiperiso-log missing in staging"
fi
# ── OVMF firmware (for QEMU -bios) ──────────────────────────────────────────
if [ -f "$STAGING/OVMF.fd" ]; then
install -m0644 "$STAGING/OVMF.fd" "$ROOT/EFI/hiperiso/OVMF.fd"
echo " [ok] OVMF.fd installed"
else
echo " [warn] OVMF.fd missing in staging"
fi
# ── Trace event files ───────────────────────────────────────────────────────
if ls "$REPO_ROOT"/logging/trace-*.events >/dev/null 2>&1; then
cp "$REPO_ROOT"/logging/trace-*.events "$ROOT/EFI/hiperiso/trace/"
echo " [ok] trace event files installed"
fi
# ── /dev nodes ─────────────────────────────────────────────────────────────
# devtmpfs will populate /dev at runtime; just ensure the mountpoint exists.
# (Creating device nodes here would require root; devtmpfs handles it.)
# ── Pack into cpio.gz ───────────────────────────────────────────────────────
echo "=== Packing initramfs.cpio.gz ==="
(
cd "$ROOT"
find . -print0 | cpio --null -H newc -o --owner=root:root 2>/dev/null \
| gzip -9 > "$STAGING/initramfs.cpio.gz"
)
echo "=== initramfs.cpio.gz ready ($(du -h "$STAGING/initramfs.cpio.gz" | cut -f1)) ==="