LINUX.ORG.RU
ФорумGames

Запуск игр под другим пользователем из основной сессии (гайд)

 ,


7

1
  • Что в гайде

    • Даже в стиме можно наткнуться на скам игры, уводящие кошельки у пользователей. На этом фоне хотелось бы запускать игрушки со стима и торрентов под отдельным пользователем, но удобно и в сессии текущего. Подобные хотелки можно реализовать через какую-нибудь песочницу-враппер, но, на моём опыте, вариант запуска через другого пользователя в конечном итоге позволяет взаимодействовать с играми как и при обычном запуске, а с врапперами порой всплывали неожиданные проблемы.
    • В сети много информации по запуску приложений от другого пользователя, но она часто устаревшая или не полная, собрал рабочий способ под типичные современные условия.
    • Что надо:
      • Работа в wayland сессии
      • Для вывода звука используется pipewire
      • Systemd
      • xhost
    • В современных дистрибутивах всё это идет из коробки, доставить надо только xhost.
  • Шаги

    • Создание нового пользователя

      • Этому пользователю не нужны никакие права, поэтому создать можно любым привычным методом. Предположим, что пользователь под игры будет user-games:
        useradd -m -s /bin/bash 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 файлы для удобства.

★★★★★

Последнее исправление: altwazar (всего исправлений: 1)
Ответ на: комментарий от cobold

С ними есть нюансы. Порой приложения сами запускают сендбоксы и приходится решать неожиданные проблемы. Так же просто запустить в сендбоксе не достаточно, надо еще перекрыть способы его покинуть. Их использование не совсем тривиально с X11 приложениями, которые хотят доступ к dbus.

Метод с другим пользователем удобен тем, что один раз настроил и запускаешь потом любую новую игрушку как обычно. Дал доступ к звуку, к отрисовке, к геймпаду, а дальше всё работает как из под обычного пользователя и без неожиданных сюрпризов.

altwazar ★★★★★
() автор топика

Это очень крутой гайд. Но это чертовски много усилий ради эффекта, что можно добиться, просто заведя отдельного пользователя и заходя под ним, когда хочется поиграть в такие игры.

Да, при этом нельзя будет одновременно работать с ПО из-под иного – но я с трудом могу представить, как одновременно играть в игру и делать что-то ещё.

Vsevolod-linuxoid ★★★★★
()
Последнее исправление: Vsevolod-linuxoid (всего исправлений: 1)
Ответ на: комментарий от Vsevolod-linuxoid

что можно добиться, просто заведя отдельного пользователя и заходя под ним, когда хочется поиграть в такие игры

А если ещё завести отдельный пк с виндой для этого, то простота становится неописуемая.

mamina_radost
()
Ответ на: комментарий от Vsevolod-linuxoid

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

Тупо зайти под другим пользователем для - самый простой и надежный способ. Но для меня с ним слишком много мелких раздражителей:

  • Надо синхронизировать настройки между учетками, типа скорости мышки и хоткеев.

  • Во время игры хотелось бы иметь доступ к мессенджерам, почте, браузеру с учетками на сайтах.

  • Во время игры порой приходится что-то быстро глянуть по работе.

  • Надо будет находиться под другим юзером просто во время обновления игры или скачивания в стиме.

Поэтому пробовал разные подходы обойти эти шероховатости.

Стим во флатпаке имеет свои нюансы и не решает проблему с изоляцией сторонних игр.

С сэндбоксами часто приходится решать неожиданные проблемы, порой совсем не очевидные, типа сегфолтов. Так же там постоянно нюансы с работой сэндоксов внутри сэнбоксов (стим).

Порой бывают моды-приложения, которые надо запустить в том же окружении, что и оригинальную игру (префикс вайна/протона). Тут сэнбокс типа флатпака для стима добавляет еще один слой сложности.

Так пришел к решению запуска из под другого пользователя внутри основной сессии. Усилий там не так много, по сути просто запускаешь приложение с нужными переменными окружения и даёшь доступ к xwayland через xhost, к звуку через pipewire. Один раз настроил и забыл, работы минут на пять. Только готовых решений не было под wayland/pipewire.

altwazar ★★★★★
() автор топика
Ответ на: комментарий от CrX

Что только не придумают, лишь бы не юзать bwrap или firejail.

Да не надо тут это, вложенный сендбоксинг может образоваться когда не ждешь и все обломится. Зачем такие сложности.

James_Holden ★★★★★
()
Последнее исправление: James_Holden (всего исправлений: 1)
Ответ на: комментарий от TPPPbIHDELj

Для многих приложений в firejail есть преднастроенный профиль, в котором написано что можно, а что нельзя. Надо смотреть что там за случай и что в профиле написано по этому поводу. Ну и в firejail могут быть баги

cobold ★★★★★
()
Ответ на: комментарий от MoldAndLimeHoney

Добавляет это безопасности или это просто удобство дистрибуции?

Зависит от настроек изоляции для конкретного флатпака. Если не ошибаюсь, то, по дефолту, у стима и запущенных там игр во флатпаке нет доступа к другим файлам пользователя в хомяке.

Но стим во флатпаке - bwrap в bwrape, из-за чего вальве успели задолбать репортами флатпаковских проблем. Всё еще не плохой вариант, если используешь только стим. Таких пользователей много и за тебя там баг репортят и выпускают исправления.

altwazar ★★★★★
() автор топика
13 декабря 2025 г.

Добавил при запуске выдачу прав к «$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY». Без этого игры с выводом в wayland не работают, а это всё чаще становится полезным (поддержка HDR).

Еще заметил пару нюансов.

Для геймпадов dualsense нужен доступ к snd устройствам для работы его уникальных функций, а для edge еще и к остальным. Можно выдать скриптом на все устройства с uaccess доступ в /dev.

Steam input нормально не работает, не знаю в какую сторону копать, пока не понимаю механизм его работы. Права есть, он даже устройства создаёт, но будто бы стим не понимает, что игра запущена и для неё надо применить настройки.

Ингибитор idle работает как-то через dbus, из-за чего даже с gamemode при игре с геймпада могут срабатывать действия при отсутствии активности. Можно разрешить добавление ингибитора в systemd:

cat /etc/polkit-1/rules.d/10-allow-sleep-inhibit.rules
polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.login1.inhibit-block-sleep" &&
        subject.user == "user-games") {  // замените username
        return polkit.Result.YES;
    }
});

И запускать игру через systemd-inhibit --what=idle:sleep --who="My Manual Block" --why="Testing power management" --mode=block команда.

altwazar ★★★★★
() автор топика
Ответ на: комментарий от altwazar

Steam input нормально не работает, не знаю в какую сторону копать, пока не понимаю механизм его работы. Права есть, он даже устройства создаёт, но будто бы стим не понимает, что игра запущена и для неё надо применить настройки.

Оказывается дело не в запуске под другим пользователем, а при выводе в нативный вейленд не работает стим оверлей: https://github.com/ValveSoftware/steam-for-linux/issues/8020

altwazar ★★★★★
() автор топика
Ответ на: комментарий от papin-aziat

xhost - для запуска xwayland приложений $XDG_RUNTIME_DIR/$WAYLAND_DISPLAY - для запуска wayland приложений

Всё работает, кроме автоматических ингибиторов idle. Ну и хотелось бы динамическую выдачу прав на всякие геймпады для пользователя под игры, без выдачи групп audio/input и без udev правил под отдельные пады.

altwazar ★★★★★
() автор топика

Этому пользователю не нужны никакие права,

4.2

Ему нужен доступ на /dev/dri/render*.

Что надо:
xhost

Не надо. Достаточно дать доступ к текущему .Xauthority и выставить XAUTHORITY.

anonymous
()