Void Linux — один из немногих живых дистрибутивов без systemd. Вместо него здесь runit: набор маленьких супервизоров, которые запускают и перезапускают процессы. Пакетный менеджер XBPS, rolling-модель обновлений, glibc и musl-сборки, отсутствие обязательного D-Bus — всё это делает Void быстрым и предсказуемым, но требует понимания того, как устроен запуск служб. Ниже — практическая работа с системой от установки пакетов до собственного сервиса с логами.
Как устроен runit
runit развивает идеи daemontools и придерживается принципа «одна служба — один каталог». В /etc/sv лежат описания, в /var/service — символические ссылки на включённые. Демон runsvdir обходит /var/service и держит для каждой ссылки процесс runsv, который запускает скрипт run и перезапускает его при падении.
Зависимостей нет. Если службе нужна сеть, она должна сама дождаться её или проверить доступность в скрипте. Администратору, привыкшему к systemd, это покажется архаичным, но зато поведение системы полностью прозрачно: достаточно прочитать run, чтобы понять, что и как запускается.
Пакеты и обновления
XBPS не хранит базу в SQL: индекс — это набор файлов, которые синхронизируются командой с флагом -S. Обновление мира выглядит так:
sudo xbps-install -Syu
sudo xbps-install -Syu xbps
sudo xbps-install -S htop git
sudo xbps-remove -R htop
Вторая строка обновляет сам пакетный менеджер — это официальная рекомендация при проблемах с зависимостями. Флаг -R удаляет пакет вместе с ненужными зависимостями, -o — только осиротевшие пакеты.
Репозитории подключаются файлами в /etc/xbps.d. Например, для пакетов с несвободными лицензиями и 32-битных библиотек создайте файл с двумя строками repository= и адресами current/nonfree и current/multilib. После правки выполните sudo xbps-install -S, иначе индекс останется старым.
ls /etc/xbps.d
xbps-query -Rs '^firefox'
xbps-query -o /usr/bin/ssh
xbps-pkgdb -a
-o показывает, какому пакету принадлежит файл, -Rs ищет по индексу, а xbps-pkgdb -a проверяет целостность базы и метаданных. Раз в месяц эти три команды экономят часы догадок.
Службы: включить, выключить, проверить
Служба включается символической ссылкой. Никакого systemctl enable — только файловая операция, которую видно в списке процессов.
sudo ln -s /etc/sv/sshd /var/service/
sudo sv status sshd
sudo sv restart sshd
sudo rm /var/service/sshd
sv принимает команды up, down, restart, status, once. Статус run означает работу, down — ручную остановку, fail — падение. Если служба в fail, смотрите её лог: без него сообщение бесполезно.
Для списка служб удобен пакет vsv: он показывает дерево и позволяет включать и выключать сервисы без ручных ссылок. Установите его командой sudo xbps-install -S vsv.
Своя служба
Создайте каталог и скрипт run. Важно, чтобы процесс не уходил в фон: runit следит именно за тем процессом, который запустил, поэтому используется exec.
sudo mkdir -p /etc/sv/myapp
sudoedit /etc/sv/myapp/run
sudo chmod +x /etc/sv/myapp/run
sudo ln -s /etc/sv/myapp /var/service/
Минимальное содержимое файла:
#!/bin/sh
exec chpst -u app:app /opt/myapp/bin/server --port 8080
chpst -u сбрасывает права до указанного пользователя, exec заменяет оболочку процессом сервера. Если приложение умеет только демонизироваться, включите в его конфигурации режим переднего плана — иначе runit увидит завершение и будет перезапускать службу по кругу.
Логи
Вывод службы по умолчанию уходит в консоль и теряется. Штатное решение — отдельный log-сервис с svlogd, который пишет файлы и ротирует их.
sudo mkdir -p /etc/sv/myapp/log
sudoedit /etc/sv/myapp/log/run
sudo chmod +x /etc/sv/myapp/log/run
sudo tail -f /var/log/myapp/current
Скрипт log/run состоит из двух строк: #!/bin/sh и exec svlogd -tt /var/log/myapp. Каталог должен существовать заранее. Флаг -tt добавляет метку времени в формате TAI64N, которую потом удобно читать через tai64nlocal.
Сеть и время
В минимальной установке сеть поднимает dhcpcd, а Wi-Fi — wpa_supplicant. Обе службы включаются теми же ссылками. Если вы поставили NetworkManager, включайте только его, иначе два демона начнут перетягивать интерфейс.
sudo ln -s /etc/sv/dhcpcd /var/service/
sudo ln -s /etc/sv/wpa_supplicant /var/service/
sudo ln -s /etc/sv/chronyd /var/service/
ip -brief addr
Время важно не меньше сети: без синхронизации ломаются TLS-сертификаты и журналы получают неверные метки. chronyd в Void — штатный клиент, его запускают один раз и забывают.
Если служба не стартует
Причина почти всегда в самом скрипте: опечатка в пути, отсутствующий пользователь, неверные права. Запустите run вручную от root и посмотрите вывод — runit скрывает подробности, потому что пишет их в лог-сервис.
sudo /etc/sv/myapp/run
sudo sv once myapp
ls -l /var/service/myapp
sudo tail -n 50 /var/log/myapp/current
sv once запускает службу один раз без супервизора — удобно, чтобы увидеть ошибку старта. Если процесс сразу завершается с кодом 0, значит приложение демонизируется; переведите его в режим переднего плана, иначе runit будет считать службу упавшей.
Ядро и диагностика
Void использует dracut, а ядра приходят отдельными пакетами. После обновления ядра initramfs пересобирается автоматически; принудительно — командой xbps-reconfigure -f. Старые ядра удаляются через vkpurge, иначе /boot заполнится.
xbps-query -Rs '^linux[0-9]'
sudo xbps-reconfigure -f linux6.12
sudo vkpurge list
sudo vkpurge rm all
Подставьте установленную версию ядра: её показывает uname -r или список пакетов. vkpurge rm all удаляет все ядра, кроме текущего, — безопасно, но только после успешной загрузки и проверки оборудования.
sv status /var/service/*
dmesg --level=err,warn
sudo xbps-pkgdb -a
sudo xbps-remove -Oo
Последняя команда чистит кэш пакетов и удаляет осиротевшие зависимости. Для поиска проблем с железом начните с dmesg, для проблем со службами — с их логов в /var/log.
Кому подходит Void
- Тем, кто хочет минимальную систему без systemd и D-Bus.
- Пользователям старых машин: runit и лёгкие окружения дают экономию памяти.
- Администраторам, которым важен полный контроль над порядком запуска.
Не подойдёт тем, кто зависит от systemd-специфичных программ: некоторые корпоративные агенты и ПО с интеграцией в logind требуют systemd или обходных путей.
Итог
Void строится вокруг двух простых идей: пакеты ставятся через XBPS, а службы — это каталоги со скриптами. Поняв /etc/sv, /var/service и sv, вы получаете систему, где запуск прозрачен, а отладка сводится к чтению пары файлов. Начните с обновления XBPS, включите нужные службы ссылками и заведите log-сервисы — этого достаточно для повседневной работы.