mvp/uhubctl

GitHub: mvp/uhubctl

uhubctl 是一款用于智能 USB 集线器每端口电源控制的命令行工具,支持远程开关指定 USB 端口供电。

Stars: 2716 | Forks: 254

# uhubctl `uhubctl` 是一个用于在智能 USB 集线器上控制每个端口 USB 供电的实用工具。 智能集线器定义为实现了每端口电源切换的设备。 此代码的最初灵感来自 Niibe Yutaka 编写的 hub-ctrl.c: https://www.gniibe.org/development/ac-power-control-by-USB-hub # 兼容的 USB 集线器 以下是已知兼容的 USB 集线器列表: | 制造商 | 产品 | 端口 | USB | VID:PID | 发布 | EOL | |:-------------------|:-----------------------------------------------------|:------|:----|:----------|:--------|:-----| | Acer | BE270U 显示器 ([见](https://tinyurl.com/acer550)) | 4 | 3.0 |`2109:2811`| 2016 | | | AmazonBasics | HU3641V1 ([RPi 问题](https://goo.gl/CLt46M)) | 4 | 3.0 |`2109:2811`| 2013 | | | AmazonBasics | HU3770V1 ([RPi 问题](https://goo.gl/CLt46M)) | 7 | 3.0 |`2109:2811`| 2013 | | | AmazonBasics | HU9003V1EBL, HUC9003V1EBL | 7 | 3.1 |`2109:2817`| 2018 | | | AmazonBasics | HU9002V1SBL, HU9002V1EBL, HU9002V1ESL, HHU9002V1EZPR01 ([注](https://tinyurl.com/HU9002)) | 10 | 3.1 |`2109:2817`| 2018 | | | AmazonBasics | HUC9002V1SBL, HUC9002V1EBL, HUC9002V1ESL | 10 | 3.1 |`2109:2817`| 2018 | | | AmazonBasics | U3-7HUB (仅适用于 1 个充电端口) | 7 | 3.0 |`2109:2813`| 2020 | | | Anker | AK-68ANHUB-BV7A-0004 ([注](https://git.io/JLnZb)) | 7 | 3.0 |`2109:0812`| 2014 | | | Apple | Mac Mini M4 (仅 2 个前置端口) | 2 | 3.2 |`05AC:800B`| 2024 | | | Apple | MacBook Air (2010 年末) | 2 | 2.0 |`1D6B:0002`| 2010 | 2020 | | Apple | Pro Display XDR MWPE2LL/A (内部 USB 集线器) | 4 | 2.0 |`05AC:9139`| 2019 | | | Apple | Thunderbolt Display 27" (内部 USB 集线器) | 6 | 2.0 | | 2011 | 2016 | | Apple | 带数字小键盘的 USB 键盘 (内部 USB 集线器) | 3 | 2.0 | | 2011 | | | Asus | Z77 Sabertooth 主板 (板载 USB 集线器) | 6 | 2.0 | | 2012 | | | Asus | Z87-PLUS 主板 (板载 USB 集线器) | 4 | 3.0 | | 2013 | 2016 | | Aukey | CB-C59 | 4 | 3.0 |`2109:2813`| 2017 | | | B+B SmartWorx | UHR204 | 4 | 2.0 |`0856:DB00`| 2013 | | | B+B SmartWorx | USH304 | 4 | 3.0 |`04B4:6506`| 2017 | 2019 | | Basler | 2000036234 | 4 | 3.0 |`0451:8046`| 2016 | | | Belkin | F5U101 | 4 | 2.0 |`0451:2046`| 2005 | 2010 | | Belkin | F5U238UKCRL-MOB | 4 | 2.0 |`0409:0059`| 2004 | 2010 | | BenQ | PD2700U 4K 显示器 (仅在 USB2 模式下有效) | 4 | 3.0 |`05E3:0610`| 2018 | | | BenQ | PD3220U | 4 | 3.1 |`05E3:0610`| 2019 | | | Bytecc | BT-UH340 ([警告](https://tinyurl.com/BT-UH340-1)) | 4 | 3.0 |`2109:8110`| 2010 | | | Centech | CT-USB4HUB ReTRY HUB ([注](https://github.com/mvp/uhubctl/issues/630)) | 4 | 3.0 |`0424:2744`| 2017 | | | Circuitco | Beagleboard-xM (内部 USB 集线器) | 4 | 2.0 |`0424:9514`| 2010 | | | Club3D | CSV-3242HD 双显示扩展坞 | 4 | 3.0 |`2109:2811`| 2015 | | | Coolgear | USBG-12U2ML | 12 | 2.0 |`05E3:0607`| 2015 | | | Cypress | CY4608 HX2VL ([注](https://tinyurl.com/CY4608-1)) | 4 | 2.0 |`04B4:6570`| 2012 | | | D-Link | DUB-2332 rev A1 | 3 | 3.0 | | 2022 | | | D-Link | DUB-H4 rev D,E (黑色)。注意:不支持 rev A,C,F | 4 | 2.0 |`05E3:0608`| 2012 | | | D-Link | DUB-H7 rev A (银色) | 7 | 2.0 |`2001:F103`| 2005 | 2010 | | D-Link | DUB-H7 rev D,E (黑色)。不支持 rev B,C,F,G | 7 | 2.0 |`05E3:0608`| 2012 | | | Dell | DA300 USB-C 移动适配器 | 2 | 3.0 |`2109:2820`| 2018 | | | Dell | P2416D 24" QHD 显示器 ([注](https://git.io/JUAu8))| 4 | 2.0 | | 2017 | | | Dell | S2719DGF 27" WQHD 电竞显示器 | 5 | 3.0 |`0424:5734`| 2018 | | | Dell | UltraSharp 1704FPT 17" LCD 显示器 | 4 | 2.0 |`0424:A700`| 2005 | 2015 | | Dell | UltraSharp U2415 24" LCD 显示器 | 5 | 3.0 | | 2014 | | | Dell | UltraSharp U3419W 34" 曲面显示器 | 6 | 3.0 | | 2020 | | | Dell | Wyse 3040 ([需要 -f](https://tinyurl.com/wyse3k))| 6 | 3.0 | | 2017 | | | Delock | 62537 | 4 | 3.0 | | 2017 | 2021 | | Delock | 87445 ([注](https://git.io/Jsuz5)) | 4 | 2.0 |`05E3:0608`| 2009 | 2013 | | Elecom | U2H-G4S | 4 | 2.0 | | 2006 | 2011 | | Gigabyte | G27Q 显示器 ([见](http://tinyurl.com/G27Q551)) | 4 | 3.0 |`2109:0817`| 2020 | | | GlobalScale | ESPRESSObin SBUD102 V5 | 1 | 3.0 |`1D6B:0003`| 2017 | | | Hardkernel | ODROID-C4 ([注](https://git.io/JG0mP)) | 4 | 3.0 | | 2020 | | | Hawking Technology | UH214 | 4 | 2.0 | | 2003 | 2008 | | Hewlett Packard | USB-C Dock G5 5TW10AA | 5 | 3.0 |`03F0:076B`| 2019 | | | Hewlett Packard | P5Q58UT | 3 | 3.0 | | 2019 | | | IBM | SK-8815 USB 键盘 | 3 | 1.1 |`04B3:301A`| 2004 | | | Inateck | HB2025A ([仅限 USB2](https://tinyurl.com/HB2025A-1)) | 4 | 3.1 |`2109:2822`| 2021 | | | IOI | U3H415E1 | 4 | 3.0 | | 2012 | | | j5create | JUH377 ([注](https://tinyurl.com/JUH377)) | 7 | 3.0 | | 2016 | | | j5create | JUH470 ([注](https://tinyurl.com/JUH470)) | 3 | 3.0 |`05E3:0610`| 2014 | | | Juiced Systems | 6HUB-01 | 7 | 3.0 |`0BDA:0411`| 2014 | 2018 | | KUNBUS GmbH | RevPi Connect (+) / S / SE | 2 | 2.0 |`0424:9514`| 2018 | | | KUNBUS GmbH | RevPi Connect 4 | 2 | 3.0 | | 2022 | | | KUNBUS GmbH | RevPi Core 3 / S / SE | 2 | 2.0 |`0424:9514`| 2017 | | | LG Electronics | 27MD5KL-B 显示器 | 4 | 3.0 |`043E:9A60`| 2019 | | | LG Electronics | 27GL850-B 显示器 | 4 | 3.0 |`0451:8142`| 2019 | | | LG Electronics | 27UK850-W 显示器 | 2 | 3.0 | | 2018 | | | LG Electronics | 27UN83A-W 显示器 | 2 | 3.0 |`0451:8142`| 2020 | | | LG Electronics | 38WK95C-W 显示器 | 4 | 3.0 |`0451:8142`| 2018 | | | Lenovo | ThinkPad Mini Dock Series 3 (433710U) | 6 | 2.0 |`17EF:100A`| 6 | | | Lenovo | ThinkPad Ultra 扩展坞 (40A20090EU) | 6 | 2.0 |`17EF:100F`| 2015 | | | Lenovo | ThinkPad Ultra 扩展坞 (40AJ0135EU) | 7 | 3.1 |`17EF:3070`| 2018 | | | Lenovo | ThinkPad X200 Ultrabase 42X4963 | 3 | 2.0 |`17EF:1005`| 2008 | 2011 | | Lenovo | ThinkPad X6 Ultrabase 42W3107 | 4 | 2.0 |`17EF:1000`| 2006 | 2009 | | Lenovo | ThinkPlus 4合1 USB-C 集线器 4X90W86497 | 3 | 3.0 | | 2021 | | | Lenovo | ThinkVision T24i-10 显示器 | 4 | 2.0 |`17EF:0610`| 2018 | | | Lenovo | USB-C 转 4 口 USB-A 集线器 ([仅限 USB2](https://github.com/mvp/uhubctl/issues/625)) | 4 | 2.0 |`17EF:103A`| 2020 | | | Lindy | USB 串口转换器 4 端口 | 4 | 1.1 |`058F:9254`| 2008 | | | Linksys | USB2HUB4 ([注](https://git.io/JYiDZ)) | 4 | 2.0 | | 2004 | 2010 | | Maplin | A08CQ ([仅限红色端口](https://tinyurl.com/gh635)) | 7 | 2.0 |`0409:0059`| 2008 | 2011 | | Metadot | Das Keyboard 4 | 2 | 3.0 | | 2014 | | | Microchip | EVB9512 | 2 | 2.0 | | 2009 | | | Microchip | EVB-USB2517 | 7 | 2.0 | | 2008 | | | Microchip | EVB-USB2534BC | 4 | 2.0 | | 2013 | | | Microchip | EVB-USB5807 | 7 | 3.0 | | 2016 | | | Moxa | Uport-407 | 7 | 2.0 |`110A:0407`| 2009 | | | NVidia | Jetson Nano B01 ([详情](https://git.io/JJaFR)) | 4 | 3.0 | | 2019 | | | NVidia | Jetson Xavier NX ([详情](https://tinyurl.com/Xavier-NX)) | 4 | 3.0 | | 2020 | | | Phidgets | HUB0003_0 | 7 | 2.0 |`1A40:0201`| 2017 | | | Philips | 346B1C UltraWide 34" 曲面显示器 | 4 | 3.0 |`05E3:0610`| 2019 | | | Plugable | USB3-HUB7BC | 7 | 3.0 |`2109:0813`| 2015 | | | Plugable | USB3-HUB7C (仅适用于 2 个充电端口) | 7 | 3.0 |`2109:0813`| 2015 | | | Plugable | USBC-HUB7BC (适用于 6/7 端口,最右边的除外) | 7 | 3.0 |`2109:0817`| 2021 | | | Plugable | USB3-HUB10-C2 (仅适用于 2 个充电端口) | 10 | 3.0 | | 2014 | | | Port Inc | NWUSB01 | 4 | 1.1 |`0451:1446`| 1999 | 2003 | | Raspberry Pi | B+, 2B, 3B ([见下文](#raspberry-pi-b2b3b)) | 4 | 2.0 | | 2011 | | | Raspberry Pi | 3B+ ([见下文](#raspberry-pi-3b)) | 4 | 2.0 |`0424:2514`| 2018 | | | Raspberry Pi | 4B ([见下文](#raspberry-pi-4b)) | 4 | 3.0 |`2109:3431`| 2019 | | | Raspberry Pi | 5 ([见下文](#raspberry-pi-5)) | 4 | 3.0 |`1D6B:0002`| 2023 | | | Renesas | uPD720202 PCIe USB 3.0 主机控制器 | 2 | 3.0 | | 2013 | | | Rosewill | RHUB-210 | 4 | 2.0 |`0409:005A`| 2011 | 2014 | | Rosonway | RSH-518C ([注](https://tinyurl.com/RSH518)) | 7 | 3.0 |`2109:0817`| 2021 | | | Rosonway | RSH-A10 ([见](https://tinyurl.com/2ppyyaj8)) | 10 | 3.0 |`0BDA:0411`| 2020 | | | Rosonway | RSH-A13 ([警告](https://tinyurl.com/RSH-A13)) | 13 | 3.1 |`2109:2822`| 2021 | | | Rosonway | RSH-A16 ([注](https://git.io/JTawg), [警告](https://tinyurl.com/RSH-A16)) | 16 | 3.0 |`0bda:0411`| 2020 | | | Rosonway | RSH-A37S | 7 | 3.0 |`2109:2822`| 2021 | | | Rosonway | RSH-A104 ([仅限 USB2](https://tinyurl.com/RSH-A104)) | 4 | 3.1 |`2109:2822`| 2022 | | | Rosonway | RSH-ST07C ([仅 4 个](https://tinyurl.com/4pjnujrn)) | 7 | 3.0 |`2109:2822`| 2023 | | | Rosonway | RSH-ST10C-6 ([注](https://tinyurl.com/428vpa2f)) | 10 | 3.1 |`0BDA:0423`| 2024 | | | Sanwa Supply | USB-HUB14GPH | 4 | 1.1 | | 2001 | 2003 | | Satechi | Mac Mini 集线器 (M1/M2) | 4 | 3.0 |`2109:2817`| 2023 | | | Seagate | Backup Plus Hub STEL8000100 | 2 | 3.0 |`0BC2:AB44`| 2016 | | | Seeed Studio | reTerminal CM4104032 | 2 | 2.0 |`0424:2514`| 2021 | | | StarTech | DKT30CSDHPD3 USB-C 旅行坞 | 3 | 3.0 |`2109:2817`| 2018 | | | StarTech | HB30A4AIB ([警告](https://tinyurl.com/ycxravwk)) | 4 | 3.0 |`2109:2817`| 2018 | | | StarTech | HB31C2A2CB ([注](https://github.com/mvp/uhubctl/issues/601)) | 5 | 3.0 |`14B0:013D`| 2020 | | | StarTech | HB31C3A1CPD3 ([注](https://github.com/mvp/uhubctl/issues/656)) | 5 | 3.1 |`14B0:013A`| 2019 | | | Sunix | SHB4200MA | 4 | 2.0 |`0409:0058`| 2006 | 2009 | | System Talks | Sugoi USB2-HUB4X ([警告](https://github.com/mvp/uhubctl/issues/636))|4|2.0| | 2007 | | | Targus | ACH155 (端口 3 控制所有端口) | 4 | 3.0 | | 2022 | | | Targus | PA095UZ | 2 | 2.0 | | 2004 | | | Targus | PAUH212/PAUH212U | 7 | 2.0 | | 2004 | 2009 | | Texas Instruments | TUSB4041PAPEVM | 4 | 2.1 |`0451:8142`| 2015 | | | UUGear | MEGA4 (适用于 Raspberry Pi 4B) | 4 | 3.0 |`2109:0817`| 2021 | | | VirtualHere | USB3 4 端口集线器 ([注](https://tinyurl.com/vhusb)) | 4 | 3.0 | | 2024 | | 此表格并不完整。 如果您的集线器能在 `uhubctl` 下正常工作,但未在上方列出,请在 https://github.com/mvp/uhubctl/issues 提交新问题进行报告,以便我们将其添加到支持列表中。在您的报告中,请提供准确的产品型号,附上 `uhubctl` 的输出,并请按照下方常见问题解答中的说明测试 VBUS 关闭支持。 请注意,相当多的现代主板都内置了支持此特性的根集线器——您甚至可能不需要购买任何外部集线器。 # USB 3.0 双重性说明 如果您将 USB 3.0 集线器连接到 USB3 上游端口,它将被检测为 2 个独立的虚拟集线器:USB2 和 USB3,并且您的 USB 设备将根据其能力和连接速度连接到 USB2 或 USB3 虚拟集线器。 要控制此类集线器的电源,必须**同时**关闭/开启 USB2 和 USB3 虚拟集线器上的电源,才能使关闭/开启电源的更改生效。`uhubctl` 会尝试自动执行此操作(除非您使用 `-e` 选项禁用此行为)。 不幸的是,虽然大多数集线器会切断 USB 数据连接,但有些可能仍不会切断端口的 VBUS,这意味着连接的手机可能仍会继续从被 `uhubctl` 关闭电源的端口充电。 # 安装 对于 Linux 和 MacOS,uhubctl 可在标准包管理器中使用,并可通过以下命令安装: * MacOS:`brew install uhubctl` 或 `sudo port install uhubctl` - :warning: MacOS 26+ [需要](https://github.com/libusb/libusb/pull/1700) libusb 1.0.30 或更高版本! * Ubuntu/Debian/Raspbian:`sudo apt install uhubctl` * Redhat/EPEL/Fedora/CentOS:`sudo yum install uhubctl` * OpenSUSE:`sudo zypper install uhubctl` * FreeBSD:`cd /usr/ports/sysutils/uhubctl && sudo make install` 但是,从标准包管理器安装的 uhubctl 可能不是最新版本,甚至可能远远落后于当前版本。如果[最新发布的](https://github.com/mvp/uhubctl/releases) uhubctl 版本比您的包管理器提供的版本新,您可能需要按照下文的说明从源代码编译并安装。 # 编译 此实用工具已经过测试,可以在 Linux(Ubuntu/Debian/Raspbian、Redhat/EPEL/Fedora/CentOS、Arch Linux、Gent、openSUSE、Buildroot)、FreeBSD、NetBSD、SunOS 和 MacOS 上编译和运行。 虽然 `uhubctl` 可以在 Windows 上编译,但 USB 电源切换在 Windows 上不起作用,因为 `libusb` 使用的是 `winusb.sys` 驱动程序,根据微软的说法,该驱动程序不支持[必要的 USB 控制请求](https://web.archive.org/web/20210225235523/https://social.msdn.microsoft.com/Forums/sqlserver/en-US/f680b63f-ca4f-4e52-baa9-9e64f8eee101/how-to-send-an-quotusb-control-requestquot-to-an-usbhub?forum=wdk)。 如果 `libusb` 在 Windows 上开始支持不同的驱动程序,这个问题可能会得到修复。 请注意,强烈建议安装实用程序 `pkgconf`(或 `pkg-config`)(通常默认已安装)。 首先,您需要安装库 libusb-1.0(需要 1.0.13 或更高版本,推荐 1.0.23 或更高版本): * Ubuntu:`sudo apt-get install libusb-1.0-0-dev pkgconf` * Redhat:`sudo yum install libusb1-devel pkgconf` * OpenSUSE:`sudo zypper install libusb-1_0-devel pkgconf` * MacOS:`brew install libusb pkgconf`,或 `sudo port install libusb-devel pkgconf` * FreeBSD:`pkg install gmake pkgconf`(默认包含 libusb) * NetBSD:`sudo pkgin install libusb1 gmake pkgconf` * Windows:待定? 获取 uhubctl 源代码并进行编译: ``` git clone https://github.com/mvp/uhubctl cd uhubctl make ``` 这将生成 `uhubctl` 可执行文件。 您可以使用以下命令将其作为 `/usr/sbin/uhubctl` 安装到您的系统中: ``` sudo make install ``` 请注意,在某些操作系统(例如 FreeBSD/NetBSD)上,您需要使用 `gmake` 来进行构建。 # 用法 列出所有支持的集线器: ``` uhubctl ``` 您可以像这样控制 USB 端口的电源: ``` uhubctl -a off -p 2 ``` 这表示在默认智能集线器上操作,并关闭(`-a off` 或 `-a 0`)端口 2(`-p 2`)的电源。支持的操作有 `off`/`on`/`cycle`/`toggle`(或 `0`/`1`/`2`/`3`)。 `cycle` 表示关闭电源,等待一段延迟(可通过 `-d` 配置)然后再重新打开。 端口可以是以逗号分隔的列表,并且可以使用 `-` 表示范围,例如 `2`,或 `2,4`,或 `2-5`,或 `1-2,5-8`。 如果您连接了多个智能 USB 集线器,您应该使用 `-l`(位置)参数选择要控制的具体集线器。 要查找集线器位置,只需运行不带任何参数的 `uhubctl`。 集线器位置看起来像 `b-x.y.z`,其中 `b` 是 USB 总线号,而 `x`、`y`、`z`... 是链路中所有集线器的端口号,从给定 USB 总线的根集线器开始。 此地址是半稳定的——如果您将 USB 设备插拔(或关闭/打开)到同一物理 USB 端口中,它不会改变(此方法也用于 Linux 内核中)。 # Linux USB 权限 在 Linux 上,您应该配置 `udev` USB 权限(否则您将必须使用 `sudo uhubctl` 以 root 身份运行它)。 从 Linux 内核 6.0 开始,有一个标准的接口来打开或关闭 USB 集线器端口,`uhubctl` 会尝试使用它(而不是 `libusb`)来设置端口状态。这就是为什么对于 6.0+ 内核会有额外的规则。在运行较旧内核版本的系统上保留这些规则并无害处。 要修复 USB 权限,首先运行 `sudo uhubctl` 并记下您需要控制的所有集线器的 `vid:pid`。然后,将如下所示的 udev 规则添加到文件 `/etc/udev/rules.d/52-usb.rules` 中(将 `2001` 替换为您的集线器供应商 ID,或完全移除 `ATTR{idVendor}` 过滤器以允许任何 USB 集线器访问): ``` SUBSYSTEM=="usb", DRIVER=="hub|usb", MODE="0666", ATTR{idVendor}=="2001" # Linux 6.0 或更高版本(在较旧的 Linux 内核中存在此 block 也是可以的): SUBSYSTEM=="usb", DRIVER=="hub|usb", \ RUN="/bin/sh -c \"chmod -f 666 $sys$devpath/*port*/disable || true\"" ``` 请注意,对于 USB3 集线器,某些集线器在同一个芯片的 USB2 和 USB3 组件上使用不同的供应商 ID,两者都需要权限才能使 uhubctl 正常工作。 例如,对于 Raspberry Pi 4B,您需要添加这两行(或移除 idVendor 过滤器): ``` SUBSYSTEM=="usb", DRIVER=="hub|usb", MODE="0666", ATTR{idVendor}=="2109" SUBSYSTEM=="usb", DRIVER=="hub|usb", MODE="0666", ATTR{idVendor}=="1d6b" ``` 如果您不喜欢 `0666` 这种完全开放的模式,您可以像这样按组限制访问: ``` SUBSYSTEM=="usb", DRIVER=="hub|usb", MODE="0664", GROUP="dialout" # Linux 6.0 或更高版本(在较旧的 Linux 内核中存在此 block 也是可以的): SUBSYSTEM=="usb", DRIVER=="hub|usb", \ RUN+="/bin/sh -c \"chown -f root:dialout $sys$devpath/*port*/disable || true\"" \ RUN+="/bin/sh -c \"chmod -f 660 $sys$devpath/*port*/disable || true\"" ``` 然后将允许的用户添加到 `dialout` 组: ``` sudo usermod -a -G dialout $USER ``` 要使您的 `udev` 规则更改生效,请重启或运行: ``` sudo udevadm trigger --attr-match=subsystem=usb ``` 为了您的方便,[这里](https://github.com/mvp/uhubctl/blob/master/udev/rules.d/52-usb.rules)提供了可以直接使用的 udev 规则。 # 常见问题解答 #### _什么是 USB 每端口电源切换?_ 根据 USB 2.0 规范,USB 集线器可以宣告无电源切换、联动(所有端口同时)电源切换或每端口(独立)电源切换。 请注意,默认情况下,`uhubctl` 只会检测支持每端口电源切换的 USB 集线器(但您可以使用 `-f` 选项强制它在不支持的集线器上尝试操作)。 您可以通过使用 `sudo lsusb -v` 来查找您的硬件支持哪种电源切换: 无电源切换: ``` wHubCharacteristic 0x000a No power switching (usb 1.0) Per-port overcurrent protection ``` 联动电源切换: ``` wHubCharacteristic 0x0008 Ganged power switching Per-port overcurrent protection ``` 每端口电源切换: ``` wHubCharacteristic 0x0009 Per-port power switching Per-port overcurrent protection ``` #### _如何检查我的 USB 集线器是否被 `uhubctl` 支持?_ 1. 运行 `sudo uhubctl`。如果您的集线器未列出,则它不受支持。 或者,您可以运行 `sudo lsusb -v` 并检查 `Per-port power switching` ——如果您在 lsusb 输出中看不到这样的行,则该集线器不受支持。 2. 检查对 VBUS(电压)关闭的支持:将手机、USB 灯 或 USB 风扇插入您集线器的 USB 端口。 尝试使用 `uhubctl` 关闭该端口的电源,并检查 手机是否停止充电、USB 灯是否停止发光或 USB 风扇是否停止旋转。 如果 VBUS 没有关闭,则您的集线器制造商未包含 实际切断电源的电路。这样的集线器仍然可以 用于切断 USB 数据连接,但它不能切断电源, 我们不认为这是受支持的设备。 3. 如果上述测试成功,请在 https://github.com/mvp/uhubctl/issues 提交新问题以报告您的集线器, 以便我们将其添加到支持的设备列表中。 请勿报告不受支持的集线器,除非它是某个已列出的受支持型号的不同硬件版本。 #### _在 Linux 上,端口断电后 USB 设备未被移除_ USB 端口断电后,udev 无法获取任何事件,因此它会保留设备文件。但是,尝试访问设备文件会导致 IO 错误。 这是 Linux 内核[问题](https://tinyurl.com/ym7yvuzw),在 uhubctl 2.5.0 中针对 Linux 内核 6.0 或更高版本的系统已[修复](https://github.com/mvp/uhubctl/pull/450)。 如果您仍在使用 Linux 5.x 或更早版本,您可以使用此替代方案来解决此问题: ``` sudo uhubctl -a off -l ${location} -p ${port} sudo udevadm trigger --action=remove /sys/bus/usb/devices/${location}.${port}/ ``` 设备文件将被 udev 移除,但 USB 设备在 `lsusb` 中仍将可见。 请注意,只有当设备在该端口上被检测到时,路径 `/sys/bus/usb/devices/${location}.${port}` 才会存在。 当您重新打开电源时,设备应能正确重新枚举(无需再次调用 `udevadm`)。 #### _在 Linux 上,电源几秒钟后又自动恢复_ 内核中的某些设备驱动程序对 USB 设备被关闭感到惊讶,并自动尝试重新为其通电。 这是 Linux 内核[问题](https://tinyurl.com/ym7yvuzw),在 uhubctl 2.5.0 中针对 Linux 内核 6.0 或更高版本的系统已[修复](https://github.com/mvp/uhubctl/pull/450)。 如果您仍在使用 Linux 5.x 或更早版本: 您可以使用选项 `-r N`(其中 N 是 10 到 1000 之间的某个数字)来修复此问题—— `uhubctl` 将尝试快速连续多次关闭电源,这应该可以抑制这种情况。 在使用 `uhubctl` 关闭电源之前,禁用相关设备的 USB 授权应该会有所帮助: ``` echo 0 > sudo tee /sys/bus/usb/devices/${location}.${port}/authorized ``` 如果您的设备是 USB 大容量存储设备,在调用 `uhubctl` 之前调用 `udisksctl` 应该也会有所帮助: ``` sudo udisksctl power-off --block-device /dev/disk/...` sudo uhubctl -a off ... ``` #### _检测到了多个 4 端口集线器,但我只连接了一个 7 端口集线器_ 许多集线器制造商使用基本的 4 端口 USB 芯片构建其 USB 集线器。 例如,要制作 7 端口集线器,他们会将两个 4 端口集线器菊花链连接起来——有 1 个端口因菊花链连接而丢失,因此就变成了 4+4-1=7 端口集线器。同样,10 端口集线器可以由 3 个 4 端口集线器 菊花链连接在一起构建而成,这提供了 4+4+4-2=10 个可用端口。 请注意,您绝不应尝试更改用于将内部集线器连接在一起的端口的电源状态。 这样做会扰乱内部集线器电路,并导致不可预测的行为。 #### _Raspberry Pi 会关闭所有端口的电源,而不仅仅是我指定的端口_ 这是 Raspberry Pi 硬件设计的局限性。 作为一种替代方案,您可以购买上面支持列表中的任何外部 USB 集线器,将其连接到 Raspberry Pi 的任何 USB 端口,并独立控制其端口的电源。 此外,也有专门为 Raspberry Pi 设计的受支持集线器,例如 UUGear MEGA4。 供参考,受支持的 Raspberry Pi 型号具有以下内部 USB 拓扑结构: ##### Raspberry Pi B+,2B,3B * 单集线器 `1-1`,端口 2-5 为联动控制,均由端口 `2` 控制: uhubctl -l 1-1 -p 2 -a 0 尝试控制端口 `3`、`4`、`5` 不会起任何作用。 端口 `1` 控制以太网+WiFi 的电源。 ##### Raspberry Pi 3B+ * 主集线器 `1-1`,所有 4 个端口均为联动控制,均由端口 `2` 控制(也会关闭次级集线器端口)。 端口 `1` 连接下方的集线器 `1-1.1`,端口 `2` 和 `3` 接到外部,端口 `4` 未接线。 uhubctl -l 1-1 -p 2 -a 0 * 次级集线器 `1-1.1`(与主集线器菊花链连接):3 个端口, 端口 `1` 用于以太网+WiFi,端口 `2` 和 `3` 接到外部。 ##### Raspberry Pi 4B * USB2 集线器 `1`,1 个端口,仅连接下方的集线器 `1-1`。 * USB2 集线器 `1-1`,4 个端口联动,与下方的 USB3 集线器 `2` 双重对应: uhubctl -l 1-1 -a 0 * USB3 集线器 `2`,4 个端口联动,与上方的 USB2 集线器 `1-1` 双重对应: uhubctl -l 2 -a 0 * USB2 集线器 `3`,1 个端口,OTG 控制器。[不支持](https://git.io/JUc5Q)电源切换。 ##### Raspberry Pi 5 Raspberry Pi 5 有两个 USB2 端口和两个 USB3 端口(共 4 个)。 这些端口以非常奇怪的配置连接到 4 个不同的 USB 集线器 `1`、`2`、`3`、`4` (但根据操作系统和硬件修订版的不同,目标集线器可能是 `2`、`3`、`4`、`5`)。 如果 USB3 设备连接到蓝色插座,它将在 USB3 集线器 `2` 或 `4` 上被检测到。 如果 USB2 设备连接到任何插座,或 USB3 设备连接到黑色插座, 它将在 USB2 集线器 `1` 或 `3` 上被检测到。 无论 USB2/USB3 连接类型如何,蓝色插座始终是端口 `1`,黑色插座始终是端口 `2`。 4 个板载 USB 集线器中的每一个都宣称支持每端口电源切换,但事实并非如此。 实际上,尽管属于 4 个不同的逻辑 USB 集线器,Raspberry Pi 5 的所有 4 个端口都联动在一个组中。 要关闭 VBUS 电源,必须禁用所有板载集线器和端口,使用以下命令: ``` uhubctl -l 2 -a 0 uhubctl -l 4 -a 0 ``` 要重新打开它: ``` uhubctl -l 2 -a 1 uhubctl -l 4 -a 1 ``` 请注意,只有在所有端口都关闭的情况下,VBUS 电源才会断开 启用任何一个端口都会恢复所有 4 个端口的 VBUS。 # 使用 uhubctl 的知名项目 | 项目 | 描述 | |:---------------------------------------------------------|:--------------------------------------------------------| | [摩斯密码 USB 灯](https://git.io/fj1F4) | 用 USB 灯闪烁摩斯密码信息 | | [网络摄像头 USB 灯](https://git.io/fj1FB) | 网络摄像头开启/关闭时开启/关闭 LED 灯 | | [影院灯箱](https://goo.gl/fjCvkz) | 从 iOS 家庭应用开启/关闭影院灯箱 | | [构建状态灯](https://goo.gl/3GA82o) | 在 10 分钟内创建一个构建状态灯 | | [Buildenlights](https://git.io/fj1FC) | 将 GitLab/GitHub 项目构建状态显示为绿灯/红灯 | | [气象站](https://goo.gl/3b1FzC) | 气象站死机时将其重置 | | [sysmoQMOD](https://tinyurl.com/sysmoQMOD) | 必要时重置蜂窝调制解调器 | | [雾霾传感器](https://tinyurl.com/smogsensor) | 基于 Raspberry Pi 的雾霾传感器断电重启 | | [糟糕集群 (Terrible Cluster)](https://goo.gl/XjiXFu) | 根据需要开启/关闭 Raspberry Pi 集群节点 | | [理想音乐服务器](https://tinyurl.com/ideal-m-srv) | 关闭未使用的 USB 端口以提高音频质量 | | [无幻象负载的 USB 驱动器](https://goo.gl/qfrmGK) | 仅在需要时为 USB 驱动器供电以节省电量 | | [USB 驱动器数据恢复](https://goo.gl/4MddLr) | 从出现故障的 USB 硬盘恢复数据 | | [控制 3D 打印机电源](https://git.io/fh5Tr) | 用于 USB 电源控制的 OctoPrint Web 插件 | | [Raspberry Pi 的 USB 风扇](https://tinyurl.com/fan-rpi) | 控制 USB 风扇以避免 Raspberry Pi 过热 | | [Raspberry Pi 重启路由器](https://tinyurl.com/rpi-rtr)| 如果互联网无法工作则自动重启路由器 | | [语音控制 USB 灯](https://tinyurl.com/usblmp)| 使用 Siri 和 Raspberry Pi 对 USB 灯进行语音控制 | | [控制 USB LED 灯带](https://tinyurl.com/usbleds) | 控制 USB 供电的 LED 灯带 | | [用 Raspberry Pi 酿造啤酒](https://git.io/JtbLd) | 使用 Raspberry Pi 的自动啤酒酿造系统 | | [网络摄像头工作中指示牌](https://tinyurl.com/uonair) | 摄像头在使用时自动点亮指示牌 | | [DIY PPPS](https://git.io/J3lHs) | 在您的 USB 集线器中焊接电线以支持 uhubctl | | [开源 PPPS 集线器](https://tinyurl.com/yckhystt) | uhubctl 兼容集线器的开源硬件项目 | | [uhubctl 的 Python 封装](https://github.com/nbuchwitz/python3-uhubctl) | 在 Python 中使用 uhubctl 的模块 | | [labgrid](https://github.com/labgrid-project/labgrid) | 在硬件上测试嵌入式 Linux 的框架 | | [热成像相机](https://tinyurl.com/5asne8hw) | 必要时开启/关闭机器人的热成像相机 | # 版权 版权所有 (C) 2009-2025 Vadim Mikhailov 此文件可以在 GNU 通用公共许可证第 2 版的条款和条件下分发。
标签:USB, 客户端加密, 电源管理, 硬件控制, 系统工具, 运维工具