Linux-стек, где атомарный объект — не файл, а RFC 822 / MIME документ (.eml).
Один формат закрывает то, что в Linux размазано по десятку: сервисы, логи, пакеты,
IPC и конфигурацию. Надстройка — нечёткие клеточные автоматы и теория игр как
губернатор ресурсов.
«Everything is a file» → «everything is a message».
| Крейт | Роль | Что делает |
|---|---|---|
| emlcore | субстрат | RFC822-запись, SHA-256 hash-chain, append-only spool, парсер юнитов |
| emlinit | init / супервизор | юниты = .eml; рестарт-политики, зависимости, graceful shutdown, управление через .eml-шину |
| emllog | замена journald | tail / verify / grep / stats по хеш-цепочке событий |
| emlpkg | пакетный менеджер | пакет = один .eml; транзакционная установка + откат через дельты |
| emlfs | FUSE-ФС | монтирует каталог .eml как read-only ФС (raw/headers/body/payload.json) |
| emlca | губернатор ресурсов | нечёткий КА (диффузия нагрузки) + VCG/Shapley/Nash; решения — .eml |
| emlbus | pub/sub шина | сообщения = .eml; доставка по To: (entity/topic/*), consumed -> .done |
| emlnet | CRDT-меш | multi-writer LWW-репликация по TCP; op-id дедуп; сходимость за один обмен |
| emlsign | крипто-провенанс | ed25519-подпись .eml (headers+body), verify, пиннинг ключа |
| emlcron | планировщик | интервальные .eml-задачи; каждый запуск — событие в цепочке |
| emlwatch | inotify-мост | события ФС → поток .eml (CREATE/MODIFY/DELETE/...) |
| emlsec | секреты | AES-256-GCM в .eml; журнал доступа в цепочке |
| emlsnap | снапшоты | бэкап стора + hashed-манифест; verify/restore |
| emlctl | контроль-план | doctor / status / verify / up — единый фронт над стеком |
| emlsched | балансировщик | /proc/stat → нечёткий КА → congestion-game VCG; pin через sched_setaffinity |
| emlui | дашборд | интерактивный TUI (сырой терминал): список спулов, деталь, клавиши q/r/j/k |
Каждое событие/юнит — RFC822-документ. Совместим с EML-IPC (mime-os/docs/FORMAT.md):
From / To / X-EMLBox-Msg / Content-Type, имя файла <seq>.<id>.msg.eml.
emlbox ipc list <spool> и emlbox tagdb читают наши записи нативно.
Каждое событие несёт X-Emllog-Prev-Hash / X-Emllog-Hash — цепочку нельзя
подделать незаметно (emllog verify).
cargo build --release
BIN=target/release
# 1. init: запустить сервисы из .eml-юнитов
$BIN/emlinit list --units examples/units
$BIN/emlinit run --units examples/units --spool run/emlinit
# 2. управление через .eml-шину (из другого терминала)
$BIN/emlinit send --bus run/emlinit/control --event STOP
# 3. лог как проверяемая цепочка
$BIN/emllog --spool run/emlinit tail
$BIN/emllog --spool run/emlinit verify
# 4. пакет = .eml
$BIN/emlpkg build examples/units /tmp/p.eml --id demo --version 1.0.0
$BIN/emlpkg install /tmp/p.eml --root /tmp/root --log /tmp/pklog
$BIN/emlpkg rollback --root /tmp/root --log /tmp/pklog
# 5. FUSE
mkdir -p /tmp/mnt && $BIN/emlfs run/emlinit /tmp/mnt &
ls /tmp/mnt; cat /tmp/mnt/*/headers; fusermount3 -u /tmp/mnt
# 6. КА + теория игр
$BIN/emlca diffuse --cells "255,0,0,0,0,0,0,0" --decay 1 --steps 5
$BIN/emlca vcg --bids "10,7,3,2" --slots 2
$BIN/emlca shapley --players "A,B,C" --v "A=1,B=2,C=0,AB=5,AC=4,BC=3,ABC=9"
$BIN/emlca nash --candidates "10,1;6,6;1,10" --d "0,0"From: <[email protected]>
Subject: web server
X-Entity-ID: web
Content-Type: application/json
{"exec":["/usr/bin/webserver","-p","8080"],
"restart":"on-failure","restart_sec":1,"after":["network"]}
Сейчас на машине PID 1 — dinit. Готовый путь:
# запустить emlinit как супервизор под dinit (user-инстанс):
sh deploy/install-user-service.sh
dinitctl start emlinitПолная замена PID 1 (как отдельный init на базе emlcore+emlinit) требует
правки boot-конфигурации под root — см. deploy/.
cargo test # 43 tests: emlcore 10, emlca 5, emlsign 4, emlsec 4, emlsched 4, emlnet 3, emlwatch 3, emlbus 2, emlcron 2, emlsnap 2, emlctl 1, emlfs 1, emlui 2
Плюс e2e-сценарии: старт/exit-коды/рестарт/graceful shutdown, детект подмены
тела события (BROKEN at seq N), установка/откат пакета, живое FUSE-монтирование.
- eml-bus как общесистемная шина (замена dbus-части): подписка по
To:. - eml-net: multi-writer CRDT-синк (UUCP 2.0) — формат уже тот же.
- eml-udev: устройства как tagdb-сущности.
- CA-губернатор в планировщике: диффузия нагрузки по NUMA-решётке.
- Полная замена dinit/systemd: init = реплей загрузочной
.eml-цепочки.
# pub/sub: сообщения — .eml, доставка по To:
$BIN/emlbus pub --bus /tmp/bus --from a --to worker --event JOB --body '{"n":1}'
$BIN/emlbus list --bus /tmp/bus --to worker
$BIN/emlbus sub --bus /tmp/bus --to worker --once
# CRDT-меш (UUCP 2.0): два узла сходятся за один обмен
$BIN/emlnet put --store /tmp/a --writer A --key x --value 1
$BIN/emlnet serve --store /tmp/a --addr 127.0.0.1:9099 &
$BIN/emlnet sync --store /tmp/b --peer 127.0.0.1:9099
$BIN/emlnet get --store /tmp/bL5 game theory — VCG / Shapley / Nash (emlca)
L4 fuzzy CA — диффузия нагрузки, async tick (emlca)
L3 .eml сеть — CRDT multi-writer sync / TCP (emlnet)
L2 .eml шина — pub/sub, hash-chain лог (emlbus, emlinit, emllog)
L1 Linux — init / пакеты / FUSE-ФС (emlinit, emlpkg, emlfs)
L0 формат — RFC822 + SHA-256 цепочка (emlcore)
# ed25519: подписать и проверить любой .eml
$BIN/emlsign keygen --key node.key
$BIN/emlsign sign --key node.key --in msg.eml --out msg.signed.eml
$BIN/emlsign verify --in msg.signed.eml # OK
$BIN/emlsign verify --in msg.signed.eml --pub <HEX> # пиннинг подписанта
# расписание: задачи как .eml, каждый запуск — событие в цепочке
$BIN/emlcron list --jobs jobs/
$BIN/emlcron run --jobs jobs/ --spool run/cron
# наблюдение: inotify -> .eml
$BIN/emlwatch --dir ./watched --spool run/watch --mask create,modify,delete# секреты: AES-256-GCM в .eml, журнал доступа — в хеш-цепочке
$BIN/emlsec init --store vault/
$BIN/emlsec set --store vault/ --name db/password --value 'hunter2'
$BIN/emlsec get --store vault/ --name db/password
$BIN/emlsec log --store vault/
# снапшот: бэкап + hashed-манифест
$BIN/emlsnap create --src run/ --out snap/
$BIN/emlsnap verify --snap snap/
$BIN/emlsnap restore --snap snap/ --out restored/
# единый фронт: doctor / status / verify / up
$BIN/emlctl doctor
$BIN/emlctl status --root .
$BIN/emlctl up --root . --max-runtime 10emlctl up читает раскладку services/ (→ emlinit), jobs/ (→ emlcron),
watches/ (→ emlwatch) и поднимает весь стек одной командой.
# нагрузка ядер как нечёткое поле, размещение задач через congestion-game VCG
$BIN/emlsched sample --interval-ms 200
$BIN/emlsched plan --loads "255,0,0,40,200,0,0,0" --tasks 4
$BIN/emlsched daemon --spool run/sched --interval 1
$BIN/emlsched pin --pid 1234 --cpu 3
# дашборд по всем спулам (ANSI, без зависимостей)
$BIN/emlui --root . --once
$BIN/emlui --root . --interval 2 # живое обновлениеmake release
make demo ROOT=/tmp/eml-use # init + up(3s) + status
make tui ROOT=/tmp/eml-use # интерактивный дашборд (q/r/j/k)emlctl init разворачивает рабочую раскладку (services/ jobs/ watches/ vault/),
emlctl up поднимает компоненты по наличию каталогов, emlctl tui показывает
живой дашборд.
Проект зарегистрирован в SINT-слое: epistemic (VERIFIED), liquid (HYPOTHESIS),
resonance (res:0001), forest (tree 074ea12a), marketplace (signed listing),
historian (report), spec (RFC 5321 кэширован для будущего eml-mail).