b1be94e7c4
GPUI panic-ea si no encuentra ninguna fuente del fallback (.SystemUIFont → Helvetica → Cantarell → DejaVu Sans → ...). Fedora minimal no trae fuentes — sin esto el greeter crash al inicializar text_system. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
269 lines
11 KiB
Bash
Executable File
269 lines
11 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# install-arje-as-init.sh — instala arje como init alternativo en una
|
|
# máquina real con systemd ya instalado, en coexistencia.
|
|
#
|
|
# ESTRATEGIA: arje NO reemplaza al systemd default. Se instala en
|
|
# paralelo con su propia entrada GRUB. Booteás arje cuando querés,
|
|
# volvés a systemd si algo no anda.
|
|
#
|
|
# QUÉ HACE:
|
|
# 1. Compila musl-static todos los binarios del fractal.
|
|
# 2. Copia binarios a /usr/sbin/ (init/shims) y /usr/bin/ (CLIs admin)
|
|
# del rootfs vivo.
|
|
# 3. Copia la seed a /ente/seed.card.json (default: arje-host.card.json).
|
|
# 4. Crea menuentry "arje" en /etc/grub.d/40_custom usando init=/sbin/arje-zero
|
|
# (conserva initramfs nativo → firmware, módulos kernel, root FS,
|
|
# siguen funcionando exactamente igual).
|
|
# 5. Ejecuta update-grub o grub-mkconfig según distro.
|
|
#
|
|
# QUÉ NO HACE:
|
|
# - Tocar /sbin/init, /usr/lib/systemd/* (systemd queda intacto y default).
|
|
# - Cambiar GRUB_DEFAULT (seguís booteando systemd por default).
|
|
# - Cargar arje ahora. Lo elegís manualmente en el próximo boot.
|
|
# - Habilitar servicios systemd que arje no necesita (eso es responsabilidad
|
|
# tuya, ver docs/arje-replace-systemd.md §4).
|
|
#
|
|
# REVERTIR: sudo scripts/uninstall-arje.sh
|
|
#
|
|
# Uso:
|
|
# sudo scripts/install-arje-as-init.sh [seed.card.json]
|
|
#
|
|
# seed default: seeds/arje-host.card.json
|
|
|
|
set -euo pipefail
|
|
|
|
SEED="${1:-seeds/arje-host.card.json}"
|
|
TARGET="${ARJE_TARGET:-x86_64-unknown-linux-musl}"
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
cd "$REPO_DIR"
|
|
|
|
if [ "$(id -u)" -ne 0 ]; then
|
|
echo "[install-arje] hace falta root (modifica /usr/sbin, /etc/grub.d, /ente)" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [ ! -f "$SEED" ]; then
|
|
echo "[install-arje] seed no encontrada: $SEED" >&2
|
|
exit 2
|
|
fi
|
|
|
|
# Verificar que el systemd default sigue siendo el init — querés saber
|
|
# de qué te volvés capaz de regresar.
|
|
if [ ! -e /sbin/init ] && [ ! -e /lib/systemd/systemd ] && [ ! -e /usr/lib/systemd/systemd ]; then
|
|
echo "[install-arje] WARN: no detecto systemd en esta máquina." >&2
|
|
echo " Si esta máquina ya corre arje, este script no es lo que querés." >&2
|
|
echo " Continuá sólo si sabés lo que hacés." >&2
|
|
read -r -p " ¿continuar? [y/N] " ans
|
|
[ "$ans" = "y" ] || exit 3
|
|
fi
|
|
|
|
# Chequeo de prerrequisitos antes de arrancar la compilación, así un
|
|
# fallo da un mensaje accionable en vez de irse silencioso a /dev/null.
|
|
echo "[install-arje] paso 0/5: chequeo de prerrequisitos"
|
|
missing=()
|
|
command -v cargo >/dev/null 2>&1 || missing+=("cargo (rustup: curl https://sh.rustup.rs -sSf | sh)")
|
|
command -v musl-gcc >/dev/null 2>&1 || missing+=("musl-gcc (Fedora: dnf install musl-gcc musl-libc-static · Debian: apt install musl-tools)")
|
|
command -v busybox >/dev/null 2>&1 || missing+=("busybox-static (Fedora: dnf install busybox · Debian: apt install busybox-static)")
|
|
command -v cpio >/dev/null 2>&1 || missing+=("cpio")
|
|
command -v gzip >/dev/null 2>&1 || missing+=("gzip")
|
|
if [ "${#missing[@]}" -gt 0 ]; then
|
|
echo "[install-arje] faltan prerrequisitos:" >&2
|
|
printf " - %s\n" "${missing[@]}" >&2
|
|
exit 6
|
|
fi
|
|
SYSROOT="$(rustc --print sysroot 2>/dev/null || true)"
|
|
if [ -z "$SYSROOT" ] || [ ! -d "$SYSROOT/lib/rustlib/$TARGET" ]; then
|
|
echo "[install-arje] falta el target Rust '$TARGET' (sysroot=$SYSROOT)" >&2
|
|
echo " Instalalo con: rustup target add $TARGET" >&2
|
|
exit 7
|
|
fi
|
|
|
|
echo "[install-arje] paso 1/5: compilar binarios musl-static"
|
|
echo " (la PRIMERA vez tarda 10-20 minutos en una VPS de 4 GB; la salida"
|
|
echo " de cargo va a fluir directo a esta terminal — no es un cuelgue)"
|
|
"$SCRIPT_DIR/build-arje-initrd.sh" "$SEED" /tmp/arje-noop.cpio.gz
|
|
rm -f /tmp/arje-noop.cpio.gz
|
|
|
|
# Paso 1b: compositor + greeter (target nativo, no musl — arrastran
|
|
# Mesa/EGL/Wayland dinámicos). Si fallan, el resto del install sigue:
|
|
# arje-zero y los shims andan sin la cadena DM.
|
|
echo "[install-arje] paso 1b/5: compilar mirada-compositor + mirada-greeter (target nativo)"
|
|
HOST_BIN_DIR=""
|
|
if cargo build --release -p mirada-compositor -p mirada-greeter; then
|
|
HOST_BIN_DIR="$REPO_DIR/target/release"
|
|
else
|
|
echo "[install-arje] WARN: el compositor no compiló — la cadena DM no se va a activar." >&2
|
|
echo " Probablemente faltan dev-libs en Fedora. Instalá y reintentá:" >&2
|
|
echo " dnf install -y mesa-libGL-devel mesa-libgbm-devel libdrm-devel \\" >&2
|
|
echo " libxkbcommon-devel libxkbcommon-x11-devel wayland-devel \\" >&2
|
|
echo " libinput-devel systemd-devel libseat-devel pixman-devel \\" >&2
|
|
echo " clang-devel pkgconf-pkg-config pam-devel" >&2
|
|
echo " (clang-devel es para libclang.so que necesitan los bindgen de" >&2
|
|
echo " libinput-sys/wayland-sys; pam-devel para brahman-auth;" >&2
|
|
echo " libxkbcommon-x11-devel para mirada-greeter; pixman-devel" >&2
|
|
echo " para el compositor smithay)." >&2
|
|
fi
|
|
BIN_DIR="$REPO_DIR/target/$TARGET/release"
|
|
EX_DIR="$BIN_DIR/examples"
|
|
|
|
echo "[install-arje] paso 2/5: instalar binarios en /usr/sbin/ y /usr/bin/"
|
|
install -m 0755 "$BIN_DIR/arje-zero" /usr/sbin/arje-zero
|
|
for b in arje-echo arje-policy-provider \
|
|
arje-logind-compat arje-hostnamed-compat arje-timedated-compat \
|
|
arje-localed-compat arje-journald-compat arje-resolved-compat \
|
|
arje-polkit-compat arje-machined-compat arje-systemd1-compat \
|
|
arje-notify-compat arje-timer-compat arje-tmpfiles-compat \
|
|
arje-binfmt-compat; do
|
|
install -m 0755 "$BIN_DIR/$b" "/usr/sbin/$b"
|
|
done
|
|
for e in brahman-status busctl brainctl; do
|
|
install -m 0755 "$EX_DIR/$e" "/usr/bin/$e"
|
|
done
|
|
# Helper sh que levanta la red y crea los dirs de runtime que sshd
|
|
# espera. Lo invoca el Card `net-up` del seed.
|
|
install -m 0755 "$SCRIPT_DIR/arje-net-up.sh" /usr/sbin/arje-net-up
|
|
|
|
# Compositor + greeter, si compilaron en el paso 1b.
|
|
if [ -n "$HOST_BIN_DIR" ]; then
|
|
for b in mirada-compositor mirada-greeter; do
|
|
if [ -f "$HOST_BIN_DIR/$b" ]; then
|
|
install -m 0755 "$HOST_BIN_DIR/$b" "/usr/bin/$b"
|
|
else
|
|
echo "[install-arje] WARN: $HOST_BIN_DIR/$b no existe — no se instala" >&2
|
|
fi
|
|
done
|
|
fi
|
|
# Aviso de libs runtime — no son fatales para arje-zero, pero sí para
|
|
# que el compositor pueda dibujar y para que GPUI (greeter) inicialice
|
|
# su contexto Vulkan.
|
|
MISSING_RT=""
|
|
ldconfig -p 2>/dev/null | grep -q 'libEGL' || MISSING_RT="$MISSING_RT libEGL"
|
|
ldconfig -p 2>/dev/null | grep -q 'libvulkan' || MISSING_RT="$MISSING_RT libvulkan"
|
|
ldconfig -p 2>/dev/null | grep -q 'libgbm' || MISSING_RT="$MISSING_RT libgbm"
|
|
ldconfig -p 2>/dev/null | grep -q 'libseat' || MISSING_RT="$MISSING_RT libseat"
|
|
# Fuentes: GPUI cae a un panic si no encuentra ninguna en su fallback
|
|
# (DejaVu Sans, Cantarell, Noto Sans, etc.).
|
|
[ -d /usr/share/fonts/dejavu* ] || [ -d /usr/share/fonts/cantarell ] \
|
|
|| MISSING_RT="$MISSING_RT fonts"
|
|
if [ -n "$MISSING_RT" ]; then
|
|
echo "[install-arje] aviso: faltan libs/fuentes runtime:$MISSING_RT" >&2
|
|
echo " Para activar la cadena DM (Fedora):" >&2
|
|
echo " dnf install -y mesa-dri-drivers mesa-libgbm mesa-libEGL \\" >&2
|
|
echo " libxkbcommon libseat seatd \\" >&2
|
|
echo " vulkan-loader mesa-vulkan-drivers \\" >&2
|
|
echo " dejavu-sans-fonts cantarell-fonts google-noto-sans-fonts" >&2
|
|
echo " (vulkan-loader + mesa-vulkan-drivers = lavapipe, Vulkan por" >&2
|
|
echo " software, necesario para GPUI en VPS sin GPU real;" >&2
|
|
echo " las fuentes evitan un panic de GPUI al inicializar text_system)." >&2
|
|
fi
|
|
|
|
echo "[install-arje] paso 3/5: instalar seed en /ente/seed.card.json"
|
|
mkdir -p /ente
|
|
# Backup del seed previo (si lo hay) — nunca sobrescribimos sin guardar.
|
|
if [ -f /ente/seed.card.json ]; then
|
|
cp /ente/seed.card.json "/ente/seed.card.json.bak-$(date +%s)"
|
|
fi
|
|
install -m 0644 "$SEED" /ente/seed.card.json
|
|
|
|
echo "[install-arje] paso 4/5: detectar kernel para menuentry GRUB"
|
|
# Reusamos el kernel del host (mismo vmlinuz que usa systemd). Detectamos
|
|
# el current; si tenés varios, se elige el del uname.
|
|
KVER="$(uname -r)"
|
|
VMLINUZ=""
|
|
INITRD=""
|
|
for cand in "/boot/vmlinuz-$KVER" "/boot/vmlinuz" /boot/vmlinuz-*; do
|
|
if [ -f "$cand" ]; then VMLINUZ="$cand"; break; fi
|
|
done
|
|
for cand in "/boot/initrd.img-$KVER" "/boot/initramfs-$KVER.img" \
|
|
"/boot/initrd.img" /boot/initrd.img-* /boot/initramfs-*.img; do
|
|
if [ -f "$cand" ]; then INITRD="$cand"; break; fi
|
|
done
|
|
|
|
if [ -z "$VMLINUZ" ] || [ -z "$INITRD" ]; then
|
|
echo "[install-arje] ERROR: no encontré vmlinuz o initrd nativo en /boot." >&2
|
|
echo " Sin esos no se puede armar la entrada GRUB." >&2
|
|
exit 4
|
|
fi
|
|
echo " kernel: $VMLINUZ"
|
|
echo " initrd: $INITRD"
|
|
|
|
# El root device — leemos /proc/cmdline para reusarlo exactamente como
|
|
# está en la entrada systemd actual.
|
|
ROOT_OPT="$(awk -v RS=' ' '/^root=/' /proc/cmdline | tr -d '\n')"
|
|
if [ -z "$ROOT_OPT" ]; then
|
|
echo "[install-arje] WARN: no extraje root= de /proc/cmdline." >&2
|
|
echo " Configurá manualmente la entrada GRUB con tu root device." >&2
|
|
ROOT_OPT="root=/dev/sda1 # AJUSTAR"
|
|
fi
|
|
|
|
echo "[install-arje] paso 5/5: agregar menuentry GRUB"
|
|
CUSTOM=/etc/grub.d/40_custom
|
|
# Si ya existe nuestro menuentry, lo reemplazamos (idempotente).
|
|
if grep -q "BEGIN ARJE-MENUENTRY" "$CUSTOM"; then
|
|
# Borrar el bloque previo.
|
|
awk '/BEGIN ARJE-MENUENTRY/{f=1} /END ARJE-MENUENTRY/{f=0; next} !f' "$CUSTOM" \
|
|
> "$CUSTOM.tmp" && mv "$CUSTOM.tmp" "$CUSTOM"
|
|
fi
|
|
|
|
cat >> "$CUSTOM" <<EOF
|
|
# BEGIN ARJE-MENUENTRY (generated by install-arje-as-init.sh)
|
|
menuentry "arje (init=/sbin/arje-zero) — kernel $KVER" {
|
|
insmod gzio
|
|
insmod part_msdos
|
|
insmod ext2
|
|
linux $VMLINUZ $ROOT_OPT rw init=/sbin/arje-zero console=ttyS0,115200 console=tty1 panic=10
|
|
initrd $INITRD
|
|
}
|
|
# END ARJE-MENUENTRY
|
|
EOF
|
|
chmod 0755 "$CUSTOM"
|
|
|
|
# Regenerar grub.cfg. Detectamos la convención de la distro: Debian /
|
|
# Ubuntu usan `update-grub` (wrapper de grub-mkconfig). Fedora / RHEL /
|
|
# CentOS usan `grub2-mkconfig` y el .cfg vive en /boot/grub2/ (BIOS) o
|
|
# /boot/efi/EFI/<distro>/ (UEFI). Arch usa `grub-mkconfig`.
|
|
if command -v update-grub >/dev/null 2>&1; then
|
|
echo " ejecutando update-grub (Debian/Ubuntu)"
|
|
update-grub
|
|
elif command -v grub2-mkconfig >/dev/null 2>&1; then
|
|
# Fedora / RHEL desde ~2021 unificaron en /boot/grub2/grub.cfg para
|
|
# BIOS y UEFI; el /boot/efi/EFI/<distro>/grub.cfg pasó a ser un wrapper
|
|
# que sourcea aquél y NO debe regenerarse — grub2-mkconfig protesta y
|
|
# se niega a sobreescribirlo. Apuntamos directo al canónico.
|
|
echo " ejecutando grub2-mkconfig -o /boot/grub2/grub.cfg (Fedora/RHEL)"
|
|
grub2-mkconfig -o /boot/grub2/grub.cfg
|
|
elif command -v grub-mkconfig >/dev/null 2>&1; then
|
|
echo " ejecutando grub-mkconfig (Arch/otros)"
|
|
grub-mkconfig -o /boot/grub/grub.cfg
|
|
else
|
|
echo "[install-arje] WARN: no encontré update-grub, grub2-mkconfig ni grub-mkconfig." >&2
|
|
echo " Regenerá la grub.cfg manualmente." >&2
|
|
fi
|
|
|
|
cat <<EOF
|
|
|
|
[install-arje] HECHO.
|
|
|
|
systemd sigue siendo tu init default — esta máquina arranca systemd
|
|
salvo que elijas explícitamente "arje" en GRUB.
|
|
|
|
- binarios: /usr/sbin/arje-* y /usr/bin/{brahman-status,busctl,brainctl}
|
|
- seed activa: /ente/seed.card.json (origen: $SEED)
|
|
- menuentry: /etc/grub.d/40_custom (regenerá grub.cfg si lo editás)
|
|
|
|
Para arrancar arje al próximo boot UNA SOLA VEZ (sin cambiar default):
|
|
|
|
sudo grub-reboot "arje (init=/sbin/arje-zero) — kernel $KVER"
|
|
sudo reboot
|
|
|
|
Para revertir (quita binarios + menuentry):
|
|
|
|
sudo scripts/uninstall-arje.sh
|
|
|
|
Antes del primer boot real, leé docs/arje-replace-systemd.md §3
|
|
("Servicios systemd que arje NO arranca") para que NO te quedes sin
|
|
red, sin sshd o sin filesystems montados.
|
|
EOF
|