Inicio rápido
Requisitos previos
- macOS en Apple Silicon, o Linux x86_64/aarch64 con acceso de lectura y escritura a
/dev/kvm. - Nix para instalar libkrun; Go y Task para compilar.
- Acceso a internet para descargar las imágenes OCI de los lenguajes (solo durante el build de la imagen; la VM del job no tiene red).
Windows no está soportado.
1. Instalar libkrun y libkrunfw
Vía Nix, en ambos sistemas (sin Homebrew ni Docker):
task krun:install # nix profile add .#krun
- macOS: libkrun 1.19.6 y libkrunfw 5.6.2, de derivaciones propias del repo (
nix/). La 1.ª vez compila libkrun (~10 min). - Linux: libkrun y libkrunfw de nixpkgs, con virtio-blk activado.
Las dos bibliotecas van a ~/.nix-profile/lib, donde rc las busca por defecto.
2. Compilar
task build
Genera en bin/:
rc: el host (CLI, API, build de imágenes, máquinas y el proceso de cada VM);rc-guest-linux-<arch>: el guest estático que se ejecuta dentro de la VM.
En macOS, el build firma rc con el entitlement com.apple.security.hypervisor. Sin él, krun_start_enter falla.
3. Verificar el host
./bin/rc doctor
Una línea por elemento: ok en platform, libkrun y guest, líneas info para lo que este host no ofrece (CUDA,
virtualización anidada, confinamiento en macOS) y una línea ok image <stack> por cada imagen construida. Una falla
aparece como FAIL <item> <motivo>.
4. Construir la imagen del lenguaje
task image:build -- --stack python
Descarga python:3.12-alpine, genera el ext4 de solo lectura con el guest y el warmup grabados, y lo guarda en la
caché. En la máquina medida, la imagen de Python tardó ~8–10 s. Un segundo build con las mismas entradas sale de la
caché. Para todos los lenguajes del catálogo: task image:build -- --all.
5. Ejecutar un job
./bin/rc run --stack python --code 'print(1)'
./bin/rc shell --stack python # shell interactivo en una VM nueva; desaparece con exit
Cada run arranca una VM nueva (arranque en frío), muestra la salida mientras el programa se ejecuta y destruye la
VM al final. El comando termina con rc 1 si el programa falla o excede el tiempo. Consulte run y shell.
6. Encender una máquina persistente
./bin/rc machine create --name demo --stack python
./bin/rc machine start --name demo
./bin/rc machine exec --name demo -- sh -c 'echo persistiu > /etc/minha-config'
./bin/rc machine stop --name demo
./bin/rc machine start --name demo
./bin/rc machine exec --name demo -- cat /etc/minha-config # persistiu
./bin/rc machine delete --name demo --force # sin --force, una máquina encendida se rechaza (INVALID_STATE)
Lo que se graba en / y en /workspace sobrevive al stop; /tmp vuelve vacío. Sin --net, la máquina no tiene
red. Consulte machine, runner.code y Red y volúmenes.
7. Levantar la API
task serve
Escucha en 127.0.0.1:8080 y mantiene un pool de 2 VMs listas por lenguaje con imagen construida.
En otra terminal:
curl -s http://127.0.0.1:8080/api/v1/run \
-H 'Content-Type: application/json' \
-d '{"language":"python","files":[{"name":"main.py","content":"print(input()[::-1])"}],"stdin":"abc"}'
{"status":"success","stdout":"cba\n","stderr":null,"exception":null,"executionTime":35}
El valor de executionTime varía en cada ejecución. La API no tiene autenticación: manténgala en loopback. Consulte
API HTTP y los SDKs.
8. Verificar todo de una vez
task runbook
Ejecuta docs/runbook.md de punta a punta y falla si algún paso sale distinto de lo esperado. En la última ronda
(24/10/2026, macOS 27), hubo 146 verificaciones y 0 fallas.