안드로이드 장치 중 하나를 비활성화하는 udev 규칙을 만드는 방법은 무엇입니까?


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] 2 번 USB 버스로 연결됨 2 dev 4

문제는:

  • 모두 전화 연결 모드가 동일한 속성을 사용하는 idVendor/ idProduct/ bcdDevice.

  • libmtp의 udev 규칙에만 사용 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. 열기 터미널 및 실행 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:
    

정확히 usb-devices다시 연결하기 전에 Pilot6 (OP)이이를 사용하여 포착 할 수있는 것 .


나는이 규칙을 추가 제안 /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
지금 오류가 표시되지 않습니다. 그러나 지연은 여전히 ​​존재합니다. 장치를 마운트하는 데 최대 1 분이 걸립니다. 자동 마운트 될 때까지 기다리지 않고 노틸러스에서 열려고하면 오류가 발생합니다.
Pilot6

1
그러나 이것은 귀하의 라인을 주석 처리하고 지연이 여전히 있기 때문에 관련이없는 것 같습니다. 전화기가 런처에 나타나지만 한동안 마운트 할 수 없습니다.
Pilot6

지연은 우분투와 관련이 없습니다. 안드로이드 버그입니다. 한 컴퓨터에서 전화를 연결하고 다른 컴퓨터에 연결했습니다. 같은 지연이 있습니다.
Pilot6

1
실제로 지연과 관련된 Android 문제였습니다. 다른 이유로 펌웨어를 다시 설치했는데 지연이 사라졌습니다.
Pilot6
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.