Vostok LinuxVostok Linux

runit

runit — The Init System of Vostok Linux

Vostok Linux uses runit as its init system — inherited directly from Void Linux. runit is a minimalist, fast, and transparent init and service supervision system. It is one of the key reasons why Vostok boots quickly, runs cleanly, and never hides what it's doing.

If you're coming from Ubuntu, Fedora, or any other systemd-based distribution — runit will feel different at first. But once you understand it, you'll appreciate how simple and predictable it is.


What is an Init System?

The init system is the first process that runs when your computer starts. Its job is to bring up all the services your system needs — networking, display manager, Bluetooth, audio — and to keep them running. If a service crashes, the init system restarts it.

On most modern Linux distributions, this is done by systemd. On Void Linux and Vostok, it's done by runit.


Why runit?

runit does one thing and does it well. Compare:

Featurerunitsystemd
Lines of code~7,000~1,400,000+
Boot timeUnder 5 seconds10–30 seconds
Memory usageMinimalSignificant
ComplexitySimple scriptsBinary unit files
TransparencyEverything is readableOften opaque
SupervisionBuilt-in, always onOptional
DependenciesNoneD-Bus, udev, and more
Parallel startupYesYes

With runit, every service is a directory containing simple shell scripts. You can read them, understand them, and modify them. Nothing is hidden in binary files.


How runit Works

runit has three stages:

  • Stage 1 — runs once at boot, sets up the system environment
  • Stage 2 — runs all services in /var/service/ continuously, supervising them
  • Stage 3 — runs once at shutdown, cleanly stops all services

Services live in /etc/sv/ and are enabled by symlinking them to /var/service/:

/etc/sv/          ← all available services
/var/service/     ← enabled (running) services

Managing Services

Check the Status of a Service

sv status NetworkManager

Check All Running Services

sv status /var/service/*

Start a Service

sudo sv start service-name

Stop a Service

sudo sv stop service-name

Restart a Service

sudo sv restart service-name

Reload a Service (send HUP signal)

sudo sv reload service-name

Enabling and Disabling Services

Enable a Service (start on every boot)

sudo ln -s /etc/sv/service-name /var/service/

Disable a Service (stop and remove from autostart)

sudo rm /var/service/service-name

Removing the symlink stops the service and prevents it from starting on next boot.


Listing All Available Services

ls /etc/sv/

Listing All Enabled Services

ls /var/service/

Default Services in Vostok

These services are enabled out of the box:

sv status /var/service/*

You will see:

  • NetworkManager — network connections
  • bluetoothd — Bluetooth
  • dbus — inter-process communication
  • elogind — session management
  • polkitd — privilege authorization
  • rtkit — realtime audio scheduling
  • sddm — login screen
  • udevd — hardware detection

Power Management

Shutdown the System

sudo poweroff

or:

sudo halt

Reboot the System

sudo reboot

Shutdown via runit directly

sudo runit-init 0

Reboot via runit directly

sudo runit-init 6

Service Logs

runit has a built-in logging system. Each service can have a log directory. Logs are stored in /var/log/sv/service-name/.

Check logs for a specific service:

cat /var/log/sv/service-name/current

Follow live logs:

tail -f /var/log/sv/NetworkManager/current

Writing a Custom Service

Every runit service is a directory in /etc/sv/ with a run script:

sudo mkdir /etc/sv/my-service

Create the run script:

sudo nano /etc/sv/my-service/run

Example run script:

#!/bin/sh
exec /usr/bin/my-program --option

Make it executable:

sudo chmod +x /etc/sv/my-service/run

Enable it:

sudo ln -s /etc/sv/my-service /var/service/

That's it. runit will start it immediately and restart it automatically if it crashes.


🔍 Diagnostics

Check if a service is running:

sv status service-name

Check why a service won't start (look at the run script):

cat /etc/sv/service-name/run

Run the service script manually to see errors:

sudo /etc/sv/service-name/run

Check service uptime (shown in sv status output):

sv status sddm

Example output:

run: /var/service/sddm: (pid 742) 1137s; run: log: (pid 739) 1137s

This means sddm has been running for 1137 seconds with PID 742.


⚠️ Common Issues

Service shows down but should be running

Check the run script for errors:

cat /etc/sv/service-name/run
sudo /etc/sv/service-name/run

Restart it:

sudo sv restart service-name

Service not found in /etc/sv/

The package providing the service may not be installed. Install it first:

sudo xbps-install -S package-name

Service keeps crashing and restarting

runit restarts crashed services automatically. If a service is crash-looping, check logs:

cat /var/log/sv/service-name/current

Or run the service manually to see the error output directly.


sv: warning: unable to open supervise/ok error

The service is not being supervised — the symlink in /var/service/ may be broken:

ls -la /var/service/service-name

Remove and re-add the symlink:

sudo rm /var/service/service-name
sudo ln -s /etc/sv/service-name /var/service/

runit vs systemctl — Quick Reference

If you're used to systemd, here's the equivalent commands:

systemdrunit
systemctl start foosv start foo
systemctl stop foosv stop foo
systemctl restart foosv restart foo
systemctl status foosv status foo
systemctl enable fooln -s /etc/sv/foo /var/service/
systemctl disable foorm /var/service/foo
systemctl list-unitssv status /var/service/*
journalctl -u foocat /var/log/sv/foo/current
systemctl poweroffsudo poweroff
systemctl rebootsudo reboot

For deeper runit documentation, see:

runit — Инициализационная система Vostok Linux

Vostok Linux использует runit в качестве init‑системы — унаследованной напрямую от Void Linux. runit — минималистичная, быстрая и прозрачная система инициализации и управления сервисами. Благодаря ней Vostok загружается быстро, работает стабильно и всегда ясно, что происходит в системе.

Если вы пришли с Ubuntu, Fedora или любого другого дистрибутива на systemd — runit поначалу покажется другим. Но как только вы его поймёте, оцените насколько он прост и предсказуем.


Что такое инициализационная система?

Init-система — первый процесс запускающийся при старте компьютера. Её задача — запустить все сервисы необходимые системе: сеть, менеджер дисплея, Bluetooth, звук — и поддерживать их работу. Если сервис падает, init-система его перезапускает.

В большинстве современных Linux дистрибутивов этим занимается systemd. В Void Linux и Vostok — runit.


Почему runit?

runit делает одно дело и делает его хорошо. Сравнение:

Возможностьrunitsystemd
Строк кода~7 000~1 400 000+
Время загрузкиМенее 5 секунд10–30 секунд
Потребление памятиМинимальноеЗначительное
СложностьПростые скриптыБинарные unit-файлы
ПрозрачностьВсё читаемоЧасто непрозрачно
СупервизияВстроенная, всегда включенаОпциональная
ЗависимостиНикакихD-Bus, udev и другие
Параллельный запускДаДа

В runit каждый сервис — это директория содержащая простые shell-скрипты. Вы можете их читать, понимать и изменять. Ничего не скрыто в бинарных файлах.


Как работает runit

runit имеет три стадии:

  • Стадия 1 — запускается один раз при загрузке, настраивает окружение системы
  • Стадия 2 — запускает все сервисы в /var/service/ непрерывно, наблюдая за ними
  • Стадия 3 — запускается один раз при выключении, чисто останавливает все сервисы

Сервисы живут в /etc/sv/ и включаются созданием симлинка в /var/service/:

/etc/sv/          ← все доступные сервисы
/var/service/     ← включённые (запущенные) сервисы

Управление сервисами

Проверить статус сервиса

sv status NetworkManager

Проверить все запущенные сервисы

sv status /var/service/*

Запустить сервис

sudo sv start имя-сервиса

Остановить сервис

sudo sv stop имя-сервиса

Перезапустить сервис

sudo sv restart имя-сервиса

Перезагрузить сервис (сигнал HUP)

sudo sv reload имя-сервиса

Включение и отключение сервисов

Включить сервис (запускать при каждой загрузке)

sudo ln -s /etc/sv/имя-сервиса /var/service/

Отключить сервис (остановить и убрать из автозапуска)

sudo rm /var/service/имя-сервиса

Удаление симлинка останавливает сервис и предотвращает его запуск при следующей загрузке.


Список всех доступных сервисов

ls /etc/sv/

Список всех включённых сервисов

ls /var/service/

Сервисы по умолчанию в Vostok

Эти сервисы включены из коробки:

sv status /var/service/*

Вы увидите:

  • NetworkManager — сетевые подключения
  • bluetoothd — Bluetooth
  • dbus — межпроцессное взаимодействие
  • elogind — управление сессиями
  • polkitd — авторизация привилегий
  • rtkit — планировщик реального времени для звука
  • sddm — экран входа
  • udevd — обнаружение оборудования

Управление питанием

Выключить систему

sudo poweroff

или:

sudo halt

Перезагрузить систему

sudo reboot

Выключение через runit напрямую

sudo runit-init 0

Перезагрузка через runit напрямую

sudo runit-init 6

Логи сервисов

В runit встроена система логирования. Каждый сервис может иметь директорию логов. Логи хранятся в /var/log/sv/имя-сервиса/.

Просмотр логов конкретного сервиса:

cat /var/log/sv/имя-сервиса/current

Следить за логами в реальном времени:

tail -f /var/log/sv/NetworkManager/current

Написание кастомного сервиса

Каждый runit сервис — директория в /etc/sv/ со скриптом run:

sudo mkdir /etc/sv/my-service

Создайте скрипт запуска:

sudo nano /etc/sv/my-service/run

Пример скрипта run:

#!/bin/sh
exec /usr/bin/my-program --option

Сделайте его исполняемым:

sudo chmod +x /etc/sv/my-service/run

Включите сервис:

sudo ln -s /etc/sv/my-service /var/service/

Всё. runit запустит его немедленно и будет автоматически перезапускать при падении.


🔍 Диагностика

Проверить запущен ли сервис:

sv status имя-сервиса

Проверить почему сервис не запускается (скрипт run):

cat /etc/sv/имя-сервиса/run

Запустить скрипт сервиса вручную чтобы увидеть ошибки:

sudo /etc/sv/имя-сервиса/run

Проверить время работы сервиса (в выводе sv status):

sv status sddm

Пример вывода:

run: /var/service/sddm: (pid 742) 1137s; run: log: (pid 739) 1137s

Это означает что sddm работает уже 1137 секунд с PID 742.


⚠️ Частые проблемы

Сервис показывает down но должен работать

Проверьте скрипт run на ошибки:

cat /etc/sv/имя-сервиса/run
sudo /etc/sv/имя-сервиса/run

Перезапустите:

sudo sv restart имя-сервиса

Сервис не найден в /etc/sv/

Возможно пакет предоставляющий сервис не установлен. Установите его:

sudo xbps-install -S имя-пакета

Сервис постоянно падает и перезапускается

runit автоматически перезапускает упавшие сервисы. Если сервис зациклился — проверьте логи:

cat /var/log/sv/имя-сервиса/current

Или запустите сервис вручную чтобы сразу увидеть вывод ошибок.


Ошибка sv: warning: unable to open supervise/ok

Сервис не находится под наблюдением — симлинк в /var/service/ может быть сломан:

ls -la /var/service/имя-сервиса

Удалите и добавьте симлинк заново:

sudo rm /var/service/имя-сервиса
sudo ln -s /etc/sv/имя-сервиса /var/service/

runit vs systemctl — Краткая справка

Если вы привыкли к systemd, вот эквивалентные команды:

systemdrunit
systemctl start foosv start foo
systemctl stop foosv stop foo
systemctl restart foosv restart foo
systemctl status foosv status foo
systemctl enable fooln -s /etc/sv/foo /var/service/
systemctl disable foorm /var/service/foo
systemctl list-unitssv status /var/service/*
journalctl -u foocat /var/log/sv/foo/current
systemctl poweroffsudo poweroff
systemctl rebootsudo reboot

Для более глубокой документации по runit см.: