#!/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.k. set -euo pipefail ROOTFS="${1:-}" SEED_CARD="${2:-}" if [[ -z "$ROOTFS" || ! -d "$ROOTFS" ]]; then echo "Uso: $0 [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 mkdir -p "$ROOTFS/ente" if [[ -n "$SEED_CARD" && -f "$SEED_CARD" ]]; then cp "$SEED_CARD" "$ROOTFS/ente/seed.card.k" echo "==> Semilla custom: $SEED_CARD" else cp "$WORKSPACE/docs/seed-gnome-test.k" "$ROOTFS/ente/seed.card.k" 2>/dev/null \ || echo "WARN: docs/seed-gnome-test.k 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 "