Nachdem ich heute auf ein dramatisches Problem mit einem USB-Device(ein Huawei USB-Stick) an einem Server gestossen bin, musste ich es neu initialisieren.
Aber wie zur Hoelle macht man das Remote ohne einen Roboter-Arm, der das USB-Device rauszieht und wieder reinsteckt?
Nach laengerem googlen bin ich auf einen netten Workaround gestossen: Man entzieht dem Device die Authorisierung und gibt sie ihm wieder zurueck. Damit erzwingt man ein erneutes Initialisieren durch den Kernel. Das ganze sieht dann so aus:
root@server:~# echo 0 > /sys/bus/usb/devices/2-1.4/authorized
Aug 14 06:02:46 server kernel: [8964220.935729] usbip 2-1.4:1.0: recv a header, 0
Aug 14 06:02:46 server kernel: [8964220.935843] usb 2-1.4: lock for reset
Aug 14 06:02:46 server kernel: [8964220.936604] usb 2-1.4: lock for reset
Aug 14 06:02:46 server kernel: [8964220.937381] usb 2-1.4: lock for reset
Aug 14 06:02:46 server kernel: [8964220.937663] usb 2-1.4: lock for reset
Aug 14 06:02:46 server kernel: [8964220.937803] usb 2-1.4: lock for reset
root@server:~# echo 1 > /sys/bus/usb/devices/2-1.4/authorized
Aug 14 06:02:50 server kernel: [8964224.929033] usb 2-1.4: configuration #1 chosen from 1 choice
Aug 14 06:02:50 server kernel: [8964224.934612] option 2-1.4:1.0: GSM modem (1-port) converter detected
Aug 14 06:02:50 server kernel: [8964224.934737] usb 2-1.4: GSM modem (1-port) converter now attached to ttyUSB1
Aug 14 06:02:50 server kernel: [8964224.934888] option 2-1.4:1.1: GSM modem (1-port) converter detected
Aug 14 06:02:50 server kernel: [8964224.934956] usb 2-1.4: GSM modem (1-port) converter now attached to ttyUSB2
Aug 14 06:02:50 server kernel: [8964224.935083] option 2-1.4:1.2: GSM modem (1-port) converter detected
Aug 14 06:02:50 server kernel: [8964224.935151] usb 2-1.4: GSM modem (1-port) converter now attached to ttyUSB3
Aug 14 06:02:50 server kernel: [8964224.936582] scsi57 : SCSI emulation for USB Mass Storage devices
Aug 14 06:02:50 server kernel: [8964224.936828] usb-storage: device found at 29
Aug 14 06:02:50 server kernel: [8964224.936831] usb-storage: waiting for device to settle before scanning
Wer das ganze nachmachen moechte, sollte darauf achten, dass die Device-ID - im Beispiel 2.1-4 - stimmt.
Update: Da scheinbar viele nicht wissen, wie sie die Device-ID herausfinden, hier die entsprechenden Befehle dafuer. Im Beispiel versuche ich dabei, die ID des Thermometers herauszubekommen.
# Alle USB-Geraete ausgeben lassen
root@server:~# lsusb
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 1a40:0101 Terminus Technology Inc. 4-Port HUB
Bus 001 Device 005: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
Bus 001 Device 006: ID 1130:660c Tenx Technology, Inc. Foot Pedal/Thermometer
# Mit der Hersteller-ID im sysfs suchen
root@server:~# grep 1130 /sys/bus/usb/devices/*/uevent
[...]
/sys/bus/usb/devices/1-1.2.2:1.1/uevent:MODALIAS=usb:v1130p660Cd0150dc00dsc00dp00ic03isc00ip00in01
/sys/bus/usb/devices/1-1.2.2/idVendor:1130
/sys/bus/usb/devices/1-1.2.2/uevent:PRODUCT=1130/660c/150
# Check, ob es das richtige Geraet ist:
root@server:~# cat /sys/bus/usb/devices/1-1.2.2/product
PCsensor Temper
Nachdem dann /sys/bus/usb/devices/1-1.2.2/product
als korrektes Geraet
befunden wurde, muss man lediglich product
mit authorized
ersetzen.