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
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容