无法检测超过 16 个 USB 闪存驱动器

unf*_*nfa 2 usb-drive block-device backports

我正在制作一个 bash 脚本,将文件从一个 USB 驱动器复制到其他多个驱动器。

\n\n

一台专门用于该工作的运行 Xubuntu 的老式机器可以毫无问题地检测到 30 个设备。它仅具有 USB 2.0 端口。

\n\n

而另一台运行 Linux Mint 的现代机器一次检测不到超过 16 个此类驱动器。它仅具有 USB 3.0 端口。当我连接超过 16 个驱动器后,新驱动器不再显示在 lsblk 中。

\n\n

可能是什么原因?

\n\n

编辑:

\n\n

正如 fduff 指出的,我在连接第 17 个 USB 驱动器后检查了 dmesg,它显示的是:

\n\n
[  531.519845] usb 3-9.3.2.6: new high-speed USB device number 46 using xhci_hcd\n[  531.974582] usb 3-9.3.2.6: New USB device found, idVendor=abcd, idProduct=1234\n[  531.974585] usb 3-9.3.2.6: New USB device strings: Mfr=1, Product=2, SerialNumber=3\n[  531.974586] usb 3-9.3.2.6: Product: UDisk\n[  531.974587] usb 3-9.3.2.6: Manufacturer: General\n[  531.974588] usb 3-9.3.2.6: SerialNumber: \xd0\x89\n[  531.975337] usb 3-9.3.2.6: Not enough host controller resources for new device state.\n[  531.975340] usb 3-9.3.2.6: can\'t set config #1, error -12\n
Run Code Online (Sandbox Code Playgroud)\n\n

这看起来像是硬件限制,但允许的 USB 设备数量并不是恒定的。

\n\n

例如,现在我无法连接超过 15 个 USB 驱动器(第 16 个 USB 驱动器出现错误 -12),之前我也曾能够连接大约 20 个设备,并且它们都被正确发现。

\n\n

我尝试使用不同的 USB 端口来跨多个 USB 控制器分散使用,但没有成功。

\n\n

我的硬件规格:

\n\n
MB: ASRock Z97 Extreme6\nCPU: Intel Core i5-4690K\nGPU: MSI GeForce GTX 960 2GB\nRAM: HyperX Fury Black 8GB [2x4GB 1600MHz DDR3 CL10 DIMM]\nPSU: Chieftec GPS-500A8 [500W]\nDisplay: 2x AOC I2276VWM [IPS, 1920x1080]\nHDD: WD Blue 3TB\n
Run Code Online (Sandbox Code Playgroud)\n\n

我还使用 28 端口曼哈顿 USB 集线器:\n https://www.amazon.com/Manhattan-Port-USB-Hub-161718/dp/B0074024XU

\n\n

一台从 LiveCD(在 USB 驱动器上)运行 Xubuntu 的低端垂死 PC 能够检测到 29 个设备(算上 LiveCD 驱动器有 30 个)并执行文件传输 - 即使它安装在 HDD 上的 Windows XP 在某些时候无法检测到28 端口集线器。那台电脑现在正在接受维修服务,因为它坏了(我打赌 PSU 或 MB)。尽管如此,它还是有效的,而闪亮的新的却无效。

\n

fdu*_*uff 5

这可能是与硬件相关的问题。我在英特尔论坛上发现了这一点:

对于8系列主板,最大端点为96个。每个USB设备可以支持多个端点,并且可以支持的端点数量因设备而异。一旦达到最大端点,您将收到一条弹出消息;该限制不是基于支持的设备数量,而是基于端点。

并且

重要的不是设备的数量,而是这些设备使用的端点的数量。事实上,您在 USB 3.0 端口上遇到问题意味着使用了 xHCI 控制器,而不是 USB 2.0 eHCI 控制器。英特尔 xHCI 控制器的限制低于 eHCI 控制器。对于 xHCI 控制器,它有 96 个端点。听起来您已达到此端点限制。您可以使用 Microsoft 的 USB 实用程序“USBVIEW”之类的工具来显示每个 USB 设备正在使用多少个端点。

除了尝试将设备分布到多个 USB 控制器之外,您对此无能为力。当然,这取决于您的主板是否有多个 USB 控制器,以及您是否可以确定哪些物理 USB 连接器路由到哪个 USB 控制器(同样,USBVIEW 很有用)。

仔细看看论坛的帖子,很有趣。

您可以使用以下命令来查明列出了多少个端点:

lsusb -v | grep bEndpointAddress | wc -l