在 linux 中禁用 USB 端口

Zac*_*bat 6 linux usb

我已经搜索了很多答案,但我能找到的最接近解决方案的是this,但它对我不起作用。

这是我的系统:

# uname -a
Linux vin 4.4.0-1-amd64 #1 SMP Debian 4.4.6-1 (2016-03-17) x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

问题是:我的一个 USB 端口似乎没电了。任何试图读取“/sys/bus/usb/devices/usb1/descriptors”的程序都会导致程序挂在不可终止状态。

不幸的是,很多软件似乎都想访问 USB1,包括 chrome 和 Blender,这就是为什么这让我如此烦恼。当我使用 strace 调用这些程序时,它们总是在尝试打开“/sys/bus/usb/devices/usb1/descriptors”时挂起。

我已经尝试过诸如“echo suspend > /sys/bus/usb/devices/usb1/power/level”之类的东西,但它不好 - 命令只是像其他命令一样挂起。

我尝试使用上面链接的帖子中提到的 hubpower 代码,但它似乎也像其他代码一样挂起。

我尝试关闭整个系统并打开计算机本身直接断开USB端口,但是整个USB端口(有很多)似乎与主板紧密结合,我看不到拔掉任何东西的方法。当然,我没有将电线插入和拔出主板的大量经验。如果唯一的希望就是那样做,我希望能做到。

我尝试进入 BIOS 并禁用除一个之外的所有 USB 端口;然后禁用除下一个之外的所有内容;和下一个;等等,看看哪个是问题。但它似乎没有任何效果——Linux 仍然能够很好地识别端口以使用我的 USB 鼠标和键盘。Linux 似乎并不关心 BIOS 配置是什么。

我想到的事情是,可能有某种方法可以告诉 Linux 内核忽略 USB1,但这样做时无需实际尝试与 USB1 交互(因为这似乎会导致无法杀死的挂起)。但我不知道该怎么做。

小智 1

部分答案:我不确定您是否只能禁用一个 USB 端口,但您可以禁用控制器及其所有端口。

您可以使用 lspci 列出控制器:lspci -k| grep -i usb -A2 例如,我得到:

03:00.0 USB controller: ASMedia Technology Inc. ASM1142 USB 3.1 Host Controller
        Subsystem: Micro-Star International Co., Ltd. [MSI] ASM1142 USB 3.1 Host Controller
        Kernel driver in use: xhci_hcd
        Kernel modules: xhci_pci
Run Code Online (Sandbox Code Playgroud)

这意味着 PCI 端口 03:00.0 上的 USB 控制器由 xhcp_pci 内核模块处理。

现在,我可以使用以下命令要求驱动程序不要管理该控制器:

echo "0000:03:00.0" | sudo tee /sys/bus/pci/drivers/xhci_hcd/unbind
Run Code Online (Sandbox Code Playgroud)

如果您不介意丢失该控制器的其他 USB 端口,这可能是一个解决方案。