web-dev-qa-db-ja.com

ターミナルでUSBデバイスを取り外して再度接続します

何年もの間、私はこのUbuntuのバグに取り組んできました。このバグでは、起動直後にマウスがフリーズし、その後定期的にフリーズします。それを修正するには、マウスのusbトランシーバーを物理的に取り外して、再度接続する必要があります。私の調査から、このバグはLinuxとWindowsのデュアルブート時にUSBワイヤレスWindowsマウスで発生します。

物理的に行うのではなく、プログラムで(ターミナルから)USBトランシーバーを取り外す方法はありますか?スタートアップのbashスクリプトでこれを実現したいと思います。

Ubuntu 16.04を使用しています

編集:私は私の問題を解決しましたが、それは私の質問に実際には関係しません。

ファイル内.

/etc/laptop-mode/conf.d/runtime-pm.conf

作らなければならなかった

CONTROL_RUNTIME_AUTOSUSPEND=0

これは私が長年経験していたマウスのバグを修正します。

6
deanresin

私はそれをどのように行うかを示すスクリプトを書きました。

#!/bin/bash

port="1-1.1" # as shown by lsusb -t: {bus}-{port}(.{subport})

bind_usb() {
  echo "$1" >/sys/bus/usb/drivers/usb/bind
}

unbind_usb() {
  echo "$1" >/sys/bus/usb/drivers/usb/unbind
}

unbind_usb "$port"
# sleep 1 # enable delay here
bind_usb "$port"

まず、問題のUSBポートのバスとポート番号を取得する必要があります。 lsusblsusbの出力で認識するデバイスを使用してこれを行うことができます。ここではSandiskペンドライブを使用します。

$ lsusb
Bus 001 Device 005: ID 04f2:b39a Chicony Electronics Co., Ltd 
Bus 001 Device 112: ID 8087:07dc Intel Corp. 
Bus 001 Device 019: ID 04d9:1603 Holtek Semiconductor, Inc. Keyboard
Bus 001 Device 018: ID 0424:2504 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 022: ID 0781:5567 SanDisk Corp. Cruzer Blade
Bus 001 Device 002: ID 8087:8000 Intel Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$ lsusb -t
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/3p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/8p, 480M
        |__ Port 1: Dev 22, If 0, Class=Mass Storage, Driver=usb-storage, 480M
        |__ Port 2: Dev 18, If 0, Class=Hub, Driver=hub/4p, 480M
            |__ Port 1: Dev 19, If 1, Class=Human Interface Device, Driver=usbhid, 1.5M
            |__ Port 1: Dev 19, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
        |__ Port 7: Dev 112, If 0, Class=Wireless, Driver=btusb, 12M
        |__ Port 7: Dev 112, If 1, Class=Wireless, Driver=btusb, 12M
        |__ Port 8: Dev 5, If 1, Class=Video, Driver=uvcvideo, 480M
        |__ Port 8: Dev 5, If 0, Class=Video, Driver=uvcvideo, 480M

lsusbの出力から、デバイスのバスとデバイス番号を取得し、lsusb -tの出力でこのデバイスを検索して、バスとポート番号(場合によってはサブポートを含む)を取得します。構文は次のとおりです。

1-2.3 # for Bus 1 Port 2 Subport 3 – strip leading zeroes!

これをスクリプトでportとして使用します。 chmod +x /path/to/scriptで実行可能にし、それを実行するだけですwith root permissions

Sudo /path/to/script

ペンドライブには必要ありませんでしたが、アンバインドとバインドの間に遅延を追加する必要がある場合があります。それがコメントアウトsleep 1行の目的です。値を試すことができます。 sleep 0.5を0.5秒間。

このアプローチは、特定のデバイスをアンバインドし、特定のUSBポートを再び有効または無効にする方法を示していることに注意してください。再度リバウンドするには、これを機能させるために同じUSBポートを使用する必要があります。 lsusbの出力を解析して、スクリプトが呼び出されるたびに特定のデバイスのバスとポート番号を動的に取得する方法を考えることができます。これにより、任意のUSBポートを使用できますが、ここでやり過ぎ。

このlinux.comブログ記事 からの提案。

4
dessert