Перестали работать клавиатура и мышь в xorg-server-1.8 (настройка ввода через udev)

В связи с тем, что hal устарел и более не поддерживается, как только в xorg-server появился альтернативный модуль автонастройки устройств ввода udev, USE-флаг "hal" таинственным образом из xorg-server испарился (хотя в коде старый модуль всё ещё есть). Соответственно, все те настройки, которые вы с таким трудом сделали через hal, больше не работают. Ниже следуют инструкции как настроить xorg-server на работу с udev

Внимание! Ниже представлены инструкции по более тонкой настройке системы, нежели нужно в большинстве случаев. Прежде чем следовать этому руководству, используйте официальное (англ.) руководство

Для начала проверьте, что у вас включен флаг udev в xorg-server (он не глобальный). Если нет - добавьте и пересоберите xorg-server.

Некоторые основные отличия hal от udev:

  • Иксы пытаются подцепить все устройства которые определяются udev как потенциальный ввод, включая веб-камеры, кнопки питания и прочее. Это может вызвать (и вызывает) проблемы. Системных фильтров для отсечения ненужного на момент написания не присутствует (и, видимо, это и есть основная причина того, что xorg-server-1.8 отсутствует в дереве portage до сих пор). Для нужд фильтрации следует использовать новую секцию xorg.conf: InputClass.
  • udev поддерживает лишь минимальный набор параметров, которые можно передать в иксы, для более детальной настройки стоит использовать теже InputClass. Да, основная конфигурация опять в xorg.conf и без него у вас иксы уже не запустятся (вернее запустятся, но без ввода).

Итак, для начала следует определить в xorg.conf как минимум два InputClass'а, например, generic и garbage (секция InputClass подробно описана в man xorg.conf):

Section "InputClass"
        Identifier      "Generic Devices"
        Driver          "evdev"
        MatchTag        "generic"
EndSection

# А вот так настраиваются все прочие, специфичные устройства, для которых 
# возможностей настройки через udev не предусмотрено.
Section "InputClass"
        Identifier      "Synaptics Touchpad"
        Driver          "synaptics"
        Option          "VertTwoFingerScroll"   "true"
# ...
# тут еще куча всяких Option, см. man synaptics
# ...
        MatchTag        "synaptics"
EndSection

Section "InputClass"
        Identifier      "Garbage"
        MatchTag        "garbage"
        Option          "ignore"        "true"
EndSection

Теперь напишем новое правило для udev, которое будет назначать устройствам нужные тэги: /etc/udev/rules.d/75-x11-input.rules (лучше с названием не эксперементировать, поведение правил udev очень сильно зависит от порядка их обработки)

# Если обрабатываемое устройство, не из категории ввода - пропускаем
SUBSYSTEM!="input", GOTO="x11_input_end"
# Если устройство удалено (не было добавлено или изменено), то тут уже нечего делать
ACTION!="change|add", GOTO="x11_input_end"

# По умолчанию, мы игнорируем все устройства, выбирая потом только нужные
ENV{ID_INPUT.tags}="garbage"
# Работать мы будем только с /dev/input/event* устройствами. Да, это рассчитано на то,
# что Event Interface у вас в ядре включен.
KERNEL!="event*", GOTO="x11_input_end"

# По умолчанию используем драйвер evdev. Небольшая перестраховка, на самом деле.
ENV{driver}="evdev"

# Итак, пример реального правила: проверяем, что это клавиатура, что это именно
# AT-клавиатура, а не какая-нибудь веб-камера, которая почему-то считает, что у неё
# есть кнопки и гордо называет себя клавиатурой. Дальше идет стандартный набор настроек,
# которым, практически, возможности по "доводке" средствами udev и ограничиваются.
# В конце не забываем назначить тэг generic, ведь по умолчанию мы присвоили ему garbage
ENV{ID_INPUT_KEYBOARD}=="?*", ATTRS{name}=="AT Translated Set 2 keyboard", \
        ENV{xkblayout}="us,ru", \
        ENV{xkbvariant}=",winkeys", \
        ENV{xkboptions}="grp:caps_toggle,grp_led:caps,compose:rwin", \
ENV{ID_INPUT.tags}="generic"

# А вот так можно (нужно) настраивать устройства требующие особого ухода
ENV{ID_INPUT_TOUCHPAD}=="?*", ENV{ID_INPUT.tags}="synaptics"

# Теперь настроим мышку. К сожалению почти всё, что присутствует в компьютере
# норовит себя назвать если уж не клавиатурой, то хотя бы мышкой. Поэтому не забываем
# проверять идентификатор
ENV{ID_INPUT_MOUSE}=="?*", ENV{ID_INPUT_KEYBOARD}!="?*", \
        ATTRS{name}=="Logitech USB Receiver", ENV{ID_INPUT.tags}="generic"

LABEL="x11_input_end"

Теперь к тому, откуда брать параметры вроде ATTRS{name} или ENV{ID_INPUT_KEYBOARD} (в примерах eventX означает конкретное устройство, которое вы хотите проверить)

  • параметры, которые проверяются в ATTRS можно подглядеть в /sys/class/eventX/device/uevent (ну или вообще в любом uevent в дереве sysfs)
  • параметры, которые проверяются в ENV, проще всего посмотреть при помощи udevadm info --query=all --path=/class/input/eventX. То, что начинается с E: - и есть то, что вам нужно.

Как только вы закончите настройку правила udev, надо заставить его обработать заново все устройства. Это делается коммандой udevadm trigger (от суперпользователя). Проверить, что ваши настройки применились (т.е. вы не допустили нигде синтаксических или логических ошибок), можно при помощи вышеуказанной команды udevadm info --query=all --path=/class/input/eventX. Если в списке E:-параметров отсутствует ID_INPUT.tags - скорее всего, вы допустили синтаксическую ошибку и вам следует проверить системный лог на предмет ругани udevd.

Мрак. Как всегда все через

Мрак. Как всегда все через ***.

С уважением.
Пантер.

Не очень понимаю смысл пинать

Не очень понимаю смысл пинать udev... В xorg-sevrer 1.8 есть MatchIsTouchpad "on" для тачпадов, MatchIsKeyboard для клавиатур и MatchIsPointer для манипуляторов типа мышь.

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

савсем не понятно зачем

совсем не понятно зачем отсеивать утсройтва (обычно нужно отсеить определенные устройства (напримет пульт tv-тюнера), а остальные пусть xorg отрабатывает (старый с hal-ом так и делал, проблем небыло))
PS. без всего этого безобразия (типа garbage) все работает

Какбе... Цитата: Это может

Какбе...

Цитата:
Это может вызвать (и вызывает) проблемы.

Не вызывает - я рад за вас =). У меня иксы видят штук 15 устройств и парочка выдает ioctl ошибки, после чего иксы вываливаются

Черновик официального

Черновик официального руководства по обновлению

Текстовый редактор vi имеет два режима работы: в первом он пищит, а во втором — всё портит.

and

Соглашусь с некоторыми

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

И так. как всё это делается.
После уствновки у вас уже есть /etc/X11/xorg.conf.в/10-evdev.conf с которым, в принципе, всё работает.

Если кого-то напрягает, что xorg цепляет вами уже настроенные в других местах кнопочки вне устройства клавы (например, с помощью универсальных acpid и actkbd), то можно явно указать в InputClass, что цеплять, а что нет.
0. Запускаем startx -- :1 c дефолтным /etc/X11/xorg.conf.в/10-evdev.conf после того, как сервер полностью загрузился, его можно вырубать - нам нужны только логи. Убираем /etc/X11/xorg.conf.в/10-evdev.conf из этой диры, или переименовываем в 10-evdev чтоб не мешал в дальнейшем.
1. Смотрим $ grep "config/udev: Adding input device" /var/log/Xorg.1.log между выражением для грепа и скобочками вы увидите имена девайсов, с ними и будем работать (ну и с путями тоже).
2. Например, у нас две клавы Genius: ps/2 и usb, сделаннные измождёнными ручками китайских детей.

Section "InputClass"
        Identifier      "Keyboard"
        Driver  "evdev"
        Option  "AutoRepeat"    "500 30"
        Option  "XkbModel"      "acpi"
        Option  "XkbRules"      "xorg"

        Option  "XkbLayout"     "us(alt-intl),ru(winkeys)"
        Option  "XkbOptions"    "grp:menu_toggle,terminate:ctrl_alt_bksp"

        MatchIsKeyboard "true"
        MatchProduct    "AT Translated Set 2 keyboard|HID 04f3:0103"
EndSection

3. Также, например, у нас в ходу uvc-камера с кнопочкой и кнопка мощщи на системнике. хз, что с камерой делать, это вы уж сами как-нить нафантазируете, пока уберем, а кнопка питалова у нас обрабатывается acpid, так, что она в иксах нам и даром не нать.

Section "InputClass"
        Identifier      "Keyboard-ign"
        
        MatchIsKeyboard "true"
        MatchProduct    "Power Button|USB2.0_Camera"
        Option  "Ignore"        "true"
EndSection

4. Мышки. Их, например, тоже целых два щтука: 9 и 5-кнопочная. Настраиваем ту, что с большим количеством кнопок, вторая будет работать обычным образом, глюков не замечено:

Section "InputClass"
        Identifier      "Mouse"
        Driver  "evdev"
        Option  "Protocol"      "ExplorerPS/2"
        Option  "Emulate3Buttons"       "false"
        Option  "ZAxisMapping"  "4 5 6 7"
        Option  "Buttons"       "9"
        Option  "Resolution"    "800"

        MatchIsPointer  "true"
        MatchDevicePath "/dev/input/event*"
        MatchProduct    "ImExPS/2 Generic Explorer Mouse|Logitech USB Optical Mouse"
EndSection

5. Вот тут мойшет поджидать от ксорга ловушка - он цепляет всё, в итоге имеем:

[   748.368] (II) config/udev: Adding input device Logitech USB Optical Mouse (/dev/input/event5)
[   748.368] (II) config/udev: Adding input device Logitech USB Optical Mouse (/dev/input/mouse1)
[   748.735] (II) config/udev: Adding input device ImExPS/2 Generic Explorer Mouse (/dev/input/event3)
[   748.735] (II) config/udev: Adding input device ImExPS/2 Generic Explorer Mouse (/dev/input/mouse0)

Не кажется ли вам, что их многовато? Xorg'у они точно встали поперёк и свели его с ума: курсор (пока что один) прилип к левому краю экрана и шустро к нему полз если попытаться его отодрать. Решилось довольно тривиально:

Section "InputClass"
        Identifier      "Mouse-ign"
        MatchIsPointer  "true"
        MatchDevicePath "/dev/input/mouse*"
        Option  "Ignore"        "true"
EndSection

На этом пока всё.

:)

Добавлю от себя, столкнулся с

Добавлю от себя, столкнулся с проблемой при переходе на xorg-server-1.8 и udev. Сбились клавиши, хотя в конфигах прописано все верно. Например нажимаю стрелку вниз, а отрабатывает как двойное нажатие "стрелка вниз" + "enter", и так практически с каждой управляющей клавишей. То есть, если просмотреть вывод команды "xmodmap --pke", на каждую клавишу было по навешено несколько действий.
Решилось удалением левых драйверов, в моем случае:

x11-drivers/xf86-input-keyboard

т.к. использовал драйвер evdev, оставил только

x11-drivers/xf86-input-evdev

Цитата: Сбились клавиши, хотя

Цитата:
Сбились клавиши, хотя в конфигах прописано все верно. Например нажимаю стрелку вниз, а отрабатывает как двойное нажатие "стрелка вниз" + "enter", и так практически с каждой управляющей клавишей.

У меня на ноутбуке практически то же.
Решил добавив в ~/.xinitrc:

xinput float '<default keyboard>'
xinput float '<default pointer>'

Смотрим результат:

xinput list

Вот что у меня:

⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ HID 046a:0023                             id=13   [slave  pointer  (2)]
⎜   ↳ A4Tech PS/2+USB Mouse                     id=14   [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                id=16   [slave  pointer  (2)]
⎜   ↳ Wacom BambooFun 4x5 eraser                id=18   [slave  pointer  (2)]
⎜   ↳ Wacom BambooFun 4x5 cursor                id=19   [slave  pointer  (2)]
⎜   ↳ Wacom BambooFun 4x5 pad                   id=20   [slave  pointer  (2)]
⎜   ↳ Wacom BambooFun 4x5 stylus                id=21   [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=8    [slave  keyboard (3)]
    ↳ Video Bus                                 id=9    [slave  keyboard (3)]
    ↳ Sleep Button                              id=10   [slave  keyboard (3)]
    ↳ CNF7047                                   id=11   [slave  keyboard (3)]
    ↳ HID 046a:0023                             id=12   [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=15   [slave  keyboard (3)]
    ↳ HP WMI hotkeys                            id=17   [slave  keyboard (3)]
∼ <default pointer>                             id=6    [floating slave]
∼ <default keyboard>                            id=7    [floating slave]

Теперь уменя с вводом проблем не наблюдается, хотя устройств, как видите, много.

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".