bedb30791b
Add missing applets used by init scripts: printf, readlink, test, true, false, which, free, pidof, insmod, modprobe, lsmod, ifconfig, ip, route, uptime, lsblk, zcat, gunzip, gzip, xz, unxz, du, df, id, ash, halt. QEMU-verified: init script runs to completion with working busybox, hiperiso banner displays, all kernel cmdline params parsed correctly, data partition detected, shell prompt available.
93 lines
4.8 KiB
Bash
Executable File
93 lines
4.8 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 ash mount umount ls cat echo printf mkdir mkfifo poweroff reboot halt 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 lsblk dmesg ps kill chmod chown env uname stat tar test true false which readlink free pidof renice insmod modprobe lsmod ifconfig ip route uptime fdisk zcat gunzip gzip xz unxz du df id; 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)) ==="
|