问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

TrueNAS Scale硬盘休眠功能详解:设置、检测与问题排查

创作时间:
作者:
@小白创作中心

TrueNAS Scale硬盘休眠功能详解:设置、检测与问题排查

引用
1
来源
1.
https://blog.52dev.top/posts/truenas-scale---%E7%A1%AC%E7%9B%98%E4%BC%91%E7%9C%A0/

TrueNAS Scale系统中的硬盘休眠功能可以帮助降低功耗,但如何确保其正确运行并避免频繁唤醒导致的硬盘损坏?本文将详细介绍硬盘休眠的设置方法、检测方式以及遇到问题的解决方案。

概要

在NAS系统中,硬盘是主要的耗电部件。为了降低功耗,市面上常见的NAS系统都提供了硬盘休眠功能。本文将以TrueNAS Scale为例,分享硬盘休眠功能的设置方法、检测是否生效的方法,以及在使用过程中遇到的问题和解决方案。

设置方法

TrueNAS Scale的硬盘休眠功能设置步骤如下:

  1. 进入Storage → Disks → Edit → Power Management
  2. 配置参数:
  • HDD Standby:设置硬盘在多少分钟未活动后进入休眠状态(Alaways On表示永不休眠)
  • Advanced Power Management:选择Level 1,让硬盘停转以达到最低功耗运行

检测是否生效

为了确保硬盘休眠功能正常工作,可以编写一个shell脚本来定时检测硬盘状态。以下是具体的脚本内容:

#!/bin/bash
LOG_DIR="/root/disk_monitor"
mkdir -p $LOG_DIR
STATS_FILE="$LOG_DIR/spindown_stats.txt"
DEBUG_FILE="$LOG_DIR/spindown_debug.log"
DISKS=("/dev/sda" "/dev/sdb")
declare -A last_state
declare -A standby_count
declare -A active_count

# 初始化状态为 unknown
for disk in "${DISKS[@]}"; do
    last_state[$disk]="unknown"
    standby_count[$disk]=0
    active_count[$disk]=0
done

# 添加调试函数
debug_log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S'): $1" >> $DEBUG_FILE
}

# 更新统计信息的函数
update_stats() {
    local current_time="$1"
    local today=$(date '+%Y-%m-%d')
    
    echo "=== 统计信息 ($current_time) ===" > $STATS_FILE
    echo "今日日期: $today" >> $STATS_FILE
    echo "监控开始时间: $(head -n 1 $DEBUG_FILE 2>/dev/null | cut -d':' -f1 || echo $current_time)" >> $STATS_FILE
    echo "" >> $STATS_FILE
    
    for disk in "${DISKS[@]}"; do
        disk_name=$(basename $disk)
        echo "硬盘 $disk_name:" >> $STATS_FILE
        echo "- 进入休眠次数: ${standby_count[$disk]}" >> $STATS_FILE
        echo "- 唤醒次数: ${active_count[$disk]}" >> $STATS_FILE
        echo "" >> $STATS_FILE
    done
}

while true; do
    current_time=$(date '+%Y-%m-%d %H:%M:%S')
    
    for disk in "${DISKS[@]}"; do
        disk_name=$(basename $disk)
        current_state=$(hdparm -C $disk 2>/dev/null | grep "drive state" | awk '{print $NF}')
        
        # 添加调试信息
        debug_log "硬盘: $disk_name"
        debug_log "当前状态: $current_state"
        debug_log "上次状态: ${last_state[$disk]}"
        
        if [ "${last_state[$disk]}" != "$current_state" ]; then
            debug_log "状态发生变化"
            if [ "$current_state" = "standby" ]; then
                ((standby_count[$disk]++))
                debug_log "$disk_name 进入休眠,计数: ${standby_count[$disk]}"
            elif [ "$current_state" = "active/idle" ]; then
                ((active_count[$disk]++))
                debug_log "$disk_name 被唤醒,计数: ${active_count[$disk]}"
            fi
            
            # 更新状态前记录
            debug_log "更新状态: ${last_state[$disk]} -> $current_state"
            last_state[$disk]=$current_state
            # 更新状态后验证
            debug_log "更新后的状态: ${last_state[$disk]}"
            
            update_stats "$current_time"
        else
            debug_log "状态未变化"
        fi
        
        debug_log "-------------------"
    done
    
    # 日志轮转(保持最近7天的日志)
    find $LOG_DIR -name "spindown_debug.log.*" -mtime +7 -delete 2>/dev/null
    if [ $(stat -c%s "$DEBUG_FILE" 2>/dev/null) -gt 1048576 ]; then  # 1MB
        mv $DEBUG_FILE "$DEBUG_FILE.$(date '+%Y%m%d')"
    fi
    
    sleep 300  # 每5分钟检查一次
done

使用tmux来管理会话:

  • 启动tmux会话并运行脚本:

    tmux new -s disk_monitor
    chmod 777 ./disk_monitor.sh
    ./disk_monitor.sh
    
  • 分离会话:

    _# 按 Ctrl+B 然后按 D_
    
  • 列出会话:

    tmux ls
    
  • 重新连接到会话:

    tmux attach -t disk_monitor
    

查看统计信息:

# 统计信息
cat /root/disk_monitor/spindown_stats.txt
# debug日志
cat /root/disk_monitor/spindown_debug.log

遇到的问题

硬盘被周期性唤醒

通过观察日志和功耗发现,NAS在待机状态下硬盘会频繁被唤醒,每30分钟唤醒一次。经过排查,发现是smartd服务每隔半小时检测硬盘温度导致的唤醒。

在系统日志中可以看到相关记录:

root@truenas[~/disk_monitor]# cat /var/log/syslog | grep "smartd"
Dec  3 00:23:10 truenas smartd[2631]: Device: /dev/sda [SAT], SMART Usage Attribute: 190 Airflow_Temperature_Cel changed from 71 to 74
Dec  3 00:23:10 truenas smartd[2631]: Device: /dev/sda [SAT], SMART Usage Attribute: 194 Temperature_Celsius changed from 29 to 26
Dec  3 00:53:11 truenas smartd[2631]: Device: /dev/sda [SAT], SMART Usage Attribute: 190 Airflow_Temperature_Cel changed from 74 to 75
![](https://wy-static.wenxiaobai.com/chat-rag-image/4758139939875330232)
Dec  3 00:53:11 truenas smartd[2631]: Device: /dev/sda [SAT], SMART Usage Attribute: 194 Temperature_Celsius changed from 26 to 25
Dec  3 01:22:55 truenas smartd[2631]: Device: /dev/sdb [SAT], SMART Usage Attribute: 194 Temperature_Celsius changed from 240 to 250

解决方案是关闭smartd服务:

# 停止服务
systemctl stop smartd
# 禁用服务
systemctl disable smartd
# 检查状态
systemctl status smartd

官方文档提到,在硬盘休眠时温度监控会被禁用,但实际情况可能有所不同。尝试禁用特定硬盘的S.M.A.R.T.,但看起来它还是会被定期执行,怀疑是System Settings → Services → S.M.A.R.T.设置的原因。建议将Power Mode修改为非Never。

参考:https://www.truenas.com/docs/scale/scaleuireference/systemsettings/services/smartservicesscreen/

总结

TrueNAS Scale的硬盘休眠功能可以帮助降低功耗,但在设置后需要密切关注硬盘是否频繁被唤醒。如果发现频繁唤醒,应及时排查原因,避免频繁启停导致硬盘损坏。在设置硬盘休眠策略时,可以根据实际需求进行调整,并注意观察运行效果。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号