LINUX.ORG.RU

Не срабатывает правило udev

 


0

1

Есть 3g модем

ID 12d1:14db Huawei Technologies Co., Ltd. E353/E3131

С недавнего времени отвалилось его переключение в режим модема. Когда делаю вручную

usb_modeswitch -v 12d1 -p 1f01 -J

(1f01 - это его device id в исходном режиме cdrom)

все переключается отлично. А через udev не срабатывает. В 40-usb_modeswitch.rules есть правила:

ATTRS{idVendor}==«12d1», ATTRS{manufacturer}!=«Android», ATTR{bInterfaceNumber}==«00», ATTR{bInterfaceClass}==«08», RUN+=«usb_modeswitch '%b/%k'»

и

ATTR{idVendor}==«12d1», ATTR{idProduct}==«1f01», RUN+=«usb_modeswitch '/%k'»

Вот это последнее правило я добавил вручную, первое было изначально.

Подскажите пожалуйста, что может быть не так.

★★★★★

Что за дистрибутив? Когда подключается модем, после полного запуска системы или он подключен во время запуска?

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

Дистрибутив Arch. Модем втыкается после того, как все уже загружено. В итоге определяется как cdrom, переключение не происходит. Месяц назад еще все было нормально. На соседнем компе с debian 9 все работает.

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

У меня было такое же на Gentoo, пришлось откатывать версию usb_modeswitch, но потом я вернулся на новую версию usb_modeswitch, а прописывал в файл настроек свою строку переключения.

Просто в новой версии usb_modeswitch поломали параметры переключения твоего модема.

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

В файле настроек modeswitch все правильно, когда я его вручную использую -с имя-файла, переключение работает. Вот что странно.

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

Попробую, и скорее всего это поможет, но хотелось бы понять, в чем дело. Почему вручную все работает - значит проблема не в modeswitch? Через udevadm test я не вижу, что применяется это правило udev. Не могу вот в этом разобраться.

curufinwe ★★★★★ ()
Последнее исправление: curufinwe (всего исправлений: 2)

Сделай udevadm test на файле устройства (или в /dev/bus/usb, или в /sys/bus/usb/devices) и запости вывод.

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

Твоё правило либо вообще не считалось, либо не заматчилось с устройством. В каком оно файле? Найди его в выводе. И да, reload udev'у сделал?

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

В файле

Reading rules file: /usr/lib/udev/rules.d/40-usb_modeswitch.rules

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

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

Почему вообще правило может не матчится? vendor id и device id совпадают. Может, другое правило как-то мешает?

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

Ты не на том устройстве тестируешь. Ты тестируешь на /dev/sr1 (эмулируемый SCSI-дисковод), а нужно на самом USB-устройстве.

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

Ах ё, то есть надо было прямо на устройстве, которое в /dev/bus/usb?

Кстати, дошел до чего. Пересмотрел вывод udevadm info, и заменил своем правиле ATTR на ATTRS. Теперь при тестировании, даже вот так на sr1, правило срабатывает. Но реально - все равно ничего не переключается. Если правило изменено, достаточно перезагрузки? Или надо командами заставлять перечитать?

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

Ах ё, то есть надо было прямо на устройстве, которое в /dev/bus/usb?

Да.

Или надо командами заставлять перечитать?

udevadm control --reload
intelfx ★★★★★ ()
Ответ на: комментарий от curufinwe

Но реально - все равно ничего не переключается. Если правило изменено, достаточно перезагрузки? Или надо командами заставлять перечитать?

Вдогонку: помимо того, что правила в udev нужно перечитывать вручную, тебе всё равно нужно писать правило для основного устройства, а не виртуального. Ты в своём правиле используешь %k — это kernel name устройства. Если писать правило для подустройства, в нём это самое kernel name будет другим, и usb_modeswitch скорее всего просто не поймёт, что с ним делать.

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

Вдогонку 2: а чем тебя не устроило то правило, которое было там изначально?

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

Я пробовал и без %k, просто прописав те ключи, которые вручную гарантированно работают. И ничего. Но да, я не перечитал правила, думал достаточно перезагрузки.

Если писать правило для подустройства, в нём это самое kernel name будет другим, и usb_modeswitch скорее всего просто не поймёт, что с ним делать.

В дефолтном правиле тоже %k, и как-то оно годами работало. Не понимаю как.

Можно как-то добуквенно получить ту команду, которую будет вызывать udev и проверить вручную?

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

Вдогонку 2: а чем тебя не устроило то правило, которое было там изначально?

Тем, что оно не срабатывает. Не только не переключает, но, насколько я понял, вообще не цепляется. Хотя раньше прекрасно все работало из коробки.

Чтобы мое второе правило цеплялось, я вроде добился - в udevadm test видно. Но не перечитал их.

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

В дефолтном правиле тоже %k, и как-то оно годами работало. Не понимаю как.

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

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

В выхлопе udevadm test, который я выкладывал, не видно чтобы матчилось и срабатывал RUN. Хотя вроде все правильно.

usb_modeswitch с параметрами device id и vendor id от этого cdrom, то есть с теми, которые и прописаны в моем правиле, работает 100% при запуске вручную.

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

Везде написано, что в RUN надо прописывать абсолютный путь. Я прописал

/usr/bin/usb_modeswitch -v 12d1 -p 1f01 -J

И все заработало.

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

%k в данном случае дает 'sr1' - и usb_modeswitch не может понять что с этим делать. Но во всех правилах написано именно так. Как то же это должно было работать?

curufinwe ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.