quy tắc udev dường như bỏ qua; không thể ngăn người quản lý modem lấy thiết bị


17

Tôi đang cố gắng ngăn trình quản lý modem chạy khi tôi cắm điện thoại di động vào cổng USB.

Tôi đã cố gắng thêm quy tắc tùy chỉnh với udev, nhưng quy tắc tùy chỉnh của tôi dường như bị bỏ qua. Tôi đã tạo một tập tin /etc/udev/rules.d/99-mm-usb-device-blacklist.rulescó chứa

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

Nhưng khi tôi cắm điện thoại và kiểm tra dmesg, đây là những gì tôi nhận được:

[ 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

Tôi cũng đã thử chỉnh sửa /lib/udev/rules.dev/77-mm-usb-device-blacklist.rulesnhưng điều này cũng không hoạt động. Tôi đang thiếu gì? Điều gì sẽ là một bước hữu ích trong việc gỡ lỗi này?

Cập nhật: Chạy udevadm info --export-dbcho thấy quy tắc udev đang được cập nhật. Đầu ra có liên quan là:

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

Vì vậy, người quản lý modem nên bỏ qua thiết bị. Nhưng máy tính của tôi vẫn cố gắng khởi tạo kết nối mạng qua điện thoại của tôi bất cứ khi nào tôi cắm nó vào cổng USB. Có chương trình nào khác mà udev đang phát động không?


1
Bạn đã chạy ModemManager --debug để kiểm tra xem nó đang làm gì với thiết bị được đề cập? Tôi cũng hơi ngạc nhiên khi không thấy ID_MM_CANDIDATE = 1 trong mục đó - có lẽ đây là một thiết bị quét mã riêng biệt trong ModemManager không tôn trọng thuộc tính đó?
kiko

@kiko, tôi có cùng một vấn đề với tác giả câu hỏi. ID_MM_CANDIDATEkhông xuất hiện trong đầu ra thiết bị USB, nhưng có một mục riêng trong đầu ra cơ sở dữ liệu cho thiết bị TTY và điều này có cả ID_MM_CANDIDATE=1ID_MM_DEVICE_IGNORE=1. Nhật ký gỡ lỗi Modem Manager cho thấy nó thực sự đang thăm dò thiết bị.
Ian Mackinnon

Câu trả lời:


7

Mặc dù có thể có một cách để làm điều này với udev, tôi đã tìm thấy một giải pháp làm việc đơn giản hơn nhiều cho câu hỏi AskUbfox này .

Để tóm tắt, bạn có thể yêu cầu Trình quản lý mạng không quản lý một số thiết bị nhất định bằng cách thêm một dòng vào tệp .conf của nó.

Đầu tiên, tìm địa chỉ mac điện thoại di động của bạn. Chạy dmesgtừ thiết bị đầu cuối sau khi bạn cắm nó vào; một trong những bản in nên có mac. Dòng cho tôi là:

[ 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

Tiếp theo, mở /etc/NetworkManager/NetworkManager.confvới các quyền riêng tư siêu người dùng và thêm mac điện thoại của bạn dưới dạng một thiết bị không được quản lý. Đây là của tôi NetworkManager.conf; Tôi đã thêm hai dòng cuối cùng.

[main]
plugins=ifupdown,keyfile
dns=dnsmasq

[ifupdown]
managed=false

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

6

Trình quản lý Modem có thể được cấu hình để sử dụng các chính sách bộ lọc khác nhau và các thẻ udev như ID_MM_DEVICE_IGNOREkhông có hiệu lực theo strictchính sách bộ lọc.

Bạn có thể xác định chính sách Modem Manager nào đang sử dụng trên hệ thống của mình bằng cách xem trạng thái của nó:

> 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

Điều này cũng cho thấy các tập tin dịch vụ có liên quan là /lib/systemd/system/ModemManager.service. Chúng tôi có thể chỉnh sửa tệp này theo nhiều cách khác nhau để vô hiệu hóa việc thăm dò một thiết bị cụ thể.

Để sử dụng một chính sách khác sẽ tham chiếu đến các quy tắc danh sách đen udev, chúng ta có thể thay đổi lệnh trong dịch vụ:

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

Các tùy chọn là default(chỉ sử dụng quy tắc danh sách đen) hoặc paranoid(thích strictnhưng cũng sử dụng quy tắc danh sách đen). Các tài liệu đề cập đến điều này không được khuyến khích vì hỗ trợ cho các quy tắc danh sách đen có thể bị lỗi thời trong tương lai.

Một tùy chọn khác là lọc một lớp thiết bị bằng một trong một số biến môi trường dành riêng cho TTY . Điều này có thể đạt được bằng cách nối thêm một dòng vào [Service]phần của tệp dịch vụ. Ví dụ: để cấm việc thăm dò các thiết bị ACM TTY:

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

Sau khi thay đổi tệp dịch vụ, tải lại systemctlcấu hình và khởi động lại ModemManager:

sudo systemctl daemon-reload
sudo systemctl restart ModemManager

Đối với mục đích gỡ lỗi, có thể hữu ích khi xem nhật ký trình quản lý modem khi kết nối thiết bị của bạn. Để bật ghi nhật ký gỡ lỗi, hãy chạy:

sudo mmcli -G DEBUG;

Để xem các thông điệp nhật ký bộ lọc, hãy chạy:

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

Bây giờ khi bạn kết nối thiết bị của mình, bạn sẽ thấy các dòng như:

# 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

Để trả lại bản ghi ModemManager về trạng thái trước đó, hãy chạy:

sudo mmcli -G ERR

Đã xóa danh sách đen không được sử dụng nữa, chúng tôi đã gặp vấn đề tương tự với các thiết bị Arduino một lần nữa được MM thử nghiệm. Tôi đã mở ra một số vấn đề về vấn đề này tại MM ngược dòng và Debian, xem gitlab.freedesktop.org/mobile-broadband/ModemManager/issues/127bug.debian.org/cgi-bin/ormsreport.cgi?bug=930264
Matthijs Kooijman

0

(chỉ vì khoa học, vì bạn đã giải quyết vấn đề của mình ...)

udev đọc / thực hiện các quy tắc của nó theo thứ tự bảng chữ cái [1].
Điều này có thể có nghĩa là các cài đặt của bạn sẽ bị ghi đè là NetworkManager, đó là quy tắc của bạn là vô ích.

Nếu bạn đổi tên quy tắc của mình 99-để 99999-thay đổi này có giúp gì cho bạn không?


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


Tôi đã gặp vấn đề này 5 năm trước và không còn bất kỳ phần cứng nào mà tôi gặp phải sự cố này nữa. Tôi dường như nhớ lại việc lộn xộn với tên tập tin, nhưng không thể nhớ lại hoàn cảnh chính xác.
siêu sao
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.