Пользовательские сервисы OpenRC: инструкция по применению
Как я уже писал раньше, в систему инициализации OpenRC недавно добавлена возможность запускать сервисы в пользовательской сессии. В этой статье я покажу, как этим пользоваться, на примере pipewire
в Alpine Linux.
Что было раньше
Раньше в пакете с pipewire поставлялся (и до сих пор поставляется) скрипт /usr/libexec/pipewire-launcher
, который предлагалось прописывать в конфиге sway. Особенность этого сетапа в том, что после остановки Sway все запущенные им в background процессы оставались висеть в памяти, и перед последующим запуском их предлагалось прибивать с помощью pkill
. Не говоря уже про полное отсутствие логов, их не было.
Чтобы решить эти проблемы, нужно запускать pipewire в пользовательской сессии под супервизором. Собственно я так и делал при помощи s6, однако добавление пользовательских сервисов в OpenRC, а также соответствующих конфигов в пакеты в репозиториях Alpine позволяет отказаться от этих скриптов и пользоваться тем, что поддерживают мейнтейнеры дистрибутива.
Версии
Пользовательские сервисы были добавлены в OpenRC 0.60
. Версия в репозиториях Alpine Edge на данный момент - 0.60.1
. Используется pipewire 1.4.1
и wireplumber 0.5.8
.
Зависимости
Для поддержки пользовательских сервисов нужно установить пакет openrc-user
. Он содержит необходимые исполняемые файлы (openrc-user
и openrc-user-pam
), а также PAM-модуль pam_openrc.so
.
PAM
Есть два способа запуска пользовательской сессии OpenRC: как сервис
$ doas rc-service user.${USER} start
и через PAM.
Предпочтительным является второй способ. Для того чтобы им воспользоваться, нужно подключить соответствующий PAM-модуль стандартным способом:
$ cat /etc/pam.d/base-session
# ...
-session optional pam_rundir.so
session optional pam_openrc.so
Если $XDG_RUNTIME_DIR
не создается автоматически, то нужно об этом позаботиться. Для этого я применяю еще один модуль pam-rundir
(есть в репозиториях).
Перезагружаемся и проверяем, что пользовательская сессия работает:
$ rc-status --user
После этого можно запускать сервисы.
Запуск сервиса
В репозитории Alpine Linux уже начали добавлять файлы конфигурации пользовательских сервисов для разных пакетов, поэтому руками ничего писать не надо (если вы конечно не хотите запилить что-то свое кастомное):
$ rc-update --user add dbus default
Эта команда заставляет dbus
автоматически запускаться при старте пользовательской сессии, являясь аналогом systemctl --user enable dbus
. Симлинки на включенные сервисы располагаются в папке ~/.config/rc/runlevels
, а сами конфиги лежат в /etc/user/init.d
и /etc/user/conf.d
.
Переменные окружения
DBus относится к типу сервисов, которые должны устанавливать особую переменную окружения, в данном случае $DBUS_SESSION_BUS_ADDRESS
, для всех кто от них зависит. К таким зависящим относятся пользовательские сервисы и Sway. Раньше был только Sway, и подобная зависимость легко решалась тем что он запускался как потомок dbus-run-session
:
cat /usr/share/wayland-sessions/sway.desktop | grep dbus
Exec=dbus-run-session /usr/bin/sway
Однако сейчас такой фокус не пройдет, потому что пользовательские сервисы запускаются независимо от Sway. И больше того, в OpenRC пока нет механизма, позволяющего сервисам подтягивать переменные окружения из их зависимостей. PR создан, но пока не смержен, поэтому $DBUS_SESSION_BUS_ADDRESS
надо устанавливать вручную. Для этого предлагается использовать следующий кусок кода:
$ source /etc/user/conf.d/dbus
$ # в файле содержится вот такое:
$ cat /etc/user/conf.d/dbus
export DBUS_SESSION_BUS_ADDRESS="unix:path=$XDG_RUNTIME_DIR/bus"
Прописываем его перед запуском Sway, убрав там dbus-run-session
, а также в conf.d
всех релевантных пользовательских сервисов.
pipewire
Наконец, после всех этих манипуляций, можно запускать pipewire:
$ rc-update --user add pipewire default
$ rc-update --user add wireplumber default
$ rc-update --user add pipewire-pulse default
…работает! Для себя я сделал вывод, что несмотря на то что реализованы еще не все желаемые фичи, такой сетап уже вполне пригоден к использованию. На данный момент пользовательские сервисы добавлены для следующих пакетов в репозиториях Alpine:
- gnome-keyring
- kanshi
- pipewire
- wireplumber
- wlsunset
- dbus