правила udev кажутся проигнорированными; не может помешать диспетчеру модема захватить устройство

17

Я пытаюсь предотвратить запуск менеджера модема при подключении своего мобильного телефона к USB-порту.

Я пытался добавить пользовательское правило с помощью udev, но мои пользовательские правила, похоже, игнорируются. Я создал файл, /etc/udev/rules.d/99-mm-usb-device-blacklist.rulesкоторый содержит

# LG Phone
ATTRS{idVendor}=="1004", ENV{ID_MM_DEVICE_IGNORE}="1"

И все же, когда я подключаю телефон и проверяю dmesg, вот что я получаю:

[ 1809.761940] usb 3-1: new high-speed USB device number 11 using xhci_hcd
[ 1809.778662] usb 3-1: New USB device found, idVendor=1004, idProduct=61fc
[ 1809.778670] usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 1809.778674] usb 3-1: Product: B Project USB Device
[ 1809.778677] usb 3-1: Manufacturer: LG Electronics. Inc
[ 1809.778680] usb 3-1: SerialNumber: XXXXXXXXXXXXXXXXX
[ 1809.779501] cdc_acm 3-1:1.0: This device cannot do calls on its own. It is not a modem.
[ 1809.779584] cdc_acm 3-1:1.0: ttyACM0: USB ACM device
[ 1809.780899] cdc_ether 3-1:1.3 usb0: register 'cdc_ether' at usb-0000:00:14.0-1, CDC Ethernet Device, 6e:34:73:4f:68:4c
[ 1809.781454] scsi8 : usb-storage 3-1:1.5
[ 1809.807331] IPv6: ADDRCONF(NETDEV_UP): usb0: link is not ready
[ 1809.816566] IPv6: ADDRCONF(NETDEV_UP): usb0: link is not ready
[ 1809.816759] IPv6: ADDRCONF(NETDEV_UP): usb0: link is not ready

Я также пытался редактировать, /lib/udev/rules.dev/77-mm-usb-device-blacklist.rulesно это тоже не сработало. Чего мне не хватает? Что может быть полезным в отладке этого?

Обновление: Запуск udevadm info --export-dbпоказывает, что правило udev обновляется. Соответствующий вывод:

P: /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.7
N: bus/usb/002/012
E: BUSNUM=002
E: DEVNAME=/dev/bus/usb/002/012
E: DEVNUM=012
E: DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.7
E: DEVTYPE=usb_device
E: DRIVER=usb
E: ID_BUS=usb
E: ID_MM_DEVICE_IGNORE=1
E: ID_MODEL=B_Project_USB_Device
E: ID_MODEL_ENC=B\x20Project\x20USB\x20Device
E: ID_MODEL_ID=61fc
E: ID_REVISION=0216
E: ID_SERIAL=LG_Electronics._Inc_B_Project_USB_Device_XXXXXXXXXXXXX
E: ID_SERIAL_SHORT=XXXXXXXXXXXX
E: ID_USB_INTERFACES=:020201:0a0000:ffffff:020600:080650:
E: ID_VENDOR=LG_Electronics._Inc
E: ID_VENDOR_ENC=LG\x20Electronics.\x20Inc
E: ID_VENDOR_ID=1004
E: MAJOR=189
E: MINOR=139
E: PRODUCT=1004/61fc/216
E: SUBSYSTEM=usb
E: TYPE=239/2/1
E: UDEV_LOG=7
E: USEC_INITIALIZED=5987581808

Поэтому диспетчер модема должен игнорировать устройство. И все же мой компьютер пытается инициализировать сетевое подключение через мой телефон, когда я подключаю его к USB-порту. Есть ли другая программа, которую запускает udev?

superdesk
источник
1
Вы запускали ModemManager --debug, чтобы проверить, что он делал с данным устройством? Я также немного удивлен, что не вижу ID_MM_CANDIDATE = 1 в этой записи - возможно, это отдельные устройства сканирования кодового пути в ModemManager, который не учитывает этот атрибут?
Кико
@kiko, у меня та же проблема, что и у автора вопроса. ID_MM_CANDIDATEне отображается на выходе устройства USB, но есть отдельная запись в выводе базы данных для устройства TTY, и это имеет ID_MM_CANDIDATE=1и ID_MM_DEVICE_IGNORE=1. Журналы отладки диспетчера модема показывают, что он действительно проверяет устройство.
Ян Маккиннон

Ответы:

7

Хотя может быть способ сделать это udev, я нашел гораздо более простое рабочее решение в этом вопросе AskUbuntu .

Подводя итог, вы можете сказать Network Manager не управлять определенными устройствами, добавив строку в его файл .conf.

Сначала найдите mac адрес вашего мобильного телефона. Запустите dmesgиз терминала после его подключения; одна из распечаток должна иметь макинтош. Линия для меня была:

[ 4691.112016] cdc_ether 3-1:1.3 usb0: register 'cdc_ether' at usb-0000:00:14.0-1, CDC Ethernet Device, de:1a:28:c7:db:e6

Затем откройте /etc/NetworkManager/NetworkManager.confс правами суперпользователя и добавьте Mac своего телефона в качестве неуправляемого устройства. Это мое NetworkManager.conf; Я добавил последние две строки.

[main]
plugins=ifupdown,keyfile
dns=dnsmasq

[ifupdown]
managed=false

[keyfile]
unmanaged-devices=mac:de:1a:28:c7:db:e6
superdesk
источник
6

Диспетчер модема может быть настроен на использование различных политик фильтра , и такие теги udev, как ID_MM_DEVICE_IGNOREони, не действуют под strictполитикой фильтра.

Вы можете определить, какую политику Modem Manager использует в вашей системе, просмотрев ее статус:

> sudo systemctl status ModemManager
● ModemManager.service - Modem Manager
   Loaded: loaded (/lib/systemd/system/ModemManager.service...
   Active: active (running) since ...
   ...
   CGroup: /system.slice/ModemManager.service
           └─644 /usr/sbin/ModemManager --filter-policy=strict

Это также показывает, что соответствующий файл службы /lib/systemd/system/ModemManager.service. Мы можем редактировать этот файл различными способами, чтобы отключить проверку конкретного устройства.

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

ExecStart=/usr/sbin/ModemManager --filter-policy=default

Варианты default(просто используйте правила черного списка) или paranoid(например, strictно также и правила черного списка). В документации упоминается, что это не рекомендуется, так как поддержка правил черного списка может быть в будущем устарела.

Другой вариант - отфильтровать класс устройств, используя одну из нескольких переменных среды, специфичных для TTY . Этого можно достичь, добавив строку в [Service]раздел служебного файла. Например, чтобы запретить проверку устройств ACM TTY:

[Service]
...
Environment="MM_FILTER_RULE_TTY_ACM_INTERFACE=0"

После изменения служебного файла перезагрузите systemctlконфигурацию и перезапустите ModemManager:

sudo systemctl daemon-reload
sudo systemctl restart ModemManager

В целях отладки может быть полезно просматривать журналы модем-менеджера при подключении вашего устройства. Чтобы включить ведение журнала отладки, выполните:

sudo mmcli -G DEBUG;

Чтобы просмотреть сообщения журнала фильтра, запустите:

journalctl -f | grep "ModemManager.*\[filter\]"

Теперь, когда вы подключаете свое устройство, вы должны увидеть строки вроде:

# Device allowed with strict filter policy
[filter] (tty/...): port allowed:... 

# Device filtered with default filter policy and udev tags
[filter] (tty/...): port filtered: device is blacklisted

# Device filtered with strict filter policy and environment variables
[filter] (tty/...) port filtered: forbidden

Чтобы вернуть ведение журнала ModemManager в прежнее состояние, выполните:

sudo mmcli -G ERR
Ян Маккиннон
источник
Хотя черный список больше не используется, у нас были похожие проблемы с устройствами Arduino, которые снова проверяются MM. Я открыл некоторые вопросы по этому поводу в MM upstream и Debian, см. Gitlab.freedesktop.org/mobile-broadband/ModemManager/issues/127 и bugs.debian.org/cgi-bin/bugreport.cgi?bug=930264
Маттис
0

(просто ради науки, так как вы уже решили свою проблему ...)

udev читает / выполняет свои правила в алфавитном порядке [1].
Это может означать, что ваши настройки должны быть перезаписаны на NetworkManager, это ваше правило бесполезно.

Если вы переименуете свое правило 99-в 99999-, поможет ли это изменение?


[1] /unix/204979/why-do-the-rules-in-udev-rules-d-have-numbers-in-front-of-them

mattia.b89
источник
У меня была эта проблема 5 лет назад, и у меня больше нет оборудования, с которым я столкнулся. Кажется, я вспоминаю, как возился с именами файлов, но не могу вспомнить точные обстоятельства.
Superdesk
0

Это решение поможет мне для ModemManager 1.10.0 (Ubuntu 18.04)
ModemManager -V

Вы можете узнать больше: общие теги udev

Создайте файл /etc/udev/rules.d/49-stm32.rulesи добавьте это:

# 0483:5740 - STM32 in USB Serial Mode (CN5)
ATTRS{idVendor}=="0483", ATTRS{idProduct}=="5740", ENV{ID_MM_DEVICE_IGNORE}="1"
ATTRS{idVendor}=="0483", ATTRS{idProduct}=="5740", ENV{ID_MM_TTY_BLACKLIST}="1"
ATTRS{idVendor}=="0483", ATTRS{idProduct}=="5740", ENV{MTP_NO_PROBE}="1"
ATTRS{idVendor}=="0483", ATTRS{idProduct}=="5740", ENV{ID_MM_PORT_IGNORE}="1"
ATTRS{idVendor}=="0483", ATTRS{idProduct}=="5740", ENV{ID_MM_TTY_MANUAL_SCAN_ONLY}="1"

После сохранения файла и запуска:
sudo udevadm control --reload-rules

и (может быть, это и не нужно):
sudo systemctl restart ModemManager.service

После повторного подключения устройства USB (физически вытащите и вставьте его в порт USB) и наслаждайтесь.

Антон К
источник