Геймпад не работает в Steam на Linux: диагностика, udev-права и Steam Input

В 90% случаев проблема сводится к одному: Linux видит геймпад, но Steam не имеет доступа к нужным устройствам (/dev/hidraw* и/или /dev/uinput), либо Steam Input конфликтует с «железным» вводом и даёт двойные нажатия/кривые оси. Ниже — короткий план проверки и точечные исправления.

Оглавление

Проверяем, видит ли Linux геймпад

  1. Сразу после подключения проверьте, что появилось в системе:
sudo dmesg -T | tail -n 80
ls -l /dev/input/by-id/ | tail -n 50
ls -l /dev/input/event* /dev/input/js* /dev/hidraw* 2>/dev/null
  1. Протестируйте ввод в обход Steam:
sudo evtest          # проверка /dev/input/eventX
jstest /dev/input/js0 2>/dev/null || true

Если нет ни event*, ни js*, ни hidraw* — это не Steam: смотрите кабель/порт/BT, питание, модуль ядра, совместимость контроллера.

Быстрая таблица симптомов

СимптомЧаще всего причинаЧто проверить
В Linux работает, в Steam — нетНет прав на hidrawls -l /dev/hidraw*, getfacl
В Steam меню работает, в игре — нетНет доступа к uinputls -l /dev/uinput, `lsmod \
Двойной вводИгра читает «железо» + Steam Input делает виртуальный падНастройки Steam Input per-game
Неверные оси/триггерыНеподходящий режим Steam Input/SDL-маппингОтключить/включить Steam Input для игры

Steam Input и роль /dev/uinput

Steam часто общается с контроллером через hidraw, а затем создаёт виртуальный геймпад через uinput. Поэтому типичный сценарий поломки такой: в интерфейсе Steam геймпад реагирует, а в игре — тишина.

Проверьте:

ls -l /dev/uinput
lsmod | grep -E '^uinput' || echo "Модуль uinput не загружен"

Если модуля нет:

sudo modprobe uinput

Если в игре двойные нажатия или странные оси — попробуйте переключить Steam Input именно для этой игры (свойства игры → контроллер). Глобальная настройка и per-game настройка могут конфликтовать.

udev, uaccess (ACL) и нюансы Flatpak

Правильная цель: дать доступ активному пользователю к нужным устройствам без chmod 666. На systemd-системах это обычно делается через TAG+="uaccess" (ACL) и режим 0660.

Проверяем, выдались ли ACL-права

«Плюс» в правах означает ACL:

ls -l /dev/hidraw0 /dev/uinput 2>/dev/null
getfacl /dev/hidraw0 /dev/uinput 2>/dev/null || true

Точечное udev-правило для hidraw (шаблон)

  1. Узнайте VID/PID:
lsusb
# или так, если знаете конкретный hidraw:
udevadm info --query=all --name=/dev/hidraw0 | grep -E 'ID_VENDOR_ID|ID_MODEL_ID'
  1. Создайте файл, например: /etc/udev/rules.d/72-gamepad-hidraw-uaccess.rules
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="YYYY", MODE:="0660", GROUP="input", TAG+="uaccess"
  1. Примените:
sudo udevadm control --reload-rules
sudo udevadm trigger

Не делайте правило вида SUBSYSTEM=="hidraw", MODE="0666" «на всё». Это расширяет доступ ко всем HID-устройствам и ухудшает безопасность.

Если Steam установлен как Flatpak

Flatpak-песочница не заменяет системные udev-правила: доступ к hidraw/uinput всё равно определяется на хосте. Поэтому:

  • сначала добейтесь корректных прав/ACL на хосте (шаги выше),
  • затем перезапустите Steam и переподключите геймпад.

Частые ошибки

  • Геймпад не определяется нигде: нет устройств в /dev/input и /dev/hidraw → проверяйте кабель/BT, питание, логи dmesg, совместимость и модули ядра.
  • В evtest всё есть, Steam не видит: почти всегда права на hidraw → проверьте getfacl /dev/hidraw0, добавьте udev-правило с uaccess.
  • В Steam работает, в игре нет: нет доступа к /dev/uinput или модуль uinput не загружен → lsmod | grep uinput, modprobe uinput.
  • Двойной ввод: отключите Steam Input для игры или наоборот оставьте только Steam Input; не запускайте параллельно мапперы/эмуляторы ввода.
  • Оси/триггеры «кривые»: для рулей/HOTAS и нестандартных устройств чаще помогает отключение Steam Input для конкретной игры и настройка управления внутри игры.

FAQ

Нужно ли добавлять пользователя в группу input?
Это быстрый обходной путь, но обычно лучше точечные udev-правила + uaccess, чтобы не расширять доступ ко всем устройствам ввода.

Почему нельзя просто chmod 666 /dev/uinput?
Это небезопасно и неустойчиво: права сбросятся после переподключения/перезагрузки. Правильно — закреплять доступ через udev.

Что дать в диагностику, чтобы быстро найти причину?
Вывод команд:

lsusb
ls -l /dev/input/event* /dev/input/js* /dev/hidraw* /dev/uinput 2>/dev/null
getfacl /dev/hidraw0 /dev/uinput 2>/dev/null || true
lsmod | grep -E '^uinput' || true
sudo dmesg -T | tail -n 120