udev 规则似乎被忽略了;无法阻止调制解调器管理器抓取设备

sup*_*esk 17 usb network-manager udev

当我将手机插入 USB 端口时,我试图阻止调制解调器管理器运行。

我尝试使用 udev 添加自定义规则,但我的自定义规则似乎被忽略了。我创建了一个文件/etc/udev/rules.d/99-mm-usb-device-blacklist.rules,其中包含

# LG Phone
ATTRS{idVendor}=="1004", ENV{ID_MM_DEVICE_IGNORE}="1"
Run Code Online (Sandbox Code Playgroud)

然而,当我插入电话并检查 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
Run Code Online (Sandbox Code Playgroud)

我也尝试过编辑,/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
Run Code Online (Sandbox Code Playgroud)

所以调制解调器管理器应该忽略该设备。然而,每当我将其插入 USB 端口时,我的计算机都会不断尝试通过我的手机初始化网络连接。udev 是否​​正在启动另一个程序?

sup*_*esk 7

虽然可能有一种方法可以做到这一点udev,但我在这个 AskUbuntu question 中找到了一个更简单的工作解决方案。

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

首先,找到你手机的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
Run Code Online (Sandbox Code Playgroud)

接下来,/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
Run Code Online (Sandbox Code Playgroud)


Ian*_*non 6

Modem Manager 可以配置使用不同的过滤策略ID_MM_DEVICE_IGNOREstrict过滤策略下udev 标签没有作用。

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

> 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
Run Code Online (Sandbox Code Playgroud)

这也说明相关的服务文件是/lib/systemd/system/ModemManager.service. 我们可以用不同的方式编辑这个文件来禁用对特定设备的探测。

要使用将引用 udev 黑名单规则的不同策略,我们可以更改服务中的命令:

ExecStart=/usr/sbin/ModemManager --filter-policy=default
Run Code Online (Sandbox Code Playgroud)

选项是default(只使用黑名单规则)或paranoid(就像strict但也使用黑名单规则)。该文件提到这是不建议作为黑名单规则的支持可能在将来会过时。

另一种选择是使用几个特定于 TTY 的环境变量之一过滤一类设备。这可以通过[Service]在服务文件的部分附加一行来实现。例如,要禁止探测 ACM TTY 设备:

[Service]
...
Environment="MM_FILTER_RULE_TTY_ACM_INTERFACE=0"
Run Code Online (Sandbox Code Playgroud)

更改服务文件后,重新加载systemctl配置并重启ModemManager:

sudo systemctl daemon-reload
sudo systemctl restart ModemManager
Run Code Online (Sandbox Code Playgroud)

出于调试目的,在连接设备时查看调制解调器管理器日志可能很有用。要启用调试日志记录,请运行:

sudo mmcli -G DEBUG;
Run Code Online (Sandbox Code Playgroud)

要查看过滤器日志消息,请运行:

journalctl -f | grep "ModemManager.*\[filter\]"
Run Code Online (Sandbox Code Playgroud)

现在,当您连接设备时,您应该会看到如下几行:

# 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
Run Code Online (Sandbox Code Playgroud)

要将 ModemManager 日志记录返回到其先前状态,请运行:

sudo mmcli -G ERR
Run Code Online (Sandbox Code Playgroud)