Linux/400 es un experimento de sistema operativo estilo OS/400/IBM i sobre Linux. El proyecto modela bibliotecas, objetos tipados, perfiles, autorizaciones, jobs, spool, PF/LF, DTAQ, comandos y una TUI de pantalla verde encima de un runtime Rust, xattrs de filesystem, un loader eBPF LSM y herramientas de build/install.
La meta de Version 1 es una operacion basica AS/400-like: instalar, arrancar, administrar usuarios y objetos, ejecutar jobs, revisar spool, compilar CL/C, respaldar/restaurar y aplicar mantenimiento sin depender de una shell para el flujo normal.
Documentos principales:
| Documento | Contenido |
|---|---|
| docs/KERNEL.md | Vision general del proyecto, objetivo V1/V2, perfiles de plataforma y no-objetivos. |
| docs/PROJECT.md | Estado actual: features implementadas, faltantes y limitaciones por area. |
| docs/cheetsheet.md | Cheatsheet de comandos AS/400-style por rol: operador, administrador y programador. |
| docs/plan/implementation_plan.md | Plan por fases para llegar a Version 1. |
README por componente:
| Ruta | Contenido |
|---|---|
| libl400/README.md | Runtime central: objetos, xattrs, PF/LF/DTAQ, auth, jobs, spool, comandos y *SRVPGM. |
| l400-ebpf-common/README.md | Contrato no_std compartido entre userspace y eBPF; tipos de objeto validos. |
| l400-ebpf/README.md | Programa eBPF LSM, politica kernel, hooks y reglas de ejecucion. |
| l400-loader/README.md | Loader privilegiado, modos full/degraded/dev y diagnostico de enforcement. |
| cl_compiler/README.md | Compilador CL (clc) y alcance actual del lenguaje. |
| c400_compiler/README.md | Frontend C/400 (c400c) para catalogar programas nativos como *PGM. |
| os400-tui/README.md | TUI de pantalla verde: sign-on, menus, comandos, PDM/SEU/SQL, jobs y spool. |
| scripts/README.md | Build, instalacion, release gates, backup/restore, migracion y rescue. |
| examples/README.md | Ejemplos CL y flujos demo. |
| scratch/README.md | Area auxiliar para experimentos y artefactos temporales. |
Requisitos base para desarrollo userspace:
- Linux con soporte de xattrs de usuario;
- Rust/Cargo estable;
- toolchain C (
ccoclang); pkg-configy librerias necesarias por el host;rsync,tary utilidades core para scripts;- opcional: QEMU/OVMF para test de instalacion;
- opcional: BPF toolchain para compilar
l400-ebpf; - opcional: ZFS con
xattr=sapara perfil cercano afull.
Preparacion rapida:
git clone <repo> linux400
cd linux400
# Si el target Rust no esta instalado en tu host:
rustup target add x86_64-unknown-linux-gnu
# Directorios locales para desarrollo sin tocar /l400 real.
export L400_ROOT=/tmp/l400-dev
export L400_RUN_DIR=/tmp/l400-run
mkdir -p "$L400_ROOT" "$L400_RUN_DIR"Inicializar objetos base:
cargo run -p l400 --bin l400-bootstrap -- --quietNota: cargo build desde la raiz intenta incluir l400-ebpf y puede fallar si no esta instalado el toolchain BPF. Para desarrollo normal usa comandos por paquete.
Runtime y herramientas userspace:
cargo build -p l400
cargo build -p clc
cargo build -p c400c
cargo build -p os400-tui
cargo build -p l400-loaderCompilador CL:
cargo run -p clc -- --helpCompilador C/400:
cargo run -p c400c -- --helpeBPF, solo si el host tiene toolchain BPF:
cd l400-ebpf
cargo build --target bpfel-unknown-none --release
cd ..Userspace empaquetable:
./scripts/build/build_userspace.shDistribucion/ISO:
./scripts/build/build_distribution.shRelease candidate formal:
RUN_E2E_INSTALL=1 ./scripts/build/build_release_rc.shPara builds internos sin gate QEMU:
RUN_RC_GATE=0 ./scripts/build/build_release_rc.shTUI interactiva:
export L400_ROOT=/tmp/l400-dev
export L400_RUN_DIR=/tmp/l400-run
cargo run -p l400 --bin l400-bootstrap -- --quiet
cargo run -p os400-tuiComandos estilo AS/400 desde shell:
L400_ROOT=/tmp/l400-dev cargo run -p l400 --bin l400cmd -- WRKSYSSTS
L400_ROOT=/tmp/l400-dev cargo run -p l400 --bin l400cmd -- CRTLIB 'LIB(QGPL)'
L400_ROOT=/tmp/l400-dev cargo run -p l400 --bin l400cmd -- WRKOBJ 'LIB(QGPL)'Demo de objetos V1:
cargo run -p l400 --example objects_v1_demo -- /tmp/l400-demoDemo de workload interactivo/batch:
./scripts/test/test_workload_demo.shLoader eBPF por modo:
cargo run -p l400-loader -- --mode dev --once
cargo run -p l400-loader -- --mode degraded --once
cargo run -p l400-loader -- --mode full --oncefull requiere BPF LSM/BTF/permisos y artefacto eBPF disponible. dev y degraded son los modos esperados para desarrollo comun.
Gate rapido local:
cargo fmt --all --check
cargo test -p l400
cargo test -p clc
cargo test -p os400-tuiSmoke tests principales:
./scripts/test/test_objects_v1_demo.sh
./scripts/test/test_toolchain_v1_demo.sh
./scripts/test/test_workload_demo.sh
./scripts/test/test_loader_modes.sh
./scripts/test/test_l400_backup_restore.sh
./scripts/test/test_l400_upgrade_metadata.shGate de release:
./scripts/test/test_release_rc.sh
RUN_E2E_INSTALL=1 ./scripts/test/test_release_rc.shEl test QEMU de instalacion requiere host preparado con QEMU/OVMF y puede tardar mas que los gates locales.
El backend operativo por defecto para *FILE y *DTAQ es sled. BerkeleyDb queda como camino opt-in para builds con feature berkeleydb y L400_STORAGE_BACKEND=berkeleydb.
Para un sistema instalado, /l400 debe estar en storage persistente con xattrs. ZFS con xattr=sa es el perfil recomendado; ext4/xfs con xattrs de usuario son fallback para desarrollo o modo degradado.