1. 首页
  2. 科技数码

个人服务器 篇一:OMV查询硬盘休眠状态(Linux通用)【加料版】

###前言

一开始unraid转移到openmediavault的时候,就很纠结于omv是否需要给硬盘设置高级电源管理。这项操作在unraid里是很方便统一对硬盘进行设置的,但是在omv里需要逐一对于硬盘进行操作(尤其是我的硬盘柜总共有40+硬盘),而且也不是很明白高级电源管理里的各种选项,就一直很劝退……

但是电费单子下来之后,我觉得还是很有必要实操一下了。

我的硬盘柜主要是做半冷存储,主要是大量写入后,几乎不做改动,过了一定时间的存储期限后将其删除。

因此在我的使用场景下,没有很长期的频繁读写操作,所以我的电源管理设置是127,停转时间是30min。(也许后期会提高到60,需要运行一段时间看LoadCycleCount增长是不是很夸张再做决定)

###正题

###查询硬盘休眠状态

设置好硬盘的电源管理后,为了验证是否设置成功并有效的可以Standby已达到节能的目的,便搜索了一下相关内容,然后找到@龙天ivan 的文档

《OMV查询硬盘休眠状态(Linux通用)》 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等盘位

```

原文的作者也很好的写明白了一步一步的过程,所以很容易看明白是怎么写出这个脚本的。

基于此,跟着他的思路和方法,我跟着测试改写了一些代码,使其实现了更多更适合我的使用场景的功能。

###加料版结果

1.首先解决不能正确识别到sdaa等同类盘符的磁盘;

2.增加分割线方便阅读echo结果;

3.使用lsblk和grep将硬盘对应的路径和盘符大小标识出来,方便跟文件系统一一对应,使得结果更直观易读;

4.使用if语句判断硬盘状态,并使用颜色标记硬盘的不同状态,红色ACTIVE,绿色STANDBY,白色UNKOWN;

5.增加 if 嵌套语句判断除开 ACTIVE 和 STANDBY 之外状态的硬盘;

6.使用for语句将UNKNOWN状态的硬盘列举出来,并且在段落最后单独echo出数量以及具体盘符;



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

颜色标识状态/显示各状态硬盘数量/列出位置状态硬盘颜色标识状态/显示各状态硬盘数量/列出位置状态硬盘

###脚本完整版如下:

-简单阅读一遍可以直接抄作业,按照上文提到的@龙天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 "�33[30;42m STANDBY �33[0m"

let standby=$standby+1

else

echo -e "�33[37;41m ACTIVE �33[0m"

let active=$active+1

fi

done

else

echo -e "�33[30;47m UNKNOWN �33[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 "�33[37;41mActive Disk in Total=$active �33[0m";

echo -e "�33[30;42mStandby Disk in Total=$standby �33[0m";

echo -e "�33[30;47mUnknown Disk in Total=$unknown �33[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

```

###本文到此结束

使用愉快,以下内容只是作为我改写过程的记录,方便还原各个功能点引入时候的思路,感兴趣的可以看一下帮忙指正。

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 "�33[37;41m !Disk Stats! �33[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 "�33[30;42m STANDBY �33[0m";

elif [ $s == ACTIVE ]

then

echo -e "�33[37;41m ACTIVE �33[0m";

else

echo -e "�33[30;43m PLEASE CKECK �33[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 "�33[30;42m STANDBY �33[0m";

let standby=$standby+1

elif [ $s == ACTIVE ]

then

echo -e "�33[37;41m ACTIVE �33[0m";

let active=$active+1

else

echo -e "�33[30;43m UNKNOWN �33[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 "�33[37;41mActive Disk in Total=$active �33[0m";

echo -e "�33[30;42mStandby Disk in Total=$standby �33[0m";

echo -e "�33[30;47mUnknown Disk in Total=$unknown �33[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 "�33[30;42m STANDBY �33[0m"

let standby=$standby+1

else

echo -e "�33[37;41m ACTIVE �33[0m"

let active=$active+1

fi

done

else

echo -e "�33[30;47m UNKNOWN �33[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 "�33[37;41mActive Disk in Total=$active �33[0m";

echo -e "�33[30;42mStandby Disk in Total=$standby �33[0m";

echo -e "�33[30;47mUnknown Disk in Total=$unknown �33[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 "�33[30;42m STANDBY �33[0m"

let standby=$standby+1

else

echo -e "�33[37;41m ACTIVE �33[0m"

let active=$active+1

fi

done

else

echo -e "�33[30;47m UNKNOWN �33[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 "�33[37;41mActive Disk in Total=$active �33[0m";

echo -e "�33[30;42mStandby Disk in Total=$standby �33[0m";

echo -e "�33[30;47mUnknown Disk in Total=$unknown �33[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

```



原创文章,作者:夜风博客,如若转载,请注明出处:https://www.homedt.net/48113.html