Skip to content
the-void-foxPublic

About

An operating system with no file system and no users

Topics

Resources

Stars

5 stars

Watchers

0 watching

Forks

Repository files navigation

VOID

English · Русский

Операционная система, у которой нет файловой системы и нет пользователей.

Вместо файлов — пространство неизменяемых объектов, адресуемых хэшем содержимого. Вместо прав доступа — capability: неподделываемые ссылки, которые можно только сужать. Вместо /etc и пакетного менеджера — конфиг на своём языке, который система вычисляет сама и коммитит новым поколением, а откат — это перенос одного корня.

Микроядро на Rust, две архитектуры (riscv64 и x86_64) из одного дерева исходников, свой композитор и оболочка. Ядра Linux внутри нет — но неизменённые драйверы из ядра Linux VOID умеет исполнять как обычные процессы.

Рабочий стол VOID: панель, файловый менеджер, терминал


Попробовать за пять минут

git clone <этот-репозиторий> && cd VOID
Code/tools/run.sh --build-only                               # собрать ядро
nix-shell shell.nix --run 'Code/boot/mkboot.sh'              # → Code/boot/void.iso (~88 МиБ)

qemu-system-x86_64 -machine q35 -m 1280M -smp 2 \
  -cdrom Code/boot/void.iso -boot d -accel kvm -cpu host

Готовый ISO выкладывается в Releases. Это живой образ: система поднимается прямо в оконный режим, работает целиком, а всё изменённое живёт до перезагрузки. Оставить насовсем — команда install (развернёт VOID на SATA-диск, NVMe или ФЛЕШКУ; носитель, размеченный не под VOID, система не трогает вовсе).

Первые пять минут:

Super+Return новое окно терминала
Super+H / Super+L между колонками · Super+Q — закрыть
fm · taskmgr · roots файлы · процессы и права · корни store
ls / ; (+ 1 2) ; ls | grep vv | count шелл: команды и Lisp в одной строке
gens · switch gen2 поколения системы и откат

Записать на флешку: sudo dd if=Code/boot/void.iso of=/dev/sdX bs=4M status=progress && sync (сотрёт её целиком — проверьте букву). BIOS в режиме AHCI; на некоторых ноутбуках для USB-клавиатуры нужен Legacy USB.

Минимальные требования — измеренные, а не обещанные

сколько чем проверено
память: живой ISO 112 МиБ на 96 МиБ ядро честно говорит «нет RAM под кучу» (образ едет в память целиком)
память: установленная 48 МиБ — сеанс, 96 МиБ — работать на 32 МиБ не поднимается композитор; на 96 МиБ файловый менеджер и второе окно живут
диск 128 МиБ установка на такой диск и загрузка с него проверены
процессор x86_64 с SSE2 (примерно с 2003 года), одного ядра достаточно все замеры сделаны на одном ядре; SMP включается, но не требуется
видео фреймбуфер, выставленный прошивкой (BIOS/VBE) своего драйвера дисплея нет — разрешение задаёт загрузчик

Числа — с QEMU (KVM, -smp 1) и снимками экрана как доказательством; это пол, а не рабочий запас. С 256 МиБ и выше система ведёт себя так же, как на машине владельца.


Что в ней необычного

1. Диск — это одно дерево значений, а не файловая система

Единица хранения — неизменяемое значение, адресуемое BLAKE3-хэшем содержимого. Одинаковое содержимое лежит один раз. «Изменение» — новый объект плюс атомарный перенос именованного корня, поэтому история версий и откат бесплатны, как в git.

Ядро слова «файл» не знает вовсе. Каталоги, пути и open/read/write — это персоналия: обычный userspace-сервер posixfs, переводящий POSIX в объекты. Захочется другая семантика — рядом встанет другой сервер, ядро менять не нужно.

Посмотреть можно прямо в системе: roots показывает корни и их content-id.

Диспетчер задач и корни store рядом

2. Прав доступа нет — есть capability

Нет ни root, ни пользователей, ни chmod. Доступ к чему угодно — объекту, корню, эндпоинту IPC, устройству, экрану — это неподделываемая ссылка с набором прав, которую можно только сужать при передаче и отзывать. Compositor владеет фреймбуфером и не раздаёт его окнам; панель получает право «видеть процессы» лишь потому, что владелец назвал её в конфиге; выключить машину может тот, кому это право отдали.

Диспетчер задач показывает это буквально: у каждого процесса виден список его прав, и любое можно отобрать мышью — крестиком.

Диспетчер задач: права процесса и выключатель сети

3. Система описана на том же языке, на котором в ней работают

vvsh — маленький гомоиконный Lisp. Он и шелл (ls / и (+ 1 2) в одной строке, конвейеры текут значениями, а не байтами), и язык конфига: система живёт в /etc/system/*.vv. rebuild вычисляет их на самом VOID и коммитит новое поколение, gens их перечисляет, switch откатывает. Хостовый Nix для этого не нужен — модель та же, фундамент свой.

Пакеты объявляются там же: want = ["nerd-fonts-fira-mono"] → rebuild → шрифт в PATH. Откат системы откатывает и пакеты, потому что это один и тот же перенос корня.

4. Драйверы Linux — как гости, а не как основа

С Вехи 51 драйвер может жить обычным процессом: регистры MMIO, DMA-память и прерывания раздаются capability. Поверх этого поднят шим Linux-API (lx_emul + рантайм Lx_kit), и неизменённые .c из ядра Linux компилируются и исполняются на VOID. Доказано на e1000: тот же e1000_hw.c/e1000_main.c из Linux 6.18 сбрасывает карту, строит кольца DMA, принимает пакеты по прерыванию и отвечает на ping.

Смысл не в e1000, а в дороге: длинный хвост железа не обязан быть переписан, чтобы система работала на настоящем ноутбуке.

С Вехи 195 гость подключён к системе целиком: картой системы может быть ПРОЦЕСС. Кадры хостируемого драйвера идут в обычный сетевой сервер, который об этом ничего не знает, а право «быть картой» — отдельного вида и выдаётся только тому, кому система сама отдала регистры этой карты. Проверено на неизменённом 8139too.c: DHCP берёт адрес, ping отвечает, имена разрешаются, файл скачивается по HTTP.


Что уже работает

Ядро. Микроядро (около шестидесяти системных вызовов): персистентный контент-адресуемый store с GC, capability с аттенуацией и отзывом, синхронный IPC с передачей прав, процессы и нити, ленивые кучи, futex, checkpoint процессов (заморозить вычисление, продолжить после перезагрузки), многоядерность (Веха 170: планировщик на всех ядрах машины).

Графика. Свой композитор: тайловая лента колонок и рабочие столы (модель niri), окна живут в общей памяти, анимации, захват указателя, уведомления, персистентные сеансы (перезагрузка возвращает окна на места). Свой векторный формат .vg и растеризатор, свой тулкит, тема из конфига.

Программы. Терминал, файловый менеджер (корзина, Delete), диспетчер задач (ЦП и память по процессам, права, выключатель сети), панель, лаунчер, редактор, просмотрщик картинок, просмотрщик корней store, pkg, klog, микробенчи, инструменты замера кадров.

Язык оболочки — русский или английский: строка ui("language", "en") в конфиге. Журнал ядра остаётся русским: его читает тот, кто чинит систему.

Железо. Загрузка через GRUB (multiboot2) на настоящей машине: фреймбуфер, PS/2, AHCI, NVMe, USB (xHCI: клавиатура и накопитель), e1000 и virtio-net, virtio-blk/rng, CMOS RTC, джиттер-энтропия. Проверено на ASUS X54C.

Ставить можно на любой из этих носителей, включая флешку: система тогда живёт на съёмном диске и переносится вместе с ним — то, ради чего проект и затевался. На машине без PS/2 (любой ноутбук новее ~2015) клавиатура работает по USB, включая аккорды оболочки.

Сеть. Свой стек в userspace (vendored smoltcp): DHCP, DNS, TCP/UDP, HTTPS-клиент на rustls — этим и качаются пакеты.

Совместимость. Порт Rust std (обычный cargo, таргеты *-unknown-void), настоящие uutils/coreutils, C-мир через кросс-gcc и void-libc (GNU hello, bzip2 по рецептам nixpkgs), WASI через wasmi. Персоналия Linux запускает неизменённые бинари nixpkgs, и на ней живёт настоящий sh: ветвление, execve, ожидание потомков, конвейеры и перенаправления (ls | wc -l, echo a > файл).

Nix на самом устройстве. Свой ленивый вычислитель языка (nixe) и своя песочница сборки (nixb): derivation { … } считается, задание кладётся в store, зависимости собираются раньше зависимых. Адреса совпадают с настоящим nix-instantiate байт в байт — а это и есть проверка, потому что путь в store не выбирают, его вычисляют из того, чем пакет будет собран. Хоста-посредника для этого не нужно.

Скорость

Замер на стенде разработки (QEMU q35, KVM, -cpu host, 2 ядра, Intel i5-9500). Числа получены командой bench в самой системе — их можно перепроверить.

Операция нс/оп
системный вызов (yield) 637
IPC туда-обратно между процессами 2 423
page fault (ленивая страница) 1 353
запуск программы: полный цикл exec 808 855

Быстрый IPC — это дизайн, а не оптимизация: синхронный rendezvous с прямой доставкой буфера вместо «два системных вызова на сторону плюс планировщик». На нём держится микроядерность: композитор, файловый сервер и сетевой стек — обычные процессы.


Чего пока нет

Список честный и полный настолько, насколько мы его знаем. Он здесь потому, что эти границы всё равно найдут, — лучше, если система назовёт их первой.

  • Звука нет вовсе — драйверов нет.
  • Ускорения графики нет: композитор рисует процессором в фреймбуфер. Нет vsync и нет второго буфера на окно — при быстром движении возможен разрыв кадра.
  • Wi-Fi нет. Проводная сеть — только e1000 и virtio-net; на другом чипе система честно скажет «нет драйверов», а не сделает вид.
  • Только BIOS/MBR. UEFI, GPT и NVMe не поддержаны; install стирает диск целиком.
  • Часовые пояса не поддержаны (всё UTC), ход часов не корректируется — NTP нет.
  • Прав у файлов нет (uid/gid/mode) — и не будет: в VOID нет ни пользователей, ни root, а доступ раздаётся правами-объектами. Симлинков своих тоже нет (они есть только в дереве пакетов). Файл целиком помещается в память персоналии: потолок сегодня 8 МиБ.
  • Пакет ИЗ NIXPKGS собрать нельзя. Свои деривации вычисляются и собираются, граф зависимостей обходится, но настоящему выражению из канала нужны import, <nixpkgs>, регулярки, fromJSON, фиксированные выходы с проверкой хэша и гигабайты памяти на само вычисление.
  • Безопасность не аудирована. Модель capability проверяется своей красной командой (Code/tools/redteam.py + зонд probe), но это не аудит.
  • Это не production-ОС и не претендует ею быть.

Куда это идёт

Версия здесь — вопрос, а не список возможностей: список растёт сам и никогда не кончается, а вопрос кончается ответом. Поэтому у каждой версии написано, при каком условии она считается сделанной.

версия вопрос сделана, когда что внутри
v0.1 ✅ оно вообще существует? выложено 09.09.2026 живой ISO, установка, оболочка, сеть, пакеты, Nix на устройстве
v0.2 «Своя машина» поднимется ли на чужом железе? доходит до оболочки на трёх машинах, две из них чужие NVMe, USB-накопители, тачпад, virtio-gpu, r8169/Wi-Fi, ACPI-батарея
v0.3 «Своя сеть» выйдешь ли туда, куда не пускают? трафик одной программы идёт в туннель, соседней — нет WireGuard, SOCKS5, Trojan/Shadowsocks, свой резолвер имён (заодно блокировка рекламы)
v0.4 «Свой софт» соберётся ли чужой пакет? собирается пакет из nixpkgs, а не своя деривация import, <nixpkgs>, регулярки, фиксированные выходы
v0.5 «Своя сеть людей» получится ли мини-интернет? десять машин поднимают свой интернет без единого сервера меш: сайты, раздачи, чаты, имена .void
v1.0 «Можно жить» заменяет ли она мой NixOS? неделя работы на VOID без возврата то, чего не хватает каждый день

Задумка, ради которой стоит смотреть дальше v1.0

Свой мини-интернет на 10–100 машин — свои сайты, свои раздачи, свои чаты и группы, свои имена .void, и ни одного сервера, который знает всё. Основа готова отдельным проектом (VoidConnect, ~13 000 строк), но на VOID он переезжает не портом, а частью системы — и это интереснее переноса:

  • чанк, адресуемый по хэшу, — это объект store. Своё хранилище кусков с дедупом и проверкой целостности исчезает вместе с целым слоем кода: раздавать файл и хранить файл здесь одно и то же действие;
  • имя .void — именованный корень над содержимым, ровно как поколения системы и пакеты;
  • доступ к сети людей — capability, а не правило файрвола. У программы либо есть ссылка на меш, либо нет; обойти это изнутри нечем.

Про приватность обещается ровно то, что достижимо: нет центра, который знает всё, содержимое закрыто сквозным шифрованием, а настоящая утечка — не имя, а адрес: через интернет его видит каждый, с кем соединился напрямую. Ответ на это — меш целиком внутри своего туннеля. Анонимности уровня Tor на полусотне машин не бывает, и обещать её мы не будем.

Планы целиком, с доводами и отброшенными вариантами, — в Obsidian/10-projects/void/ (notes/roadmap.md и adr/).


Собрать из исходников

Нужен nix-shell (QEMU, GRUB, mtools) и rustup-тулчейн из Code/rust-toolchain.toml. Клонировать без --recursive: подмодули vendor/ нужны только порту std и uutils, а система, ISO и всё, что видно на снимках, собираются без них (см. «Чужой код» ниже).

Code/tools/run.sh                    # собрать и запустить x86_64 с графикой (одной командой)
Code/tools/run.sh --riscv            # riscv64: текстовая консоль, графики там нет
Code/tools/run.sh --help             # все ключи: --fresh, --headless, --net, --script …

run.sh сам зайдёт в nix-shell, если нужных инструментов нет на PATH. Выход из QEMU — Ctrl-A, затем X. Диск один на обе архитектуры: напишите файл на одной, прочитайте на другой (bin/riscv64/* и bin/x86_64/* лежат в одном store бок о бок).

Проверки, которыми пользуемся сами:

Code/tools/run.sh --script Code/tools/soak-smp.txt вых/   # длинный отстой многоядерности
python3 Code/tools/redteam.py                             # красная команда: конфайнмент
python3 Code/tools/shot.py diff а.png б.png               # числа по снимкам экрана

Как устроен репозиторий

Code/
├── kernel/            микроядро: store, capability, IPC, процессы, планировщик, драйверы
│   └── src/arch/      контракт архитектур: riscv64 (SBI/PLIC/Sv39) · x86_64 (GDT/LAPIC/PCI/SMP)
├── programs/user/     userspace: композитор, панель, терминал, менеджеры, шелл, серверы
├── programs/lx-linux/ шимы linux/*.h, рантайм Lx_kit, неизменённые .c из ядра Linux
├── libs/              void-abi · void-store · vvsh-core (Lisp) · void-ui · void-vec
├── boot/              mkboot.sh (живой ISO) · mkdisk.sh (образ диска)
└── tools/             run.sh, screenrun.py, shot.py, redteam.py, void-store-import
nix/                   кросс-сборка пакетов под VOID (pkgsCross gcc+newlib)
Obsidian/              концепция, ADR, заметки вех, роадмап, честный список пробелов

Развёрнутая документация — Obsidian/10-projects/void/: архитектурные решения (ADR), заметка на каждую веху и notes/known-gaps.md.

Лицензия

GNU GPL версии 3 или позднее — полный текст в LICENSE.

Copyright (C) 2025-2026 voidfox

Копилефт выбран сознательно: делать с кодом можно что угодно, но производные обязаны оставаться открытыми и называть автора. Разрешительная лицензия (MIT, BSD) этого не требует — она позволяет закрыть исходник производной работы.

Чужой код: vendor/rust и vendor/coreutils — подмодули на upstream со своими лицензиями, Reference/ в репозиторий не входит, вкраплённые крейты перечислены в Code/programs/user/Cargo.toml с указанием, зачем каждый взят.

Оговорка про подмодули. Это ФОРКИ (ветка void), и их правки — порт std на VOID и порт uutils — сейчас живут только локально: в публичном репозитории лежат ссылки на upstream, где этих коммитов нет. Поэтому git submodule update --init не пройдёт, и это ожидаемо. Системы это не касается: ядро, оболочка, все программы со снимков и ISO собираются без подмодулей — они нужны только тем, кто хочет пересобрать std-программы и uutils.

About

An operating system with no file system and no users

Topics

Resources

Stars

5 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages