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:
| Feature | runit | systemd |
|---|---|---|
| Lines of code | ~7,000 | ~1,400,000+ |
| Boot time | Under 5 seconds | 10–30 seconds |
| Memory usage | Minimal | Significant |
| Complexity | Simple scripts | Binary unit files |
| Transparency | Everything is readable | Often opaque |
| Supervision | Built-in, always on | Optional |
| Dependencies | None | D-Bus, udev, and more |
| Parallel startup | Yes | Yes |
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:
| systemd | runit |
|---|---|
systemctl start foo | sv start foo |
systemctl stop foo | sv stop foo |
systemctl restart foo | sv restart foo |
systemctl status foo | sv status foo |
systemctl enable foo | ln -s /etc/sv/foo /var/service/ |
systemctl disable foo | rm /var/service/foo |
systemctl list-units | sv status /var/service/* |
journalctl -u foo | cat /var/log/sv/foo/current |
systemctl poweroff | sudo poweroff |
systemctl reboot | sudo 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 делает одно дело и делает его хорошо. Сравнение:
| Возможность | runit | systemd |
|---|---|---|
| Строк кода | ~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, вот эквивалентные команды:
| systemd | runit |
|---|---|
systemctl start foo | sv start foo |
systemctl stop foo | sv stop foo |
systemctl restart foo | sv restart foo |
systemctl status foo | sv status foo |
systemctl enable foo | ln -s /etc/sv/foo /var/service/ |
systemctl disable foo | rm /var/service/foo |
systemctl list-units | sv status /var/service/* |
journalctl -u foo | cat /var/log/sv/foo/current |
systemctl poweroff | sudo poweroff |
systemctl reboot | sudo reboot |
Для более глубокой документации по runit см.: