如何重新连接逻辑断开的 USB 设备?

Gil*_*il' 63 linux usb usb-drive

USB 存储设备有可能在逻辑上断开连接:该设备仍处于插入状态,但在操作系统中是不可见的(例如,它未在 下列出/proc/bus/usb)。也许这也可能发生在其他类型的 USB 或其他可移动设备上。例如,这可能发生:

  • 在 Nautilus 卸载 USB 存储设备后
  • 在 VirtualBox 声明了一个 USB 存储设备之后(当它连接到客户机时,该设备从 Linux 主机中消失,如果它从客户机分离,则不会自动重新出现)。

驱动程序或硬件中发生了什么,最重要的是,(如何)可以逻辑地重新连接设备(无需物理地将其拔出并重新插入)?

请注意,此问题与安装无关。在“逻辑断开”状态下,内核认为 USB 总线上没有任何内容(因此当然在 下没有条目/dev)。

jon*_*n_d 22

有时可以在插入设备的 USB 总线的分支上执行电源循环:

# echo suspend > /sys/bus/usb/devices/1-1/power/level
# echo auto > /sys/bus/usb/devices/1-1/power/level
Run Code Online (Sandbox Code Playgroud)

1-1应调整配置。您可以通过lsusb -t在弹出之前运行来查看您的设备插入 USB 树的哪个部分。

您可以在 linux-usb 邮件列表中找到详细信息,例如此线程

  • “暂停”在 2.6.36 之后的内核上不起作用。 (7认同)

小智 10

udevadm info -a -n /dev/sdb
Run Code Online (Sandbox Code Playgroud)

现在检查内核。例如,如果它连接到前端 UIP 的端口 2,那么它将是 1-1.2,如果它连接到前端 UIP 的端口 1,那么它将是 1-1.1。

对于端口 2:断开 USB 连接:

echo '1-1.2' | tee /sys/bus/usb/drivers/usb/unbind
Run Code Online (Sandbox Code Playgroud)

连接 USB:

echo '1-1.2' | tee /sys/bus/usb/drivers/usb/bind
Run Code Online (Sandbox Code Playgroud)


小智 6

重置设备或其连接的集线器,设备应该会重新出现。这是一个小程序来做到这一点:

http://marc.info/?l=linux-usb-users&m=116827193506484

它适用于我尝试过的大多数 USB 驱动器,但也有例外,例如我的金士顿 DT 101 II 4GB,它在重置后无法使用查询和读取容量命令,并且在重新启动之前仍然无法使用。

如果设备从端口获得电源,您可以在不拔下电源的情况下重新启动设备,并且您的 USB 集线器支持每个端口的电源控制。下面是一个控制电源的小程序:

http://marc.info/?l=linux-usb-devel&m=113724451205634

不幸的是,几乎没有 USB 集线器支持此功能,而且很难找到支持它的集线器。制造商不做广告。许多集线器也对此撒谎,例如,如果您执行“lsusb -v”,您可以看到“wHubCharacteristic”中广告的“每端口电源切换”,但实际上它不起作用。芯片组可能支持它,但制造商将端口电源引脚直接连接到电源而不是通过芯片组更容易/更便宜。


Avi*_*vio 5

我发现这个答案在我的 Gentoo 系统上效果很好。如果您的设备是系统的重要部分(例如鼠标或键盘),请记住重新启用您的设备。

sudo sh -c 'AUTHFILE="/sys/bus/usb/devices/5-2/authorized" ; echo 0 > "$AUTHFILE" ; sleep 1 ; echo 1 > "$AUTHFILE"'
Run Code Online (Sandbox Code Playgroud)

要查看您要禁用/重新启用的内容:

cat /sys/bus/usb/devices/5-2/product
Run Code Online (Sandbox Code Playgroud)


Mat*_*Wai 5

以下将断开 USB 设备。

sudo eject /dev/sde
Run Code Online (Sandbox Code Playgroud)

以下将重新连接 USB 设备。

sudo eject -t /dev/sde
Run Code Online (Sandbox Code Playgroud)

以上适用于我的 Linux Mint。