背景
最近一直研究飞牛上的硬盘睡眠,发现SATA的盘,通过飞牛自带的硬盘休眠是没有问题的,但是SAS盘就不会睡眠。SATA盘可以通过hdparm工具(飞牛应该也是调用此工具),但是SAS盘不行,所以睡眠失败。那有什么办法可以让SAS睡眠呢?经过几天的研究,查资料、查freeNAS论坛等等,最后再配合飞牛系统设置,至少说是可以达到睡眠效果。
SAS睡眠也不算完美,主要还是因为飞牛系统有进程会调用smartctl会扫到SAS盘,自然就会唤醒,通过观察,手机APP、播放器、以及web打开进程管理、设置查看磁盘信息,这几类都会唤醒SAS。web打开进程管理不会唤醒SATA盘,但是会唤醒SAS盘。应该是与HBA直通卡有关,有关smartctl的都会通过HBA卡转给SAS盘,自然而然就会唤醒(猜测)。
第一步:
https://github.com/Seagate/ToolBin/blob/master/SeaChest/PowerControl/v3.7.1/linux/SeaChest_PowerControl_linux_x86_64

下载希捷EPC工具,我的是希捷的盘,其它品牌具体也没试过(没有其它盘),下载完后放到随便一个目录里面,在给执行权限。
chmod +x SeaChest_PowerControl_linux_x86_64
./SeaChest_PowerControl_linux_x86_64 -d /dev/sdb --showEPCSettings #查看硬盘EPC设置

A能省1w的电,响应最快
B能省3-4w的电,磁头卸载,硬盘电机全速转动
C能省4-5w的电,磁头卸载,硬盘电机降速转动
Standby Z 可以省全部电,磁头卸载,硬盘电机停止
我的SAS盘,使用小米功耗插座测试得出,待机状态下是5-7w,使用B是3w,使用C是2w,使用Z是0w
如果要使用B模式:
./SeaChest_PowerControl_linux_x86_64 -d /dev/sdd --idle_a disable --idle_b enable --idle_c disable --standby_z disable
如果要使用C模式:
./SeaChest_PowerControl_linux_x86_64 -d /dev/sdd --idle_a disable --idle_b disable --idle_c enable --standby_z disable
你应该能看出规律了,就是使用哪个模式哪个模式就enable,其它disable,或者B和C同时也行。
Name Current Timer Default Timer Saved Timer Recovery Time C S
Idle A 1 *1 1 1 Y Y
Idle B *1200 *1200 *1200 3 Y Y
Idle C 6000 6000 6000 20 Y Y
Standby Y 6000 6000 6000 20 Y Y
Standby Z 9000 9000 9000 110 Y Y
Current :*代表启用模式 数减一个0再除60就是多少分钟,比如B模式是1200=120/60=2分钟就进入此模式
设置好后,到时间就可以查询当前磁盘的模式,是不是省电了

第二步:
飞牛有个进程每15分钟,会smart查询所有盘,因此导致我设置好SAS睡眠,每15分钟就会被唤醒。

通过这个命令查询15分钟被唤醒的时候是什么进程
blktrace -d /dev/sdd -o - | blkparse -i - 2

/etc/smartd.conf 修改此配置文件,设置只检查sde的盘,因为我这块是SATA盘,接在主板上,没接在HBA卡上。上面一条是飞牛官方的检测命令,DEVICESAN是扫描系统上所有硬盘设备,所以把我的SAS盘也扫进去了。

systemctl restart smartd 修改完重启
检查服务,确认只扫sde盘

再去查看发现已经能够正常B模式,而且超过20多分钟没有被影响

我最后的设置策略是自己写脚本配合定时任务完成,白天30分钟无读/写就进入C模式,一小时后Z模式,也就是完全睡眠模式,晚上使用sg_start --stop 命令将SAS进行睡眠,早上7点sg_start --start唤醒睡眠。其实白天使用,建议还是不要完全睡眠,毕竟使用频率高,这个看个人使用,电机反复重启有寿命的。
这里说一下sg_start命令不会被系统进程所影响,如果执行此操作后,必须手动sg_start --start才能唤醒。这样有个好处就是晚上使用频率不高,如果使用SeaChest_PowerControl_linux_x86_64的话,如果有不知名的进程就还是会被唤醒。结合使用最好,本身晚上其实我都想关机,但我的主板没有网络唤醒功能,所以才用sg_start。
结尾:希望官方可以以此案例来将SAS卡睡眠继续完善到系统中,这里仅仅是个人成果分享,共享研究