Files
arje/scripts/build-rootfs.sh
2026-05-06 20:40:47 +00:00

106 lines
3.1 KiB
Bash
Executable File

#!/usr/bin/env bash
# build-rootfs.sh — overlay del workspace sobre una imagen base.
#
# Inputs:
# $1 — path al rootfs (directorio montado o chroot pre-existente)
# $2 — path opcional a Card Semilla custom (.k o .json)
#
# Output: el rootfs queda con /init → ente-zero, binarios en
# /usr/local/bin, y la Semilla en /ente/seed.card.json.
set -euo pipefail
ROOTFS="${1:-}"
SEED_CARD="${2:-}"
if [[ -z "$ROOTFS" || ! -d "$ROOTFS" ]]; then
echo "Uso: $0 <rootfs-dir> [seed-card-path]" >&2
exit 1
fi
WORKSPACE="$(cd "$(dirname "$0")/.." && pwd)"
echo "Workspace: $WORKSPACE"
echo "Rootfs: $ROOTFS"
# 1. Build release
echo "==> cargo build --workspace --release"
cd "$WORKSPACE"
cargo build --workspace --release
# 2. Copia binarios
echo "==> copiando binarios a $ROOTFS/usr/local/bin/"
mkdir -p "$ROOTFS/usr/local/bin"
BINS=(
ente-zero
ente-logind-compat
ente-hostnamed-compat
ente-timedated-compat
ente-localed-compat
ente-journald-compat
ente-resolved-compat
ente-polkit-compat
ente-machined-compat
ente-echo
ente-journalctl
)
for bin in "${BINS[@]}"; do
src="target/release/$bin"
if [[ ! -x "$src" ]]; then
echo "WARN: $src no existe, skip" >&2
continue
fi
cp "$src" "$ROOTFS/usr/local/bin/"
echo " + $bin"
done
# brainctl viene del example
if [[ -x "target/release/examples/brainctl" ]]; then
cp "target/release/examples/brainctl" "$ROOTFS/usr/local/bin/"
echo " + brainctl (example)"
fi
if [[ -x "target/release/examples/busctl" ]]; then
cp "target/release/examples/busctl" "$ROOTFS/usr/local/bin/ente-busctl"
echo " + ente-busctl (example, renombrado para no chocar con systemd-busctl)"
fi
# 3. Backup del init original
if [[ -e "$ROOTFS/sbin/init" && ! -L "$ROOTFS/sbin/init" ]]; then
if [[ ! -e "$ROOTFS/sbin/init.systemd" ]]; then
echo "==> backup /sbin/init → /sbin/init.systemd"
mv "$ROOTFS/sbin/init" "$ROOTFS/sbin/init.systemd"
fi
fi
# 4. /init y /sbin/init apuntan a ente-zero
echo "==> /init → ente-zero"
ln -sf /usr/local/bin/ente-zero "$ROOTFS/init"
ln -sf /usr/local/bin/ente-zero "$ROOTFS/sbin/init"
# 5. Card Semilla — JSON crudo, validado en boot por EntityCard::validate().
mkdir -p "$ROOTFS/ente"
if [[ -n "$SEED_CARD" && -f "$SEED_CARD" ]]; then
cp "$SEED_CARD" "$ROOTFS/ente/seed.card.json"
echo "==> Semilla custom: $SEED_CARD"
else
cp "$WORKSPACE/docs/seed-vps-min.json" "$ROOTFS/ente/seed.card.json" 2>/dev/null \
|| echo "WARN: docs/seed-vps-min.json no existe; ente-zero sintetizará dev seed"
fi
# 6. Mascara servicios systemd que vamos a sustituir
echo "==> systemctl mask de servicios sustituidos (si systemd presente)"
chroot "$ROOTFS" systemctl mask \
systemd-logind.service \
systemd-hostnamed.service \
systemd-timedated.service \
systemd-localed.service \
systemd-journald.service \
systemd-resolved.service \
systemd-machined.service \
polkit.service \
2>/dev/null || echo " (chroot mask falló — OK si la imagen no tiene systemd)"
echo "==> rootfs listo en $ROOTFS"
echo
echo "Próximo paso:"
echo " scripts/run-vm.sh <imagen-base.qcow2>"