收起左侧

raid无法休眠

5
回复
190
查看
[ 复制链接 ]

1

主题

9

回帖

0

牛值

江湖小虾

2025-6-29 11:45:57 显示全部楼层 阅读模式

设备环境:

虚拟机:PVE 8.1.4(硬盘直通给fnOS)

局域网:内网

系统版本号:0.9.12

BUG现象:硬盘无法休眠

-四个4T硬盘组Raid 5,在0.9.8之前的版本可以正常休眠,升级之后无法休眠;

-用sudo blktrace -d /dev/sdx -o - | sudo blkparse -i -,观察四个盘超过15分钟,没有任何输出;

-另外有一个1T的单盘,没有组raid,可以正常休眠;

出现频率:必现

联系方式:手机/邮件

日志文件:可提供

收藏
送赞
分享

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

55

主题

9164

回帖

0

牛值

管理员

2025-7-4 16:52:07 显示全部楼层

关于0.9.10之后出现无法休眠的情况可以参考链接的说明进行排查 休眠问题排查攻略 ** 部分朋友疑惑旧版本系统可以看到休眠日志而新版无记录, 是因为以前的版本休眠是模糊检测,系统发了休眠指令就判断休眠了,实际设备的休眠情况并未主动识别。 0.9.10版本自定义休眠逻辑更新后,休眠判断更严格,会靠smart信息准确判断休眠,判断不了日志就不会不展示休眠 **包括不支持SMART检测的硬件,也不会在日志记录为休眠了,实际硬盘在新版本依然会自动休眠。

我让DeepSeek帮我写了个脚本,现在通过这个脚本就能正常休眠了。  详情 回复
2025-7-16 19:48

0

主题

24

回帖

0

牛值

江湖小虾

2025-7-4 18:16:20 显示全部楼层

我不看日志,都是直接摸硬盘的,0.98后就没休眠过,以前版本是真的休眠的,硬盘不转也不热

我也是啊!以前显示休眠,9.8后就没休眠过,硬盘也很热  详情 回复
2025-7-6 09:56

1

主题

7

回帖

0

牛值

江湖小虾

2025-7-6 09:56:13 显示全部楼层
petal 发表于 2025-7-4 18:16
我不看日志,都是直接摸硬盘的,0.98后就没休眠过,以前版本是真的休眠的,硬盘不转也不热
...

我也是啊!以前显示休眠,9.8后就没休眠过,硬盘也很热

1

主题

9

回帖

0

牛值

江湖小虾

2025-7-16 19:48:46 楼主 显示全部楼层
飞牛技术同学 发表于 2025-7-4 16:52
关于0.9.10之后出现无法休眠的情况可以参考链接的说明进行排查 休眠问题排查攻略 ** 部分朋友疑惑旧版本系 ...

我让DeepSeek帮我写了个脚本,现在通过这个脚本就能正常休眠了。
在fnOS里面的日志,依然是没有休眠的日志的,但在资管管理器里面看到的状态已经都是休眠中,而且整机功耗下降了30w,用hdparm -C查看状态也的确是standby。
所以为什么fnOS就没法正常休眠呢?



附脚本:
#!/bin/bash
# SPDX-License-Identifier: MIT
# spindown_multi.sh – spin down sdb..sdf after 15 min idle
# 2025-07-14

# 要监控的磁盘列表,可按需增删
DISKS=(/dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf)
INTERVAL_SEC=900
LOGFILE="/var/log/spindown_multi.log"

# 保存初始 I/O 统计的关联数组
declare -A last_read last_write

for d in "${DISKS[@]}"; do
    dev=$(basename "$d")
    read -r last_read[$dev] last_write[$dev] < <(
        awk -v d="$dev" '$3==d {print $6" "$10}' /proc/diskstats
    )
done

log() {
    echo "$(date '+%F %T') $*" | tee -a "$LOGFILE"
}

log "Started monitoring disks: ${DISKS
  • } (interval ${INTERVAL_SEC}s)"

    while :; do
        sleep "$INTERVAL_SEC"

        for d in "${DISKS[@]}"; do
            dev=$(basename "$d")
            read -r cur_read cur_write < <(
                awk -v d="$dev" '$3==d {print $6" "$10}' /proc/diskstats
            )

            [[ -z $cur_read || -z $cur_write ]] && continue

            read_inc=$(( cur_read  - last_read[$dev]  ))
            write_inc=$(( cur_write - last_write[$dev] ))

            if (( read_inc == 0 && write_inc == 0 )); then
                hdparm -y "$d" >/dev/null 2>&1
                [[ $? -eq 0 ]] && log "$d idle – spindown issued" \
                               || log "ERROR: hdparm -y failed on $d"
            else
                log "$d busy (r $read_inc / w $write_inc) – skipped"
            fi

            last_read[$dev]=$cur_read
            last_write[$dev]=$cur_write
        done
    done

  • 您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则