Jack 发表于 2020-3-23 17:37:24

用命令控制华硕路由器 USB 接口的供电

本帖最后由 Jack 于 2020-3-28 11:21 编辑

警告:以下内容出于技术交流目的得以保留,这不代表我建议或暗示您使用任何形式的 USB 风扇,路由器的 USB 接口不存在可靠的过载保护,在路由器的 USB 接口上使用 USB 风扇不仅不会延长您的路由器寿命,还可能导致路由器提前寿终正寝。

顺便强调下:USB 规范中 2.0 接口仅有 5V 500mA 供电能力,且大部分厂商因为压缩成本都比这个指标缩水,用电需求超过规范的任何 USB 设备,都有可能导致路由器损坏。USB 风扇、USB 散热座用电需求通常远远超过这规范,切勿在路由器上使用。正确的做法使用手机电源适配器连接 USB 风扇为路由器散热,因为手机电源适配器是专业用于供电设计的,具备各种电路保护,轻易不会出现问题,即便因为风扇导致电源适配器损坏,也不会因而损坏您的路由器。




“事实证明真理总是比你想象得更简单。” — 理查德·费曼
"The truth always turns out to be simpler than you thought." -- Richard Feynman
随着路由器 CPU 频率地提高,路由器厂商越来越难以控制 SoC 的发热问题。“改散热”、“加风扇”、“换铜片”甚至“上水冷”这是大多数高端路由器玩家并不陌生的词汇。为了避免路由器过早地电器老化,不仅极客玩家们在这样做,厂商们也在发布采用“主动散热”的路由器。

楼主也不例外地购置过迷你的 USB 风扇用于夏天给“大火炉”降温。看到一些极客大神给风扇加装感温探头和编程芯片让风扇实现指定温度开启,实在是羡慕,但是动手能力太弱,就想着能否利用路由器自己的测温功能,通过脚本来开关 USB 供电来实现控制风扇开关。这个想法是好的,实际上大神们在外部加装探头和芯片来实现控制风扇前也尝试过这个想法,但是因为路由器的 Linux 系统经过了一系列精简,缺少必要的控制命令来控制 USB 接口供电,所以没有办法控制 USB 口供电。

我也在购置风扇后尝试寻找这个传说中的“USB 口电源控制”命令,但都是无功而返,昨天心血来潮根据 Asuswrt(华硕固件)所有可能的命令 逐个测试了一番,结果发现了“USB 口电源控制”命令。

这个命令就是:
hub-ctrl它不仅存在于 Asuswrt-Merlin(梅林)固件,也存在与 Asuswrt(原厂)固件中,实际上从源代码来看 ,至少已经存在了七年,之所以很难找是因为 Asuswrt 把 Linux 原生的 USB 电源控制功能给精简掉了,但替换为这种让人意想不到的第三方控制命令,就如帖子开头的名人所言,现在看来一切都非常简单。


语法帮助(已翻译成中文)
hub-ctrl --help
用法: hub-ctrl [{-h HUBNUM 集线器编号 | -b BUSNUM 总线编号 -d DEVNUM 设备编号}] \
          [-P PORT 接口] [{-p |-l }]
示例:
*   # hub-ctrl -v               // List hubs available 显示所有可用的集线器
*   # hub-ctrl -P 1               // Power off at port 1 关闭 USB 1 接口的电源
*   # hub-ctrl -P 1 -p 1          // Power on at port 1 开启 USB 1 接口的电源
*   # hub-ctrl -P 2 -l            // LED on at port 2 开启 USB 2 接口的 LED 灯

使用示例
以下示例脚本所做的是“当 CPU 温度高于 100 摄氏度时开启 USB 1 接口的供电,否则保持断电。”
#!/bin/sh
if [ "$(cat /sys/class/thermal/thermal_zone0/temp | sed 's/.\{3\}$/.&/')" -ge "100" ]; then
   hub-ctrl -P 1 -p 1
else
   hub-ctrl -P 1
fi注意:不同机型的路由器获取 CPU 温度的命令是不同的,示例中的命令 适用于 RT-AC86U 和其他 HND 机型,我曾经写过一个帖子介绍各种主流机型获取 CPU 温度的命令请参考下。
不要忘记将您的脚本设置为定时启动,比如下方这个示例是每半小时运行一次“我的脚本”。
cru a CTRLUSB "*/30 * * * * /jffs/scripts/我的脚本"

注意事项
1、该命令绝对不能使用在 USB 存储设备中,因为对 USB 存储设备断电将有可能导致您的数据丢失和设备损坏。如果您想切断 USB 的连接应该使用挂载和卸载命令,比如:(更多使用方法详见下方参考资料)
# 用 df -h 命令查看 USB 设备的名称
df -h
# 卸载您的 USB 设备
umount /tmp/mnt/磁盘名称
# 重新挂载您的 USB 设备
mount /dev/设备接口标识符 /tmp/mnt/磁盘名称2、关闭 LED 的这个命令“hub-ctrl -P 2 -l”,我自己测试的是不管用的,不过好在 ASUS 还有另外一套控制 LED 的命令,比如:(更多使用方法详见下方参考资料)# led_ctrl             LED灯编号          LED 灯状态(0 关 1 开)
# define LED_USB                        1
# define LED_USB3                     9
# 例如关闭 USB 2.0 的 LED 灯命令是:
led_ctrl 1 03、ASUS 工程师并没有推荐用户使用 USB 风扇,因为 USB 风扇可能导致路由器电压不稳,最后烧毁路由器电容,另外工程师曾说过,无需过度在意路由器温度,就拿 RT-AC86U 来说设计时确保了 100 摄氏度内可以正常运行,超过 100 摄氏度路由器还会自动采取措施降温。
4、对于使用该命令造成的一切后果请您自行承担,因为控制电源是属于硬件级别命令,不排除导致硬件损坏的风险。
5、最后友情提示下,用完 SSH 或 telnet 记得关闭,不关闭存在安全隐患。


角标
心血来潮的AC-68U魔性水冷改装
ASUS ROG GT4 —— 华硕AC68U水冷路由改装记
@ColinTaylor 提供的所有 Asuswrt 可用命令列表(英文)
Asuswrt-Merlin 源码显示出 hub-ctrl 命令至少存在固件中有 7 年之久
@sfx2000 提供的过滤 CPU 温度输出至纯数字的命令(英文)


参考资料
用户脚本 Merlin 百科(英文)
使用 cron 创建定时任务 Merlin 百科(英文)
定时重启 Merlin 百科(英文)
用命令磁盘格式化(其中介绍了挂载命令的使用)Merlin 百科(英文)
@Zonkd 详细介绍了一些 Merlin 上的控制磁盘命令(英文)
LED 控制方法 Merlin 百科(英文)
@RMerlin 介绍 LED 控制命令 led_ctrl 的语法(英文)
来自 Open-Wrt 论坛的 hub-ctrl 使用方法探讨(英文)
来自 DD-Wrt 论坛的切断 USB 供电方法探讨(英文)

© 本文由 Jack 原创,你可以自由地使用它,当然若署名转载将会被视为很有礼貌。

Jack 发表于 2020-3-23 17:40:50

本帖最后由 Jack 于 2020-3-26 08:42 编辑

:)

全池泼洒 发表于 2020-3-23 21:25:13

楼主辛苦了,谢谢楼主,感谢楼主分享,楼主好人一生平安!!!

arhao 发表于 2020-3-24 10:44:49

夏天就要来了,这个强,赞一个

sogoz 发表于 2020-3-30 14:54:07

多谢大神分享。

jayjames 发表于 2021-1-17 00:04:49

大佬,从KS追到这边,您开放RT-AC86U 160MHz的方法方便给一个么?很感兴趣想把自己的两台机器搞一下
页: [1]
查看完整版本: 用命令控制华硕路由器 USB 接口的供电