当我将手机插入 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
虽然可能有办法做到这一点udev
,但我在 AskUbuntu 上找到了一个更简单的解决方案问题。
总而言之,您可以通过在网络管理器的 .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
接下来,/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
答案2
调制解调器管理器可以配置为使用不同的过滤策略,而诸如的udev标签在过滤策略ID_MM_DEVICE_IGNORE
下不起作用strict
。
您可以通过查看其状态来确定调制解调器管理器在您的系统上使用哪种策略:
> 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
答案3
这是针对 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 端口)后即可享受。
答案4
(只是为了科学,因为你已经解决了你的问题......)
udev 按照字母顺序读取/执行其规则[1]。
这可能意味着您的设置应该被 NetworkManager 覆盖,也就是说您的规则是无用的。
如果您将规则从 重命名为,99-
那么99999-
这种更改是否有帮助?