tawasuyu
⎇ 48e41331a104ba136b34e7695dccb08ef9188703 scripts/build-rootfs.sh Shell · 105 lines · 3.1 KB History raw

journal-query CLI, machined, polkit con grants reales, GNOME boot test 48e41331a · Sergio ·

1#!/usr/bin/env bash
2# build-rootfs.sh — overlay del workspace sobre una imagen base.
3#
4# Inputs:
5#   $1 — path al rootfs (directorio montado o chroot pre-existente)
6#   $2 — path opcional a Card Semilla custom (.k o .json)
7#
8# Output: el rootfs queda con /init → ente-zero, binarios en
9# /usr/local/bin, y la Semilla en /ente/seed.card.k.
10
11set -euo pipefail
12
13ROOTFS="${1:-}"
14SEED_CARD="${2:-}"
15
16if [[ -z "$ROOTFS" || ! -d "$ROOTFS" ]]; then
17    echo "Uso: $0 <rootfs-dir> [seed-card-path]" >&2
18    exit 1
19fi
20
21WORKSPACE="$(cd "$(dirname "$0")/.." && pwd)"
22echo "Workspace: $WORKSPACE"
23echo "Rootfs:    $ROOTFS"
24
25# 1. Build release
26echo "==> cargo build --workspace --release"
27cd "$WORKSPACE"
28cargo build --workspace --release
29
30# 2. Copia binarios
31echo "==> copiando binarios a $ROOTFS/usr/local/bin/"
32mkdir -p "$ROOTFS/usr/local/bin"
33BINS=(
34    ente-zero
35    ente-logind-compat
36    ente-hostnamed-compat
37    ente-timedated-compat
38    ente-localed-compat
39    ente-journald-compat
40    ente-resolved-compat
41    ente-polkit-compat
42    ente-machined-compat
43    ente-echo
44    ente-journalctl
45)
46for bin in "${BINS[@]}"; do
47    src="target/release/$bin"
48    if [[ ! -x "$src" ]]; then
49        echo "WARN: $src no existe, skip" >&2
50        continue
51    fi
52    cp "$src" "$ROOTFS/usr/local/bin/"
53    echo "  + $bin"
54done
55
56# brainctl viene del example
57if [[ -x "target/release/examples/brainctl" ]]; then
58    cp "target/release/examples/brainctl" "$ROOTFS/usr/local/bin/"
59    echo "  + brainctl (example)"
60fi
61if [[ -x "target/release/examples/busctl" ]]; then
62    cp "target/release/examples/busctl" "$ROOTFS/usr/local/bin/ente-busctl"
63    echo "  + ente-busctl (example, renombrado para no chocar con systemd-busctl)"
64fi
65
66# 3. Backup del init original
67if [[ -e "$ROOTFS/sbin/init" && ! -L "$ROOTFS/sbin/init" ]]; then
68    if [[ ! -e "$ROOTFS/sbin/init.systemd" ]]; then
69        echo "==> backup /sbin/init → /sbin/init.systemd"
70        mv "$ROOTFS/sbin/init" "$ROOTFS/sbin/init.systemd"
71    fi
72fi
73
74# 4. /init y /sbin/init apuntan a ente-zero
75echo "==> /init → ente-zero"
76ln -sf /usr/local/bin/ente-zero "$ROOTFS/init"
77ln -sf /usr/local/bin/ente-zero "$ROOTFS/sbin/init"
78
79# 5. Card Semilla
80mkdir -p "$ROOTFS/ente"
81if [[ -n "$SEED_CARD" && -f "$SEED_CARD" ]]; then
82    cp "$SEED_CARD" "$ROOTFS/ente/seed.card.k"
83    echo "==> Semilla custom: $SEED_CARD"
84else
85    cp "$WORKSPACE/docs/seed-gnome-test.k" "$ROOTFS/ente/seed.card.k" 2>/dev/null \
86        || echo "WARN: docs/seed-gnome-test.k no existe; ente-zero sintetizará dev seed"
87fi
88
89# 6. Mascara servicios systemd que vamos a sustituir
90echo "==> systemctl mask de servicios sustituidos (si systemd presente)"
91chroot "$ROOTFS" systemctl mask \
92    systemd-logind.service \
93    systemd-hostnamed.service \
94    systemd-timedated.service \
95    systemd-localed.service \
96    systemd-journald.service \
97    systemd-resolved.service \
98    systemd-machined.service \
99    polkit.service \
100    2>/dev/null || echo "  (chroot mask falló — OK si la imagen no tiene systemd)"
101
102echo "==> rootfs listo en $ROOTFS"
103echo
104echo "Próximo paso:"
105echo "  scripts/run-vm.sh <imagen-base.qcow2>"