移动硬盘省电一法

本文讨论如何用软件方式断开USB设备以实现联机USB设备的节电。

问题

买3D打印机时满减凑单,选了一个移动硬盘座。4盘位,想着把旧硬盘放上去,用来做备份用。为了全自动化,需要把移动硬盘座一直插在服务器上(服务器是Mac mini,装的Linux)。

《移动硬盘省电一法》 移动硬盘座和Mac mini

测了下硬盘座的功率:

  • 不插硬盘:5.6W
  • 插一个硬盘:14W
  • 插两个硬盘:21W

这个功率真不低。而且它也不会休眠节电啥的,不管有没有数据读写,一直是21W.

做备份用,其实每天只需要开机20分钟。本想用WiFi插座定时开关电源,结果硬盘座上有一个电子开关(非机械开关),上电时一定要按一下才能开机,真要命。

试了下umount,功耗也一样。

作为对比,西数的移动硬盘盒(含一个硬盘)在联机时功耗只有5.7W(这里可能有硬盘不同的因素,没有交叉对比),而且umount时功耗接近于0。所以,这个硬盘座有点鸡肋。

解决方案

我甚至想到了用机械指去按一下那个开机键。但这毕竟有点杀鸡牛刀。

经过观察发现,如果硬盘座开机但不联机,功耗也是大约6W。

剩下的问题就是看能不能用软件把USB断开。

搜寻网络,发现还是有办法的。但对不同的Linux内核,办法可能不同。长话短说,我们现在应该很少有机会碰到2.6及以前的内核了。那就只关心新内核上的做法:

echo "2-1.2" > /sys/bus/usb/drivers/usb/unbind
echo "2-1.2" > /sys/bus/usb/drivers/usb/bind

就是把设备标识写入USB驱动的unbind或bind文件,就能实现断开或连接USB的效果。

具体地说:

  • 先用 lsusb 看看设备的总线和设备编号(图中是总线2设备4);顺便记下设备的VID和PID(图中是152d和0567)
  • 然后用 lsusb -t 找到设备的端口(图中是总线2-端口1-端口2,所以魔法字符串是 “2-1.2″)

《移动硬盘省电一法》 用lsusb查看USB设备

这样就可以用 bind/unbind控制了,顺便看看这个目录的内容。bind/unbind两个文件是只写的,端口编号都是一些符号链接。

《移动硬盘省电一法》 USB drivers目录

实现

在主机重启的时候,这些端口编号是有可能变化的,所以不能用固定的数字,而是要把查找魔法字符串的过程自动化。

但上面用lsusb查找的方式并不很适合于程序。对程序更友好的方式是遍历 /sys/bus/usb/drivers/usb 的子目录,看哪个子目录里的 idVendor及idProduct 能和目标 VID及PID 匹配。

而在需要重新“插入”设备时,这些文件都不存在了(因为设备已断开),所以需要事先把魔法字符串保存下来。

另外,在服务器启动/重启后,需要马上将移动硬盘“断开”。

具体实现请看这里

效果

下图是通过小米ZigBee插座记录的功率历史。从4/27开始,每天凌晨一次备份任务,图中显示为一条竖线。4/27服务器有一次手动重启,所以图中有两条竖线。在4/26之前,理论上每天也只应该凌晨有一次峰值,但实际上并不规律。

《移动硬盘省电一法》 功率历史记录

下图是每日耗电。

《移动硬盘省电一法》 每日电量统计

理论上,在节电方案前应该是0.5度(21W*24h)左右。4/26因为在调试节电方案,反复重启,插拔,耗电很高是可以理解的。但平时的波动还是有点超出预期。

理论上,在节电方案后应该接近0.15度(6W*24h)。但图中相对较高的4/29都只有0.025度。这让我怀疑小米插座的功率计的准确性。

扩展应用

本文主要实现了通过软件断开USB移动硬盘(物理上,USB设备是一直上电和连接USB的),确认可以起到节电的效果。

这个方法适用于其它需要软件断开/连接USB设备的场合。但要注意,它并没有断开USB设备的供电(测试过手机充电),应该是相当于“数据线的断开”。所以,想用这种办法控制USB小夜灯或风扇之类的应该是不行的。

参考

    原文作者:萝卜头实验室
    原文地址: https://www.jianshu.com/p/702703051d7c
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞