สร้างกฎ udev เพื่อปิดใช้งานอุปกรณ์ Android ตัวใดตัวหนึ่งได้อย่างไร


8

ฉันมีโทรศัพท์ HTC Android

ทุกครั้งที่ฉันเชื่อมต่อกับคอมพิวเตอร์ฉันได้รับข้อความ:

Android Phone: Could not open MTP device "[usb:002,003]"

ตัวเลขอาจแตกต่างกัน แต่โทรศัพท์เชื่อมต่ออย่างถูกต้อง

usb-devices เอาท์พุต

T:  Bus=02 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 28 Spd=480 MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=0bb4 ProdID=0f91 Rev=02.33
S:  Manufacturer=HTC
S:  Product=Android Phone
S:  SerialNumber=FA41BWB00560
C:  #Ifs= 2 Cfg#= 1 Atr=c0 MxPwr=500mA
I:  If#= 0 Alt= 0 #EPs= 3 Cls=06(still) Sub=01 Prot=01 Driver=usbfs
I:  If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=00 Driver=(none)

lsusb

Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 002: ID 048d:1336 Integrated Technology Express, Inc. SD/MMC Cardreader
Bus 002 Device 004: ID 0bb4:0f91 HTC (High Tech Computer Corp.) 
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 002: ID 04b8:0898 Seiko Epson Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 002: ID 046d:c05a Logitech, Inc. M90/M100 Optical Mouse
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

lsusb -t

/:  Bus 07.Port 1: Dev 1, Class=root_hub, Driver=ohci-pci/2p, 12M
/:  Bus 06.Port 1: Dev 1, Class=root_hub, Driver=ohci-pci/3p, 12M
/:  Bus 05.Port 1: Dev 1, Class=root_hub, Driver=ohci-pci/3p, 12M
/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=ohci-pci/3p, 12M
    |__ Port 1: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=ohci-pci/3p, 12M
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/6p, 480M
    |__ Port 1: Dev 4, If 0, Class=Imaging, Driver=usbfs, 480M
    |__ Port 1: Dev 4, If 1, Class=Vendor Specific Class, Driver=, 480M
    |__ Port 3: Dev 2, If 0, Class=Mass Storage, Driver=usb-storage, 480M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/6p, 480M
    |__ Port 2: Dev 2, If 0, Class=Vendor Specific Class, Driver=, 480M
    |__ Port 2: Dev 2, If 1, Class=Printer, Driver=usblp, 480M
    |__ Port 2: Dev 2, If 2, Class=Mass Storage, Driver=usb-storage, 480M

udevadm info -q all -n /dev/bus/usb/002/004

P: /devices/pci0000:00/0000:00:13.2/usb2/2-1
N: bus/usb/002/004
S: libmtp-2-1
E: BUSNUM=002
E: COLORD_DEVICE=1
E: COLORD_KIND=camera
E: DEVLINKS=/dev/libmtp-2-1
E: DEVNAME=/dev/bus/usb/002/004
E: DEVNUM=004
E: DEVPATH=/devices/pci0000:00/0000:00:13.2/usb2/2-1
E: DEVTYPE=usb_device
E: DRIVER=usb
E: GPHOTO2_DRIVER=PTP
E: ID_BUS=usb
E: ID_FOR_SEAT=usb-pci-0000_00_13_2-usb-0_1
E: ID_GPHOTO2=1
E: ID_MEDIA_PLAYER=1
E: ID_MODEL=Android_Phone
E: ID_MODEL_ENC=Android\x20Phone
E: ID_MODEL_ID=0f91
E: ID_MTP_DEVICE=1
E: ID_PATH=pci-0000:00:13.2-usb-0:1
E: ID_PATH_TAG=pci-0000_00_13_2-usb-0_1
E: ID_REVISION=0233
E: ID_SERIAL=HTC_Android_Phone_FA41BWB00560
E: ID_SERIAL_SHORT=FA41BWB00560
E: ID_USB_INTERFACES=:060101:ffff00:
E: ID_VENDOR=HTC
E: ID_VENDOR_ENC=HTC
E: ID_VENDOR_FROM_DATABASE=HTC (High Tech Computer Corp.)
E: ID_VENDOR_ID=0bb4
E: MAJOR=189
E: MINOR=131
E: PRODUCT=bb4/f91/233
E: SUBSYSTEM=usb
E: TAGS=:seat:uaccess:
E: TYPE=0/0/0
E: USEC_INITIALIZED=611981507

dmesg

[   40.632283] usb 2-1: new high-speed USB device number 3 using ehci-pci
[   40.765458] usb 2-1: New USB device found, idVendor=0bb4, idProduct=0f91
[   40.765469] usb 2-1: New USB device strings: Mfr=2, Product=3, SerialNumber=4
[   40.765475] usb 2-1: Product: Android Phone
[   40.765480] usb 2-1: Manufacturer: HTC
[   40.765485] usb 2-1: SerialNumber: FA41BWB00560
[   40.766646] usb-storage 2-1:1.1: USB Mass Storage device detected
[   40.767102] scsi host10: usb-storage 2-1:1.1
[   40.864690] usb 2-1: USB disconnect, device number 3
[   41.613079] usb 2-1: new high-speed USB device number 4 using ehci-pci
[   41.746616] usb 2-1: New USB device found, idVendor=0bb4, idProduct=0f91
[   41.746626] usb 2-1: New USB device strings: Mfr=2, Product=3, SerialNumber=4
[   41.746633] usb 2-1: Product: Android Phone
[   41.746638] usb 2-1: Manufacturer: HTC
[   41.746643] usb 2-1: SerialNumber: FA41BWB00560
[  101.942087] usb 2-1: reset high-speed USB device number 4 using ehci-pci

ฉันยังพบว่าในช่วงเวลาสั้น ๆ หลังจากเชื่อมต่อโทรศัพท์แล้วจะมีการประกาศอุปกรณ์เก็บข้อมูล usb

I:  If#= 0 Alt= 0 #EPs= 3 Cls=06(still) Sub=01 Prot=01 Driver=usbfs
I:  If#= 1 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage

ffจากนั้นก็จะยกเลิกการเชื่อมต่อและชั้นจะเปลี่ยนไป

I:  If#= 0 Alt= 0 #EPs= 3 Cls=06(still) Sub=01 Prot=01 Driver=usbfs
I:  If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=00 Driver=(none)

โปรดทำสิ่งต่อไปนี้สำหรับฉัน: 1) lsusbและค้นหาอุปกรณ์หรืออุปกรณ์ของคุณ (บัสและอุปกรณ์) 2) เริ่มคำสั่งudevadm info -q all -n /dev/bus/usb/your_bus_id/your_device_idและใช้บัสและอุปกรณ์ เพิ่มผลลัพธ์ของคำสั่งในขั้นตอนที่ 2 ลงในคำถามของคุณ
AB

ตกลงและผลลัพธ์ของlsusbเกินไปฉันต้องการเพียงบางส่วนของโทรศัพท์ของคุณ
AB

ฉันจะเพิ่ม แต่คุณสามารถดู VID & PID usb-devicesได้ @AB
Pilot6

ฉันไม่เห็นความคิดเห็นแรก ที่เพิ่มเข้ามาเช่นกัน
Pilot6

1
ฉันไม่แน่ใจว่าเป็นอุปกรณ์ USB สองชิ้นจริงๆ
AB

คำตอบ:


6

จากdmesgผลลัพธ์เป็นที่ชัดเจนว่าโทรศัพท์เชื่อมต่อสองครั้ง

  • [40.632283] เชื่อมต่อที่ 1 เป็น USB บัส 2 dev 3
  • [40.864690] ไม่ได้เชื่อมต่อ
  • [41.613079] เชื่อมต่อที่สองเป็นบัส USB 2 dev 4

ปัญหาคือ:

  • ทั้งสองโหมดการเชื่อมต่อโทรศัพท์มือถือมีการใช้ลักษณะเดียวกันidVendor/ /idProductbcdDevice

  • กฎ udev libmtp ใช้เพียงidVendor/ idProductไปยังอุปกรณ์กรองนอกเหนือไปจากคุณลักษณะที่ไม่สำคัญ / ทั่วไปACTION!="add", ENV{MAJOR}!="?*"และ SUBSYSTEM=="usb"

  • กฎ libmtp udev ใช้ATTR(ไม่ใช่ATTRS) แต่จะกำหนดเป้าหมายไปที่โหนดอุปกรณ์/devices/pci0000:00/0000:00:13.2/usb2/2-1นี้ ดังนั้นเราจึงไม่สามารถใช้รายละเอียดอินเตอร์เฟสของโหนดได้เนื่องจากเป็นโหนดย่อยของโหนดนี้

udevadm monitorจะได้รับสิ่งที่เกิดขึ้นในการใช้งาน หากต้องการดูกิจกรรมที่ไม่มีรายละเอียด

  1. ถอดปลั๊กโทรศัพท์
  2. เปิด terminal และการทำงานudevadm monitor -u, -uการแสดงกิจกรรม udev เท่านั้น (สำหรับการส่งออกที่สะอาด)
  3. เสียบโทรศัพท์และรอจนกว่าสิ่งต่างๆจะสงบลง
  4. Ctrl+ Cเพื่อหยุดการตรวจสอบ

ในการรับรายละเอียด (คุณสมบัติสภาพแวดล้อม) ให้ใช้udevadm monitor -u -pแทนและเปรียบเทียบเอาต์พุตที่โหนดนั้น:

  • UDEV [107.024195] add /devices/pci0000:00/0000:00:13.2/usb2/2-1 (usb)
  • UDEV [107.998137] add /devices/pci0000:00/0000:00:13.2/usb2/2-1 (usb)

สังเกตเห็นความแตกต่างใน ID_USB_INTERFACES

อีกวิธีที่สะอาดกว่าโดยใช้กฎ udev เพื่อรวบรวมเฉพาะสิ่งที่เราต้องการ:

  1. เพิ่มกฎให้/lib/udev/rules.d/69-libmtp.rulesหลังLABEL="libmtp_usb_rules":

    ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0f91", RUN+="/bin/sh -c 'env >> /home/username/udev-phone-mtp_%E{SEQNUM}.log'"
    
  2. โหลดกฎใหม่

    sudo udevadm control -R
    
  3. ถอดโทรศัพท์ออกหนึ่งครั้ง

  4. กฎนี้ควรถูกเรียกสองครั้ง การเปรียบเทียบเอาต์พุตที่โหนดนั้น:

    diff udev-phone-mtp_*.log

    ควรนำ: (นี่เป็นเพียงส่วนที่น่าสนใจ)

    < ID_USB_INTERFACES=:060101:080650:
    ---
    > ID_USB_INTERFACES=:060101:ffff00:
    

สิ่งที่ Pilot6 (OP) สามารถจับได้โดยใช้usb-devicesก่อนที่จะทำการเชื่อมต่อใหม่


ฉันขอแนะนำให้เพิ่มกฎนี้/lib/udev/rules.d/69-libmtp.rulesหลังจากLABEL="libmtp_usb_rules":

ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0f91", ENV{ID_USB_INTERFACES}==":060101:080650:", GOTO="libmtp_rules_end"

การสนทนาการสนทนานี้ chat.stackexchange.com/rooms/28790/…เกี่ยวข้องกับสิ่งนี้ รายงานว่า: ครั้งแรกที่มันทำงานได้ดีครั้งที่สองหลังจากถอดปลั๊กเกิดข้อผิดพลาดจากนั้นเปิดหลังจากล่าช้า
user.dz

1
ฉันไม่เห็นข้อผิดพลาดใด ๆ ในขณะนี้ แต่ความล่าช้ายังคงอยู่ที่นั่น ใช้เวลาประมาณหนึ่งนาทีในการติดตั้งอุปกรณ์ ฉันได้รับข้อผิดพลาดถ้าฉันไม่รอจนกว่าจะได้รับการเมาท์อัตโนมัติและลองเปิดมันในหอยโข่ง
Pilot6

1
แต่นี่ดูเหมือนจะไม่เกี่ยวข้องกันเพราะฉันให้ความเห็นเกี่ยวกับสายงานของคุณและความล่าช้าก็ยังคงอยู่ โทรศัพท์ปรากฏในตัวเรียกใช้งาน แต่ไม่สามารถต่อเชื่อมได้สักพัก
Pilot6

ความล่าช้าไม่เกี่ยวข้องกับ Ubuntu มันเป็นข้อผิดพลาดของ Android ฉันเสียบโทรศัพท์จากคอมพิวเตอร์เครื่องหนึ่งและเชื่อมต่อกับเครื่องอื่น มีความล่าช้าเหมือนกัน
Pilot6

1
มันเป็นปัญหา Android จริง ๆ กับความล่าช้า ฉันติดตั้งเฟิร์มแวร์ใหม่ด้วยเหตุผลอื่นและความล่าช้าก็หายไป
Pilot6
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.