gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 845Rust 56Shell 37Markdown 301232 Definiciones

⎇ 462e0275d3cc5ef13a495dfd13ecc34b87e9a883 scripts/disk-image.sh Shell · 53 líneas · 3.0 KB Historia crudo

Etapa B (B1+B2): boot desde disco real ext4, sin switch_root 462e0275d · sergio ·

1#!/bin/sh
2# disk-image.sh — Etapa B (imagen en disco real): empaqueta un rootfs como imagen ext4 booteable de
3# disco virtio (/dev/vda) en vez de initramfs. Con un kernel que trae VIRTIO_BLK+EXT4 built-in
4# (recipes/linux.toml), QEMU monta la imagen como root REAL y el kernel arranca con
5# `root=/dev/vda rw rdinit=/sbin/init` — sin initramfs, sin el wrapper /init+switch_root: `/` ya es un
6# mount ext4 pivotable (el muro pivot_root del path initramfs desaparece por construcción).
7#
8# `mke2fs -d <dir>` puebla la imagen DESDE un directorio sin montar nada y sin root (e2fsprogs >= 1.43).
9#
10# Uso:
11#   ./scripts/disk-image.sh                 # crea work/hammer-disk.img desde work/builder-rootfs
12#   BOOT=1 KERNEL=<bzImage> KVM=1 ./scripts/disk-image.sh   # además bootea y corre rebuild-stage1
13#
14# Variables:
15#   ROOTFS  dir rootfs a empaquetar      (default work/builder-rootfs, lo arma selfhost-verify)
16#   IMG     imagen de salida             (default work/hammer-disk.img)
17#   SIZE    tamaño de la imagen          (default 6G; el rootfs ronda ~2G + holgura para el rebuild)
18#   BOOT    1 ⇒ bootea con drive-rebuild.py tras crear la imagen
19#   KERNEL  bzImage con VIRTIO_BLK+EXT4  (requerido si BOOT=1)
20#   KVM/MEM/NET  passthrough a drive-rebuild.py
21set -eu
22ROOT="$(cd "$(dirname "$0")/.." && pwd)"
23cd "$ROOT"
24
25ROOTFS="${ROOTFS:-work/builder-rootfs}"
26IMG="${IMG:-work/hammer-disk.img}"
27SIZE="${SIZE:-6G}"
28
29[ -d "$ROOTFS" ] || { echo "no existe ROOTFS: $ROOTFS (corré selfhost-verify para armar el builder)" >&2; exit 1; }
30[ -x "$ROOTFS/sbin/init" ] || [ -L "$ROOTFS/sbin/init" ] || { echo "ROOTFS sin /sbin/init (arje-zero)" >&2; exit 1; }
31
32echo "==> rootfs : $ROOTFS ($(du -sh "$ROOTFS" | cut -f1))"
33echo "==> imagen : $IMG ($SIZE, ext4, label hammer-root)"
34rm -f "$IMG"
35# Ownership root en la imagen (igual que el `--owner=root:root` del cpio): el rebuild usa bwrap+overlay
36# con un userns que mapea 0→0; si los ficheros van con el uid del host (1000) el copy-up falla EACCES.
37# `unshare -r` mapea nuestro uid→0, así los ficheros uid-1000 se ven como root y mke2fs escribe uid 0
38# en la imagen — sin sudo. mke2fs -d puebla desde el dir sin montar. Fallback a mke2fs directo si no hay
39# unshare (la imagen quedaría uid-host: bootea y da shell, pero el rebuild fallaría en el copy-up).
40if command -v unshare >/dev/null 2>&1 && unshare -r true 2>/dev/null; then
41    unshare -r mke2fs -q -t ext4 -L hammer-root -d "$ROOTFS" "$IMG" "$SIZE"
42else
43    echo "   (sin unshare -r: imagen con uid del host; el rebuild in-VM podría fallar el copy-up)" >&2
44    mke2fs -q -t ext4 -L hammer-root -d "$ROOTFS" "$IMG" "$SIZE"
45fi
46echo "==> imagen creada: $(du -h "$IMG" | cut -f1)"
47
48if [ "${BOOT:-0}" = 1 ]; then
49    [ -n "${KERNEL:-}" ] || { echo "BOOT=1 requiere KERNEL=<bzImage con VIRTIO_BLK+EXT4>" >&2; exit 1; }
50    echo "==> booteando de disco (root=/dev/vda, sin initramfs ni switch_root)"
51    DISK="$IMG" KERNEL="$KERNEL" KVM="${KVM:-0}" MEM="${MEM:-6144}" NET="${NET:-1}" \
52        python3 scripts/drive-rebuild.py
53fi