LINUX.ORG.RU

Избранные сообщения vankadulapa

Кодек эффективней flac

 

Не появился кодек без потерь качества для аудио, который жмет лучше flac? Хотелось бы ужать свои 270Гб

Перемещено hobbit из desktop

bryak
()

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

 ,

  • Что в гайде

    • Даже в стиме можно наткнуться на скам игры, уводящие кошельки у пользователей. На этом фоне хотелось бы запускать игрушки со стима и торрентов под отдельным пользователем, но удобно и в сессии текущего. Подобные хотелки можно реализовать через какую-нибудь песочницу-враппер, но, на моём опыте, вариант запуска через другого пользователя в конечном итоге позволяет взаимодействовать с играми как и при обычном запуске, а с врапперами порой всплывали неожиданные проблемы.
    • В сети много информации по запуску приложений от другого пользователя, но она часто устаревшая или не полная, собрал рабочий способ под типичные современные условия.
    • Что надо:
      • Работа в 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
()