reguły udev wydają się ignorowane; nie może uniemożliwić menedżerowi modemu przechwycenia urządzenia

17

Usiłuję zapobiec uruchomieniu menedżera modemów po podłączeniu telefonu komórkowego do portu USB.

Próbowałem dodać niestandardową regułę z udev, ale moje niestandardowe reguły wydają się ignorowane. Utworzyłem plik, /etc/udev/rules.d/99-mm-usb-device-blacklist.rulesktóry zawiera

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

A jednak, kiedy podłączam telefon i sprawdzam dmesg, otrzymuję to:

[ 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

Próbowałem również edytować, /lib/udev/rules.dev/77-mm-usb-device-blacklist.rulesale to też nie działało. czego mi brakuje? Jaki byłby pomocny krok w debugowaniu tego?

Aktualizacja: Uruchomienie udevadm info --export-dbpokazuje aktualizację reguły udev. Odpowiedni wynik to:

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

Dlatego menedżer modemu powinien ignorować urządzenie. A jednak mój komputer próbuje zainicjować połączenie sieciowe przez telefon za każdym razem, gdy podłączam go do portu USB. Czy istnieje inny program uruchamiany przez udev?

superdesk
źródło
1
Czy uruchomiłeś ModemManager - debug, aby sprawdzić, co robi z danym urządzeniem? Jestem również nieco zaskoczony, gdy nie zobaczyłem ID_MM_CANDIDATE = 1 w tym wpisie - być może jest to osobne urządzenie skanujące ścieżkę kodową w ModemManager, które nie przestrzega tego atrybutu?
kiko
@kiko, mam ten sam problem co autor pytania. ID_MM_CANDIDATEnie pojawia się na wyjściu urządzenia USB, ale w wyjściu bazy danych znajduje się osobny wpis dla urządzenia TTY, który ma zarówno ID_MM_CANDIDATE=1i ID_MM_DEVICE_IGNORE=1. Dzienniki debugowania Modem Manager pokazują, że rzeczywiście sonduje urządzenie.
Ian Mackinnon,

Odpowiedzi:

7

Chociaż może istnieć sposób, aby to zrobić udev, znalazłem znacznie prostsze działające rozwiązanie w tym pytaniu AskUbuntu .

Podsumowując, możesz powiedzieć Menedżerowi sieci, aby nie zarządzał niektórymi urządzeniami, dodając wiersz do pliku .conf.

Najpierw znajdź adres MAC swojego telefonu komórkowego. Uruchom dmesgz terminala po podłączeniu; jeden z wydruków powinien mieć mac. Linia była dla mnie:

[ 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

Następnie otwórz /etc/NetworkManager/NetworkManager.confz uprawnieniami superużytkowników i dodaj komputer Mac jako urządzenie niezarządzane. To jest moje NetworkManager.conf; Dodałem dwie ostatnie linie.

[main]
plugins=ifupdown,keyfile
dns=dnsmasq

[ifupdown]
managed=false

[keyfile]
unmanaged-devices=mac:de:1a:28:c7:db:e6
superdesk
źródło
6

Modem Manager można skonfigurować tak, aby używał innego zasad filtrowania , a znaczniki udev, takie jak ID_MM_DEVICE_IGNORE, nie mają wpływu na strictzasady filtrowania.

Możesz określić, które zasady Modem Manager używa w twoim systemie, wyświetlając jego status:

> 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

Pokazuje to również, że odpowiedni plik usługi to /lib/systemd/system/ModemManager.service. Możemy edytować ten plik na różne sposoby, aby wyłączyć sondowanie określonego urządzenia.

Aby użyć innej polityki, która będzie odwoływać się do reguł czarnej listy udev, możemy zmienić polecenie w usłudze:

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

Dostępne opcje to default(po prostu użyj reguł czarnej listy) lub paranoid(podobnie jak, strictale także użyj reguł czarnej listy). TheDokumentacja wspomina ten nie jest zalecany jako wsparcie dla czarnej listy reguł może być zastąpiony w przyszłości.

Inną opcją jest filtrowanie klasy urządzeń przy użyciu jednej z kilku zmiennych środowiskowych specyficznych dla TTY . Można to osiągnąć, dodając wiersz do [Service]sekcji pliku usługi. Na przykład, aby zabronić sondowania urządzeń ACM TTY:

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

Po zmianie pliku usługi załaduj ponownie systemctlkonfigurację i uruchom ponownie ModemManager:

sudo systemctl daemon-reload
sudo systemctl restart ModemManager

Do celów debugowania przydatne może być oglądanie dzienników menedżera modemu podczas podłączania urządzenia. Aby włączyć rejestrowanie debugowania, uruchom:

sudo mmcli -G DEBUG;

Aby obejrzeć komunikaty dziennika filtru, uruchom:

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

Teraz, kiedy podłączysz urządzenie, powinieneś zobaczyć linie takie jak:

# 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

Aby przywrócić rejestrowanie ModemManager do poprzedniego stanu, uruchom:

sudo mmcli -G ERR
Ian Mackinnon
źródło
Gdy czarna lista nie jest już używana, mamy podobne problemy z urządzeniami Arduino, które są ponownie badane przez MM. Kilka problemów na ten temat otworzyłem w MM upstream i Debian, patrz gitlab.freedesktop.org/mobile-broadband/ModemManager/issues/127 i bugs.debian.org/cgi-bin/bugreport.cgi?bug=930264
Matthijs Kooijman,
0

(tylko ze względu na naukę, ponieważ problem został już rozwiązany ...)

udev czyta / wykonuje swoje reguły w kolejności alfabetycznej [1].
Może to oznaczać, że twoje ustawienia powinny zostać zastąpione przez NetworkManager, co oznacza, że ​​twoja reguła jest bezużyteczna.

Jeśli zmienisz nazwę reguły od 99-na, 99999-czy ta zmiana pomoże ci?


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

mattia.b89
źródło
Miałem ten problem 5 lat temu i nie mam już żadnego sprzętu, z którym miałem problem. Wydaje mi się, że pamiętam bałagan z nazwami plików, ale nie pamiętam dokładnych okoliczności.
superdesk
0

To rozwiązanie pomoże mi dla ModemManager 1.10.0 (Ubuntu 18.04)
ModemManager -V

Możesz dowiedzieć się więcej: Typowe tagi udev

Utwórz plik /etc/udev/rules.d/49-stm32.rulesi dodaj to:

# 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"

Po zapisaniu pliku i uruchomieniu:
sudo udevadm control --reload-rules

i (może nie jest to konieczne):
sudo systemctl restart ModemManager.service

Po ponownym podłączeniu urządzenia USB (fizycznie wyciągnij go i podłącz do portu USB) i ciesz się.

Антон К
źródło