Геймпад не работает в Steam на Linux: диагностика, udev-права и Steam Input
В 90% случаев проблема сводится к одному: Linux видит геймпад, но Steam не имеет доступа к нужным устройствам (/dev/hidraw* и/или /dev/uinput), либо Steam Input конфликтует с «железным» вводом и даёт двойные нажатия/кривые оси. Ниже — короткий план проверки и точечные исправления.
Оглавление
Проверяем, видит ли Linux геймпад
- Сразу после подключения проверьте, что появилось в системе:
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
- Протестируйте ввод в обход Steam:
sudo evtest # проверка /dev/input/eventX
jstest /dev/input/js0 2>/dev/null || true
Если нет ни event*, ни js*, ни hidraw* — это не Steam: смотрите кабель/порт/BT, питание, модуль ядра, совместимость контроллера.
Быстрая таблица симптомов
| Симптом | Чаще всего причина | Что проверить |
|---|---|---|
| В Linux работает, в Steam — нет | Нет прав на hidraw | ls -l /dev/hidraw*, getfacl |
| В Steam меню работает, в игре — нет | Нет доступа к uinput | ls -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 (шаблон)
- Узнайте VID/PID:
lsusb
# или так, если знаете конкретный hidraw:
udevadm info --query=all --name=/dev/hidraw0 | grep -E 'ID_VENDOR_ID|ID_MODEL_ID'
- Создайте файл, например:
/etc/udev/rules.d/72-gamepad-hidraw-uaccess.rules
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="YYYY", MODE:="0660", GROUP="input", TAG+="uaccess"
- Примените:
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