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/gpu, CMOS RTC, джиттер-энтропия. Проверено на ASUS X54C.

Звук. Свой драйвер Intel HDA и сервер-миксер: системный сигнал, проигрывание WAV (play), голос уведомлений. Несколько голосов разом, пересчёт частоты в сервере, вывод 48 кГц.

Wi-Fi. Свой драйвер Ralink RT5390 и свой WPA2: прошивка в карту, обход каналов, список сетей, рукопожатие, DHCP. Работает на живом ASUS X54C. Это один чип, а не «Wi-Fi вообще».

Ставить можно на любой из этих носителей, включая флешку: система тогда живёт на съёмном диске и переносится вместе с ним — то, ради чего проект и затевался. На машине без 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 с прямой доставкой буфера вместо «два системных вызова на сторону плюс планировщик». На нём держится микроядерность: композитор, файловый сервер и сетевой стек — обычные процессы.


Чего пока нет

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

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

Куда это идёт

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

версия вопрос сделана, когда что внутри
v0.1 ✅ оно вообще существует? выложено 09.09.2026 живой ISO, установка, оболочка, сеть, пакеты, Nix на устройстве
v0.2 «Своя машина» поднимется ли на чужом железе? доходит до оболочки на трёх машинах, две из них чужие сделано: NVMe, USB-накопители, virtio-gpu, Wi-Fi, звук. Осталось: UEFI/GPT, тачпад, ACPI-батарея, r8169
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. Подмодули vendor/ нужны только порту std и uutils, а система, ISO и всё, что видно на снимках, собираются без них — поэтому клонировать можно и без --recurse-submodules, так быстрее (см. «Чужой код» ниже).

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. С 18.10.2026 они лежат на GitHub — void-rust и void-coreutils, — и собрать всё может кто угодно:

git clone --recurse-submodules https://github.com/the-void-fox/VOID.git
# уже склонировали? тогда:  git submodule update --init --recursive

До этого URL подмодулей вёл на upstream, где наших коммитов нет, и git submodule update падал у всякого, кто не автор, — то есть пересобрать std-программы и uutils мог ровно один человек на одной машине. Самой системы это не касалось и не касается: ядро, оболочка, все программы со снимков и ISO собираются без подмодулей; они нужны только для std-программ и uutils.


подвал (!!! ВНИМАНИЕ ГРАМАТИКА ОТСУДСТВУЕТ)

Здраствуйте господа, я непосредствинный автор данного проекта снимаю перед вами шляпу. Я просто хочу сказать пару слов, Я использую ИИ для разработки проекта (никто не догодался) и если у вас с етим проблемы и вы топите за "ЧИСТЫЙ КОД НАПИСАНЫЙ ЧЕЛОВЕКОМ", вы знаите где дверь, проект не для вас. Также я его разрабатываю сугубо для себя, и может небольшой групы заинтерисованых лиц с такимиже взглядами как у меня. А и к слову я принципеально не испровлял свои ошибки потому что я так хочу, я дислексик и дизграфик, да будет так. Также хотел сказать про "вайбкод" и почему я не щитаю свой проект таковым, я стараюсь Понимать и Принимать архитектурные решения, Задавать вопроси и Держать всё в уме. В то время как "вайбкодеры" оставляют всё на ИИ. я всё же надеюсь что когда-то я доделаю данный проект до готового состояния, и несмотря что кажется всё ещё очень далека версия 1.0 я останавливатся не собираюсь. Спасибо вам за прочтение етой безграмотной фигни, помните, интернет с каждым днём становится менее свободным и единствиные кто етому может помешать ето пользователи. Да здраствует VOID

About

An operating system with no file system and no users

Topics

Resources

Stars

5 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages