regras do udev parecem ignoradas; não pode impedir que o gerenciador de modem agarre o dispositivo

17

Estou tentando impedir que o gerenciador de modem seja executado quando conecto meu telefone celular a uma porta USB.

Tentei adicionar uma regra personalizada ao udev, mas minhas regras personalizadas parecem ignoradas. Eu criei um arquivo /etc/udev/rules.d/99-mm-usb-device-blacklist.rulesque contém

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

No entanto, quando ligo o telefone e verifico o dmesg, é isso que recebo:

[ 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

Eu também tentei editar, /lib/udev/rules.dev/77-mm-usb-device-blacklist.rulesmas isso também não funcionou. o que estou perdendo? O que seria uma etapa útil na depuração disso?

Atualização: A execução udevadm info --export-dbmostra que a regra do udev está sendo atualizada. A saída relevante é:

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

Portanto, o gerenciador de modem deve estar ignorando o dispositivo. E, no entanto, meu computador continua tentando inicializar uma conexão de rede através do meu telefone sempre que eu o conecto à porta USB. Existe outro programa que o udev está iniciando?

superdesk
fonte
11
Você executou o ModemManager --debug para verificar o que estava fazendo com o dispositivo em questão? Também estou um pouco surpreso por não ver ID_MM_CANDIDATE = 1 nessa entrada - talvez este seja um dispositivo de verificação de caminho de código separado no ModemManager que não respeite esse atributo?
Kiko #
@kiko, tenho o mesmo problema que o autor da pergunta. ID_MM_CANDIDATEnão aparece na saída do dispositivo USB, mas há uma entrada separada na saída do banco de dados para o dispositivo TTY, e possui ambos ID_MM_CANDIDATE=1e ID_MM_DEVICE_IGNORE=1. Os logs de depuração do Modem Manager mostram que realmente está investigando o dispositivo.
Ian Mackinnon

Respostas:

7

Embora possa haver uma maneira de fazer isso udev, encontrei uma solução de trabalho muito mais simples nessa pergunta do AskUbuntu .

Para resumir, você pode dizer ao Network Manager para não gerenciar determinados dispositivos, adicionando uma linha ao arquivo .conf.

Primeiro, encontre o endereço mac do seu telefone celular. Execute a dmesgpartir do terminal depois de conectá-lo; uma das impressões deve ter o mac. A linha para mim foi:

[ 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

Em seguida, abra /etc/NetworkManager/NetworkManager.confcom privilégios de superusuário e adicione o mac do seu telefone como um dispositivo não gerenciado. Este é meu NetworkManager.conf; Eu adicionei as duas últimas linhas.

[main]
plugins=ifupdown,keyfile
dns=dnsmasq

[ifupdown]
managed=false

[keyfile]
unmanaged-devices=mac:de:1a:28:c7:db:e6
superdesk
fonte
6

O Modem Manager pode ser configurado para usar políticas de filtro diferentes , e as tags udev como ID_MM_DEVICE_IGNOREnão têm efeito na strictpolítica de filtro.

Você pode determinar qual política o Modem Manager está usando no seu sistema exibindo seu 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

Isso também mostra que o arquivo de serviço relevante é /lib/systemd/system/ModemManager.service. Podemos editar este arquivo de diferentes maneiras para desativar a análise de um dispositivo específico.

Para usar uma política diferente que se refira às regras da lista negra do udev, podemos alterar o comando no serviço:

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

As opções são default(use apenas as regras da lista negra) ou paranoid(como strictmas também use as regras da lista negra). A documentação menciona que isso não é recomendado, pois o suporte a regras da lista negra pode ficar obsoleto no futuro.

Outra opção é filtrar uma classe de dispositivos usando uma das várias variáveis ​​de ambiente específicas do TTY . Isso pode ser conseguido anexando uma linha à [Service]seção do arquivo de serviço. Por exemplo, para proibir a detecção de dispositivos ACM TTY:

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

Após alterar o arquivo de serviço, recarregue a systemctlconfiguração e reinicie o ModemManager:

sudo systemctl daemon-reload
sudo systemctl restart ModemManager

Para fins de depuração, pode ser útil observar os logs do gerenciador de modem ao conectar seu dispositivo. Para habilitar o log de depuração, execute:

sudo mmcli -G DEBUG;

Para assistir às mensagens de log do filtro, execute:

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

Agora, ao conectar seu dispositivo, você verá linhas como:

# 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

Para retornar o log do ModemManager ao seu estado anterior, execute:

sudo mmcli -G ERR
Ian Mackinnon
fonte
Embora a lista negra não esteja mais sendo usada, estamos tendo problemas semelhantes com os dispositivos Arduino que são novamente analisados ​​pelo MM. Abri alguns problemas sobre isso no MM upstream e no Debian, consulte gitlab.freedesktop.org/mobile-broadband/ModemManager/issues/127 e bugs.debian.org/cgi-bin/bugreport.cgi?bug=930264
Matthijs Kooijman
0

(apenas por uma questão de ciência, já que você já resolveu seu problema ...)

O udev lê / executa suas regras na ordem alfabética [1].
Isso pode significar que suas configurações devem ser substituídas pelo NetworkManager; essa é sua regra inútil.

Se você renomear sua regra de 99-para 99999-, essa alteração o ajudará?


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

mattia.b89
fonte
Eu tive esse problema há 5 anos e não tenho mais nenhum hardware com o qual o problema ocorreu. Parece que me lembro de mexer nos nomes dos arquivos, mas não consigo me lembrar das circunstâncias exatas.
Superdesk