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\nRun Code Online (Sandbox Code Playgroud)\n\n这看起来像是硬件限制,但允许的 USB 设备数量并不是恒定的。
\n\n例如,现在我无法连接超过 15 个 USB 驱动器(第 16 个 USB 驱动器出现错误 -12),之前我也曾能够连接大约 20 个设备,并且它们都被正确发现。
\n\n我尝试使用不同的 USB 端口来跨多个 USB 控制器分散使用,但没有成功。
\n\n我的硬件规格:
\n\nMB: 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\nRun 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这可能是与硬件相关的问题。我在英特尔论坛上发现了这一点:
对于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