English · Русский
Операционная система, у которой нет файловой системы и нет пользователей.
Вместо файлов — пространство неизменяемых объектов, адресуемых хэшем содержимого.
Вместо прав доступа — capability: неподделываемые ссылки, которые можно только сужать.
Вместо /etc и пакетного менеджера — конфиг на своём языке, который система вычисляет
сама и коммитит новым поколением, а откат — это перенос одного корня.
Микроядро на Rust, две архитектуры (riscv64 и x86_64) из одного дерева исходников, свой композитор и оболочка. Ядра Linux внутри нет — но неизменённые драйверы из ядра Linux 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 МиБ и выше система ведёт себя так же, как на машине владельца.
Единица хранения — неизменяемое значение, адресуемое BLAKE3-хэшем содержимого. Одинаковое содержимое лежит один раз. «Изменение» — новый объект плюс атомарный перенос именованного корня, поэтому история версий и откат бесплатны, как в git.
Ядро слова «файл» не знает вовсе. Каталоги, пути и open/read/write — это персоналия:
обычный userspace-сервер posixfs, переводящий POSIX в объекты. Захочется другая
семантика — рядом встанет другой сервер, ядро менять не нужно.
Посмотреть можно прямо в системе: roots показывает корни и их content-id.
Нет ни root, ни пользователей, ни chmod. Доступ к чему угодно — объекту, корню, эндпоинту
IPC, устройству, экрану — это неподделываемая ссылка с набором прав, которую можно только
сужать при передаче и отзывать. Compositor владеет фреймбуфером и не раздаёт его
окнам; панель получает право «видеть процессы» лишь потому, что владелец назвал её в
конфиге; выключить машину может тот, кому это право отдали.
Диспетчер задач показывает это буквально: у каждого процесса виден список его прав, и любое можно отобрать мышью — крестиком.
vvsh — маленький гомоиконный Lisp. Он и шелл (ls / и (+ 1 2) в одной строке, конвейеры
текут значениями, а не байтами), и язык конфига: система живёт в /etc/system/*.vv.
rebuild вычисляет их на самом VOID и коммитит новое поколение, gens их перечисляет,
switch откатывает. Хостовый Nix для этого не нужен — модель та же, фундамент свой.
Пакеты объявляются там же: want = ["nerd-fonts-fira-mono"] → rebuild → шрифт в PATH.
Откат системы откатывает и пакеты, потому что это один и тот же перенос корня.
С Вехи 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 без возврата | то, чего не хватает каждый день |
Свой мини-интернет на 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.


