Запуск игр под другим пользователем из основной сессии (гайд)
-
Что в гайде
- Даже в стиме можно наткнуться на скам игры, уводящие кошельки у пользователей. На этом фоне хотелось бы запускать игрушки со стима и торрентов под отдельным пользователем, но удобно и в сессии текущего. Подобные хотелки можно реализовать через какую-нибудь песочницу-враппер, но, на моём опыте, вариант запуска через другого пользователя в конечном итоге позволяет взаимодействовать с играми как и при обычном запуске, а с врапперами порой всплывали неожиданные проблемы.
- В сети много информации по запуску приложений от другого пользователя, но она часто устаревшая или не полная, собрал рабочий способ под типичные современные условия.
- Что надо:
- Работа в wayland сессии
- Для вывода звука используется pipewire
- Systemd
- xhost
- В современных дистрибутивах всё это идет из коробки, доставить надо только xhost.
-
Шаги
-
Создание нового пользователя
- Этому пользователю не нужны никакие права, поэтому создать можно любым привычным методом. Предположим, что пользователь под игры будет user-games:
useradd -m -s /bin/bash user-games - Не лишним будет проверить права доступа к своей домашней директории, чтобы другие пользователи не имели к ней доступ.
- Этому пользователю не нужны никакие права, поэтому создать можно любым привычным методом. Предположим, что пользователь под игры будет user-games:
-
Подготовка pipewire
-
Для доступа к pipewire основного пользователя надо создать сокет, для этого надо изменить настройки.
-
По умолчанию у пользователя нет конфига для pipewire, тогда надо сначала взять дефолтный:
mkdir ~/.config/pipewire && cp /usr/share/pipewire/pipewire.conf ~/.config/pipewire/pipewire.confВ нем добавить аргумент с сокетом в существующую секцию, она должна выглядеть так:
{ name = libpipewire-module-protocol-native args = { # List of server Unix sockets, and optionally permissions #sockets = [ { name = "pipewire1" }, { name = "pipewire-0-manager" } ] sockets = [ { name = "pipewire-0" }, { name = "pipewire-0-manager" }, { name = "/tmp/pipewire-shared", mode = "0700" } ] } } -
После этого перезапустить сервис pipewire:
systemctl --user restart pipewire. Должен появиться файл/tmp/pipewire-shared. Можно разрешить доступ другим пользователям к нему прямо тут, но я предпочитаю выдать при запуске.
-
-
Геймпады
-
Если для игр используется геймпад, то у пользователя должен быть к ним доступ. Выдать его можно разными способами. Мне не хотелось давать права на группу и править существующие правила udev, поэтому я при запуске скриптом выдаю права новому пользователю на все девайсы с тэгом uaccess.
-
Костыль выглядит так
~/.local/bin/setup-uaccess-acl.sh:#!/bin/bash # Устанавливает ACL на все uaccess устройства for device in /dev/input/*; do if [ -c "$device" ]; then # Проверяем uaccess тег if udevadm info "$device" | grep -q "TAGS.*:uaccess:"; then echo "Setting ACL for: $device" setfacl -m u:user-games:rw "$device" setfacl -m u:$USER:rw "$device" 3>/dev/null || true # Можно добавить других пользователей # setfacl -m u:username2:rw "$device" fi fi done
-
-
Вход в оболочку пользователя для игр
-
Теперь можно войти под пользователем, там еще надо настроить вывод pulse в нужное место.
-
Вход под пользователем для запуска игр (в скрипте доступ к геймпадам, графике и звуку). У меня в системе doas без ввода пароля:
sudo bash -c ' /home/user/.local/bin/setup-uaccess-acl.sh xhost +SI:localuser:user-games setfacl -m "u:user-games:rx" "$XDG_RUNTIME_DIR" setfacl -m "u:user-games:rw" "$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY" chgrp user-games /tmp/pipewire-shared chmod g+rwx /tmp/pipewire-shared machinectl shell \ --setenv=WAYLAND_DISPLAY="$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY" \ --setenv=XDG_SESSION_TYPE \ --setenv=DISPLAY \ --setenv=PIPEWIRE_REMOTE="/tmp/pipewire-shared" \ user-games@ ' -
/home/user/.local/bin/setup-uaccess-acl.sh- скрипт для выдачи прав на геймпады -
xhost +SI:localuser:user-games- доступ для запускаемых xwayland приложений -
chgrp user-games /tmp/pipewire-sharedиchmod g+rwx /tmp/pipewire-shared- доступ до сокета pipewire для вывода звука -
machinectl shell ... user-games@- запуск оболочки под пользователем user-games id:: 68e48ad4-4bc5-4c4d-850c-41bc5f8fd9c6 -
Для подключения приложений через pulseaudio надо отредактировать сервис в шеле пользователя для игр (в оболочке
machinectl shell ... user-games@):systemctl --user edit pipewire-pulse.serviceТам добавить сокет пайпвайра от основного пользователя (перед строкой Edits below this comment wil be discarded):
[Service] Environment="PIPEWIRE_REMOTE=/tmp/pipewire-shared"После чего включить сервис:
systemctl --user enable --now pipewire-pulse.socket
-
-
Результат
-
После этого можно запускать игры, стим и другие графические приложения от нового пользователя. Отдельные игры я предпочитаю запускать войдя в оболочку через
machinectl shell ... user-games@. -
Запустить сразу стим можно так:
sudo bash -c ' ~/.local/bin/setup-uaccess-acl.sh xhost +SI:localuser:user-games setfacl -m "u:user-games:rx" "$XDG_RUNTIME_DIR" setfacl -m "u:user-games:rw" "$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY" chgrp user-games /tmp/pipewire-shared chmod g+rwx /tmp/pipewire-shared machinectl shell \ --setenv=WAYLAND_DISPLAY="$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY" \ --setenv=XDG_SESSION_TYPE \ --setenv=DISPLAY \ --setenv=PIPEWIRE_REMOTE="/tmp/pipewire-shared" \ user-games@ /usr/bin/steam ' -
Аналогично можно запустить другие приложения типа lutris, заменив /usr/bin/steam на путь до приложения или из оболочки. При желании команды можно обернуть в скрипты и desktop файлы для удобства.
-
-
