106 lines
3.1 KiB
Bash
Executable File
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>"
|