OMV查询硬盘休眠状态(Linux通用)【加料版】
前言
一开始unraid转移到openmediavault的时候,就很纠结于omv是否需要给硬盘设置高级电源管理。这项操作在unraid里是很方便统一对硬盘进行设置的,但是在omv里需要逐一对于硬盘进行操作(尤其是我的硬盘柜总共有40+硬盘),而且也不是很明白高级电源管理里的各种选项,就一直很劝退……
但是电费单子下来之后,我觉得还是很有必要实操一下了。
我的硬盘柜主要是做半冷存储,主要是大量写入后,几乎不做改动,过了一定时间的存储期限后将其删除。
因此在我的使用场景下,没有很长期的频繁读写操作,所以我的电源管理设置是127,停转时间是30min。(也许后期会提高到60,需要运行一段时间看LoadCycleCount增长是不是很夸张再做决定)
正题
查询硬盘休眠状态
设置好硬盘的电源管理后,为了验证是否设置成功并有效的可以Standby已达到节能的目的,便搜索了一下相关内容,然后找到@龙天ivan 的文档
《OMV查询硬盘休眠状态(Linux通用)》 https://www.jianshu.com/p/74f65ac27a2a
@龙天ivan 的文档使用下来体验良好,可以快速在不唤醒硬盘的情况下查阅硬盘IDLE状态,即Active或者Standby。
但是同时也到一定的问题,比如一开始无法正确获取硬盘sdaa /sdab 之类的盘符
dsk=`ls /dev/|grep 'sd[a-z]$'` #此代码只能识别三位字符盘符,不能识别如 sdaasdab 等驱动器名称
dsk=`ls /dev/sd* | grep -Po 'sd(a{2}|[a-z]+)$'` #修改为此即可获取sdaa/sdab等盘位
原文的作者也很好的写明白了一步一步的过程,所以很容易看明白是怎么写出这个脚本的。
基于此,跟着他的思路和方法,我跟着测试改写了一些代码,使其实现了更多更适合我的使用场景的功能。
以下提供两种输出界面的脚本
加料版结果A
1.首先解决不能正确识别到sdaa等同类盘符的磁盘;
2.增加分割线方便阅读echo结果;
3.使用lsblk和grep将硬盘对应的路径和盘符大小标识出来,方便跟文件系统一一对应,使得结果更直观易读;
4.使用if语句判断硬盘状态,并使用颜色标记硬盘的不同状态,红色ACTIVE,绿色STANDBY,白色UNKOWN;
5.增加 if 嵌套语句判断除开 ACTIVE 和 STANDBY 之外状态的硬盘;
6.使用for语句将UNKNOWN状态的硬盘列举出来,并且在段落最后单独echo出数量以及具体盘符;
...
颜色标识状态,显示各个状态硬盘数量,列出未知状态硬盘
A脚本完整版如下:
-简单阅读一遍可以直接抄作业,按照上文提到的@龙天ivan 的文档存储脚本,对脚本赋予权限即可。不在此赘述。
-需要注意的是,颜色标识在omv的计划任务里并不支持。
#!/bin/bash
#function-1:显示硬盘盘符+Lable+容量以及硬盘上电状态
#function-2:通过echo -e转义与if...elif...else语句使其active呈现红色,standby呈现绿色,方便快速检视硬盘上电情况
#function-3:原for循环语句中加入判断和循环计数方式,统计active和standby的数量
#function-4:增加 if 嵌套语句判断除开 active 和 standby 之外状态的硬盘,并将其标记为 unknown
#function-5:将unknown状态的硬盘列举出来(对for语句上瘾了……
dsk=`ls /dev/sd* | grep -Po 'sd(a{2}|[a-z]+)$'`
echo `date +%c`
standby=0
active=0
unknown=0
c=0
for i in $dsk;
do
echo -e "\n";
echo -e "-----------------------";
echo -n "/dev/$i : " ;
stats=`smartctl -i -n standby /dev/$i|grep "mode"|awk '{print $4}' `;
#echo $stats
if [[ $stats == STANDBY ]]||[[ $stats == ACTIVE ]]||[[ $stats == IDLE_A ]]
then
for s in $stats;
do
if [ $s == STANDBY ]
then
echo -e "\033[30;42m STANDBY \033[0m"
let standby=$standby+1
else
echo -e "\033[37;41m ACTIVE \033[0m"
let active=$active+1
fi
done
else
echo -e "\033[30;47m UNKNOWN \033[0m"
let unknown=$unknown+1
for un in $i
do
list[c]=$un
((c++))
done
fi
echo `lsblk /dev/$i|grep "/srv/dev-disk-by-label-"|awk '{print $7}' `;
echo `lsblk /dev/$i|grep "/srv/dev-disk-by-label-"|awk '{print $4}' `;
done
echo -e "\n";
echo -e "\033[37;41mActive Disk in Total=$active \033[0m";
echo -e "\033[30;42mStandby Disk in Total=$standby \033[0m";
echo -e "\033[30;47mUnknown Disk in Total=$unknown \033[0m";
#echo $c
echo -e "Unknown Disk list: ";
for((b=0;b<=$c;b++));
do
if [[ $b -lt $c ]]
then
echo ${list[b]}
fi
done
echo -e "\n";
exit
加料版B界面
更新输出结果界面B版脚本
#!/bin/bash
#function-1:显示硬盘盘符+Lable+容量以及硬盘上电状态
#function-2:通过echo -e转义与if...elif...else语句使其active呈现红色,standby呈现绿色,方便快速检视硬盘上电情况
#function-3:原for循环语句中加入判断和循环计数方式,统计active和standby的数量
#function-4:增加 if 嵌套语句判断除开 active 和 standby 之外状态的硬盘,并将其标记为 unknown
dsk=`ls /dev/sd* | grep -Po 'sd(a{2}|[a-z]+)$'`
echo `date +%c`
printf "%-11s %-10s %-40s %-10s\n" Disk Stats DiskLable Capacity
standby=0
active=0
unknown=0
c=0
for i in $dsk;
do
#echo -e "\n";
#echo -e "-----------------------";
printf "%-11s" /dev/$i:;
#echo -n -e "/dev/$i :\t" ;
stats=`smartctl -i -n standby /dev/$i|grep "mode"|awk '{print $4}'`;
#echo $stats
if [[ $stats == STANDBY ]]||[[ $stats == ACTIVE ]]||[[ $stats == IDLE_A ]]
then
for s in $stats;
do
if [ $s == STANDBY ]
then
# printf("[%-8s]" "\033[1;30;42m STANDBY \033[0m");
echo -e -n "\033[30;42mSTANDBY\033[0m"
printf "%-5s" ;
let standby=$standby+1
else
echo -e -n "\033[37;41mACTIVE \033[0m"
printf "%-5s" ;
let active=$active+1
fi
done
else
echo -e -n "\033[30;47mUNKNOWN\033[0m"
printf "%-5s" ;
let unknown=$unknown+1
for un in $i
do
list[c]=$un
((c++))
done
fi
#输出mountpoint之前判断是否mount
mountpoint=`lsblk /dev/$i|grep "/srv/dev-disk-by-label-"|awk '{print $7}'`;
if [[ $mountpoint == */srv/dev* ]]
then
printf "%-40s" "`lsblk /dev/$i|grep "/srv/dev-disk-by-label-"|awk '{print $7}'`";
else
echo -n Not Mounted! ;
fi
#printf "%-40s" "`lsblk /dev/$i|grep "/srv/dev-disk-by-label-"|awk '{print $7}'`";
printf "%-10s\n" `lsblk /dev/$i|grep "/srv/dev-disk-by-label-"|awk '{print $4}'`;
#echo -n -e "`lsblk /dev/$i|grep "/srv/dev-disk-by-label-"|awk '{print $7}'`\t";#lable
#echo -n -e "\t" #释义:-n 为echo输出后不换行 -e和\t组合表示插入tab制表符 方便输出统一格式
#echo -e `lsblk /dev/$i|grep "/srv/dev-disk-by-label-"|awk '{print $4}'`; #capacity
done
#各状态硬盘数量统计显示
echo -e "\n";
echo -e "\033[37;41mActive Disk in Total=$active \033[0m";
echo -e "\033[30;42mStandby Disk in Total=$standby \033[0m";
echo -e "\033[30;47mUnknown Disk in Total=$unknown \033[0m";
#echo $c
echo -e "Unknown Disk list: ";
for((b=0;b<=$c;b++));
do
if [[ $b -lt $c ]]
then
echo "/dev/${list[b]}"
fi
done
echo -e "\n";
exit
本文到此结束
使用愉快,以下内容只是作为我改写过程的记录,方便还原各个功能点引入时候的思路,感兴趣的可以看一下帮忙指正。
v1
#!/bin/bash
#function-1:显示硬盘盘符+Lable+容量以及硬盘上电状态
dsk=`ls /dev/|grep 'sd[a-z]$'` #此代码只能识别三位字符盘符,不能识别如 sdaasdab 等驱动器名称
dsk=`ls /dev/sd* | grep -Po 'sd(a{2}|[a-z]+)$'` #修改为此即可
echo `date +%c`
for i in $dsk;
do
echo -n "/dev/$i : " ; #显示盘符
echo `smartctl -i -n standby /dev/$i|grep "mode"|awk '{print $4}' `; #显示硬盘通电状态
echo `lsblk /dev/$i|grep "/srv/dev-disk-by-label-"|awk '{print $7} `; #显示硬盘 lable
echo `lsblk /dev/$i|grep "/srv/dev-disk-by-label-"|awk '{print $4}' `; #显示硬盘大小
echo -e "\n"; #换行
done
exit
v2
增加颜色显示加以区分,建立分割线,方便查看各硬盘
#!/bin/bash
dsk=`ls /dev/sd* | grep -Po 'sd(a{2}|[a-z]+)$'`
echo `date +%c`
for i in $dsk;
do
echo -e "\033[37;41m !Disk Stats! \033[0m";
echo -n "/dev/$i : " ;
echo `smartctl -i -n standby /dev/$i|grep "mode"|awk '{print $4}' `;
echo `lsblk /dev/$i|grep "/srv/dev-disk-by-label-"|awk '{print $7}' `;
echo `lsblk /dev/$i|grep "/srv/dev-disk-by-label-"|awk '{print $4}' `;
echo -e "\n";
done
exit
v3
增加条件判断
active 红色
stanby 绿色
check 黄色
#!/bin/bash
#function-1:显示硬盘盘符+Lable+容量以及硬盘上电状态
#function-2:通过echo -e转义与if...elif...else语句使其active呈现红色,standby呈现绿色,方便快速检视硬盘上电情况
dsk=`ls /dev/sd* | grep -Po 'sd(a{2}|[a-z]+)$'`
echo `date +%c`
for i in $dsk;
do
echo -e "-----------------------";
echo -n "/dev/$i : " ;
stats=`smartctl -i -n standby /dev/$i|grep "mode"|awk '{print $4}' `;
for s in $stats;
do
echo "$s"
if [ $s == STANDBY ]
then
echo -e "\033[30;42m STANDBY \033[0m";
elif [ $s == ACTIVE ]
then
echo -e "\033[37;41m ACTIVE \033[0m";
else
echo -e "\033[30;43m PLEASE CKECK \033[0m";
fi
echo `lsblk /dev/$i|grep "/srv/dev-disk-by-label-"|awk '{print $7}' `;
echo `lsblk /dev/$i|grep "/srv/dev-disk-by-label-"|awk '{print $4}' `;
echo -e "\n";
done
done
exit
v4
增加硬盘状态的数量统计
代码中对 unknown 的判断是无效的,下一个功能版本中修复。(原因为 stats 有可能返回为空 string
#!/bin/bash
#function-1:显示硬盘盘符+Lable+容量以及硬盘上电状态
#function-2:通过echo -e转义与if...elif...else语句使其active呈现红色,standby呈现绿色,方便快速检视硬盘上电情况
#function-3:原for循环语句中加入判断和循环计数方式,统计active和standby的数量
dsk=`ls /dev/sd* | grep -Po 'sd(a{2}|[a-z]+)$'`
echo `date +%c`
standby=0
active=0
unknown=0
for i in $dsk;
do
echo -e "\n";
echo -e "-----------------------";
echo -n "/dev/$i : " ;
stats=`smartctl -i -n standby /dev/$i|grep "mode"|awk '{print $4}' `;
for s in $stats;
do
if [ $s == STANDBY ]
then
echo -e "\033[30;42m STANDBY \033[0m";
let standby=$standby+1
elif [ $s == ACTIVE ]
then
echo -e "\033[37;41m ACTIVE \033[0m";
let active=$active+1
else
echo -e "\033[30;43m UNKNOWN \033[0m";
let unknown=$unknown+1
fi
echo `lsblk /dev/$i|grep "/srv/dev-disk-by-label-"|awk '{print $7}' `;
echo `lsblk /dev/$i|grep "/srv/dev-disk-by-label-"|awk '{print $4}' `;
done
done
echo -e "\n";
echo -e "\033[37;41mActive Disk in Total=$active \033[0m";
echo -e "\033[30;42mStandby Disk in Total=$standby \033[0m";
echo -e "\033[30;47mUnknown Disk in Total=$unknown \033[0m";
echo -e "\n";
exit
v5
增加功能 4
#!/bin/bash
#function-1:显示硬盘盘符+Lable+容量以及硬盘上电状态
#function-2:通过echo -e转义与if...elif...else语句使其active呈现红色,standby呈现绿色,方便快速检视硬盘上电情况
#function-3:原for循环语句中加入判断和循环计数方式,统计active和standby的数量
#function-4:增加 if 嵌套语句判断除开 active 和 standby 之外状态的硬盘,并将其标记为 unknown
dsk=`ls /dev/sd* | grep -Po 'sd(a{2}|[a-z]+)$'`
echo `date +%c`
standby=0
active=0
unknown=0
for i in $dsk;
do
echo -e "\n";
echo -e "-----------------------";
echo -n "/dev/$i : " ;
stats=`smartctl -i -n standby /dev/$i|grep "mode"|awk '{print $4}' `;
#echo $stats
if [[ $stats == STANDBY ]]||[[ $stats == ACTIVE ]]||[[ $stats == IDLE_A ]]
then
for s in $stats;
do
if [ $s == STANDBY ]
then
echo -e "\033[30;42m STANDBY \033[0m"
let standby=$standby+1
else
echo -e "\033[37;41m ACTIVE \033[0m"
let active=$active+1
fi
done
else
echo -e "\033[30;47m UNKNOWN \033[0m"
let unknown=$unknown+1
fi
echo `lsblk /dev/$i|grep "/srv/dev-disk-by-label-"|awk '{print $7}' `;
echo `lsblk /dev/$i|grep "/srv/dev-disk-by-label-"|awk '{print $4}' `;
done
echo -e "\n";
echo -e "\033[37;41mActive Disk in Total=$active \033[0m";
echo -e "\033[30;42mStandby Disk in Total=$standby \033[0m";
echo -e "\033[30;47mUnknown Disk in Total=$unknown \033[0m";
echo -e "\n";
exit
v6
#!/bin/bash
#function-1:显示硬盘盘符+Lable+容量以及硬盘上电状态
#function-2:通过echo -e转义与if...elif...else语句使其active呈现红色,standby呈现绿色,方便快速检视硬盘上电情况
#function-3:原for循环语句中加入判断和循环计数方式,统计active和standby的数量
#function-4:增加 if 嵌套语句判断除开 active 和 standby 之外状态的硬盘,并将其标记为 unknown
#function-5:将unknown状态的硬盘列举出来(对for语句上瘾了……
dsk=`ls /dev/sd* | grep -Po 'sd(a{2}|[a-z]+)$'`
echo `date +%c`
standby=0
active=0
unknown=0
a=0
b=0
c=0
for i in $dsk;
do
echo -e "\n";
echo -e "-----------------------";
echo -n "/dev/$i : " ;
stats=`smartctl -i -n standby /dev/$i|grep "mode"|awk '{print $4}' `;
#echo $stats
if [[ $stats == STANDBY ]]||[[ $stats == ACTIVE ]]||[[ $stats == IDLE_A ]]
then
for s in $stats;
do
if [ $s == STANDBY ]
then
echo -e "\033[30;42m STANDBY \033[0m"
let standby=$standby+1
else
echo -e "\033[37;41m ACTIVE \033[0m"
let active=$active+1
fi
done
else
echo -e "\033[30;47m UNKNOWN \033[0m"
let unknown=$unknown+1
for un in $i
do
list[c]=$un
((c++))
done
fi
echo `lsblk /dev/$i|grep "/srv/dev-disk-by-label-"|awk '{print $7}' `;
echo `lsblk /dev/$i|grep "/srv/dev-disk-by-label-"|awk '{print $4}' `;
done
echo -e "\n";
echo -e "\033[37;41mActive Disk in Total=$active \033[0m";
echo -e "\033[30;42mStandby Disk in Total=$standby \033[0m";
echo -e "\033[30;47mUnknown Disk in Total=$unknown \033[0m";
#echo $c
echo -e "Unknown Disk list: ";
for((b=0;b<=$c;b++));
do
if [[ $b -lt $c ]]
then
echo ${list[b]}
fi
done
echo -e "\n";
exit