OpenMediaVaultovmOMV5的探索之路

OMV查询硬盘休眠状态(Linux通用)【加料版】

2021-08-11  本文已影响0人  锅巴安

前言

一开始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
    
上一篇下一篇

猜你喜欢

热点阅读