美文网首页OpenMediaVaultovmOMV5的探索之路
OMV查询硬盘休眠状态(Linux通用)【加料版】

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

作者: 锅巴安 | 来源:发表于2021-08-11 19:05 被阅读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
        
    

    相关文章

      网友评论

        本文标题:OMV查询硬盘休眠状态(Linux通用)【加料版】

        本文链接:https://www.haomeiwen.com/subject/gdmcbltx.html