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正在启动另一个程序吗?


1
您是否运行过ModemManager --debug来检查相关设备在做什么?我也很惊讶没有在该条目中看到ID_MM_CANDIDATE = 1 -也许这是ModemManager中的一个单独的代码路径扫描设备,它不遵守该属性?
kiko

@kiko,我和问题作者有同样的问题。ID_MM_CANDIDATE不会出现在USB设备输出中,但是在TTY设备的数据库输出中有一个单独的条目,并且具有ID_MM_CANDIDATE=1ID_MM_DEVICE_IGNORE=1。调制解调器管理器调试日志显示它确实在探测设备。
伊恩·麦金农

Answers:


7

尽管可能有解决办法,但udev我在AskUbuntu 问题上找到了一个更简单的工作解决方案。

总而言之,您可以通过在其.conf文件中添加一行来告诉Network Manager不要管理某些设备。

首先,找到您手机的Mac地址。dmesg插入终端后从终端运行;其中一份印刷品应装有Mac。对我来说,这行是:

[ 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

6

可以将调制解调器管理器配置为使用不同的筛选器策略,而udev标记(例如)ID_MM_DEVICE_IGNOREstrict筛选器策略下无效。

您可以通过查看其状态来确定调制解调器管理器在系统上使用的策略:

> 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

不再使用黑名单,我们在MM再次探查的Arduino设备上也遇到了类似的问题。我已经在MM上游和Debian中打开了一些与此相关的问题,请参阅gitlab.freedesktop.org/mobile-broadband/ModemManager/issues/127bugs.debian.org/cgi-bin/bugreport.cgi?bug=930264
Matthijs Kooijman

0

(仅出于科学目的,因为您已经解决了问题...)

udev按字母顺序读取/执行其规则[1]。
这可能意味着您的设置应该被NetworkManager覆盖,这就是您的规则没有用。

如果您将规则从重命名99-99999-,此更改对您有帮助吗?


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


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端口)后,即可享用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.