kinslayer 发表于 2025-2-6 16:17

群晖完美的独立硬盘休眠,打造真正静音的NAS

本帖最后由 kinslayer 于 2025-2-12 23:52 编辑

绝对静音的Nas当然是纯闪Nas啦。。壕请无视~~
本文探讨在SSD和HDD组成的混合Nas中实现硬盘独立休眠,用哪块盘就只唤醒哪块,访问SSD不影响机械盘休眠,实现真正的静音!

先科普下群晖的分区方式
在群晖的默认分区中,所有盘都会划分出两个额外的分区,
以/dev/sata1为例
第一个/dev/sata1p1分区,8G,作为系统分区
第二个/dev/sata1p2分区,2G,作为swap分区
第三个/dev/sata1p3分区,用户自己的存储分区

所有盘位的P1分区加入/dev/md0组成Raid1,用作rootfs
所有盘位的P2分区加入/dev/md1组成Raid1,用作swap
其他分区用于用户自己组建存储池
在这个机制下,群晖的默认休眠机制非常保守和拉跨,一旦有任何硬盘活动,所有盘立刻全部唤醒,唤醒时还要等一会才能进系统,非常不爽。即使仅访问固态盘数据,机械盘也会不时咔咔响,无法独立休眠,希捷银河企业盘那个炒豆子的声音,你懂的。。

我的解决思路如下:
[*]将常用热数据存放在ssd,不常用的冷数据放到机械盘,机械盘作为仓库盘
[*]让操作系统仅活动在ssd上,将机械盘踢出系统Raid阵列
[*]弃用群晖的硬盘休眠,使用Linux的硬盘休眠实现独立硬盘休眠
[*]跟机械盘相关的定时任务,例如SMART,快照等,降低频度,安排集中的时段执行

我在用的是DS423+,4盘位

[*]1号和2号盘位:Intel S3510固态
[*]3号和4号盘位:希捷银河
[*]M2位置:西数SN850X

所有盘位都使用Basic方式,没有使用Raid。

在上述思路下,我对我的Nas做了以下调整

1号固态盘位存储套件及常用热数据:

[*]所有套件(除Docker外)
[*]homes (Drive套件使用)
[*]photo (照片)
[*]其他常用文件夹
如果套件已经安装在其他盘的,可以用
https://github.com/007revad/Synology_app_mover
这个脚本将套件转移到固态盘上
2号固态盘位作为下载盘:

[*]1. download (下载)

3号机械盘作为影音盘:

[*]音乐,电影 等不太常用的

4号机械盘位作为备份盘:

[*]homes、photo、套件及其他数据用hyperbackup定时备份

M2盘位:

[*]Docker套件及容器数据,SN850x有DRAM缓存,4K性能好,适合跑docker

群晖默认M2只能用做缓存,只有群晖自己的m2盘可以用作存储池
第三方m2可以用
https://github.com/007revad/Synology_HDD_db
将你的型号加入白名单,就可以创建存储池了。





以下操作需要一定的linux基础,新手操作前务必对重要数据做好备份!!!
以下操作需要一定的linux基础,新手操作前务必对重要数据做好备份!!!
以下操作需要一定的linux基础,新手操作前务必对重要数据做好备份!!!

ssh到nas,切换至root用户

ssh username@nas-ip
sudo -i
1. 首先找到各硬盘所对于的设备标识符
fdisk -l /dev/sata3
fdisk -l /dev/sata4
fdisk -l /dev/sata1
fdisk -l /dev/sata2


我这里 sata3 sata4是固态盘,sata1 sata2是机械盘

2. 将机械盘踢出系统Raid阵列,让系统仅运行在固态上
先执行
cat /proc/mdstat查看系统raid的状态,以及raid组成

然后分离机械盘,盘符根据实际情况调整
mdadm /dev/md0 --fail /dev/sata2p1
mdadm /dev/md0 --remove /dev/sata2p1
mdadm /dev/md0 --fail /dev/sata1p1
mdadm /dev/md0 --remove /dev/sata1p1

mdadm /dev/md1 --fail /dev/sata2p2
mdadm /dev/md1 --remove /dev/sata2p2
mdadm /dev/md1 --fail /dev/sata1p2
mdadm /dev/md1 --remove /dev/sata1p2
此时系统会弹出警告系统分区降级,可以无视,正常使用没有问题

如果你和我一样是强迫症患者,无法接受有系统警告,可以进行如下操作
mdadm --grow /dev/md0 --raid-devices=2
mdadm /dev/md0 --add /dev/sata2p1
mdadm /dev/md0 --add /dev/sata1p1

mdadm --grow /dev/md1 --raid-devices=2
mdadm /dev/md1 --add /dev/sata2p2
mdadm /dev/md1 --add /dev/sata1p2此操作的目的是将原有的raid数量从4减少到2,并将两块机械盘加入raid作为热备盘,


再次执行cat /proc/mdstat发现sata1和sata2上多了一个S标识(Spare),其主要功能是在raid的磁盘发生故障的时候自动替换掉故障磁盘,正常状态下不活动

这时候系统警告消失,进入下一步

3. 弃用群晖的硬盘休眠,启用Linux的硬盘休眠实现独立硬盘休眠
进行群晖网页控制面板->硬件与电源->硬盘休眠, 将休眠时间改成无
启动Linux的硬盘休眠
hdparm -S 120 /dev/sata2
hdparm -S 120 /dev/sata1SSD不要设置休眠,保证系统的快速响应

注意:后面的参数在1-240之间的时候,单位是5秒,从5秒至20分钟
在241和251之间的时候,减去240乘以30分钟,也就是30分钟至5.5小时

上面的120的意思是120*5=600秒,闲置10分钟后进入休眠状态,根据自己的需要设置合适的休眠时长

最后在控制面板->任务计计划->新增->触发的任务,在开机的时候以root身份执行上命令

4.监控休眠状态,找出无故唤醒的元凶
在技术支持中心->技术支持服务中,启用硬盘休眠调试模式

硬盘活动日志记录在 /var/log/hibermation.log 和 /var/log/hibermationFull.log中,这个日志会滚动压缩,你可能需要在压缩包中找到特定时间点的日志

将以下代码保存为hddmon.sh,注意这个脚本一定保存在固态上
#!/bin/bash

# Configuration
LOG_SERVER="127.0.0.1"
LOG_FILE="/tmp/hddmon.log"
STATE_FILE="/tmp/hddmon.txt"
DRIVES=("/dev/sata1" "/dev/sata2" "/dev/sata4")

# Ensure files exist
touch "$LOG_FILE" "$STATE_FILE"

log() {
    echo "$(date '+%m-%d %H:%M') $1" >> "$LOG_FILE"
    if [[ -n "$LOG_SERVER" ]]; then
      logger -n "$LOG_SERVER" --udp -p cron.info --tag "常规" "$1"
    fi
}

# Get drive states using a single hdparm command
drive_states=$(hdparm -C "${DRIVES[@]}" | awk '
    /^\/dev\// { device = $1 }
    /drive state is:/ {
      gsub(/:$/, "", device)
      print device ":" $NF
    }
')

# Process each drive state
changes=()
while IFS=: read -r device state; do
    if [[ -z "$device" ]]; then
      continue
    fi
   
    # Compare with previous state
    prev_state=$(grep -s "^$device:" "$STATE_FILE" | cut -d: -f2)
   
    if [[ "$prev_state" != "$state" ]]; then
      changes+=("$device: $state;")
      sed -i "\#$device#d" "$STATE_FILE"
      echo "$device:$state" >> "$STATE_FILE"
    fi
done <<< "$drive_states"

# Log changes if any
if [[ ${#changes[@]} -gt 0 ]]; then
    log "${changes[*]}"
fi
在控制面板->任务计划->新增->计划的任务,以root身份每分钟定时执行上述脚本

此脚本会监控硬盘的休眠状态,并在状态变更后记录到 /tmp/hddmon.log中
cat /tmp/hddmon.log查看休眠日志

如果发现中某个时间点无故唤醒,就去hibermation.log中去找原因,作出相应的调整

2月7日新增: 将休眠日志发送到群晖的日志中心
打开群晖 日志中心->接收日志-新增
日志格式选IETF格式


然后就能在日志中心中直接看到硬盘休眠和唤醒的日志记录了,跟内置的休眠功能一样,是不是很完美~



5.调整索引服务配置和日志的目录位置
经过上述调整后,查日志发现synoelasticd进程会经常唤醒硬盘,禁用SynoFinder服务后休眠就会恢复正常。
注:Universal Search无法从套件中心停止,需要通过命令 sudo synopkg stop SynoFinder 来停用
这是群晖的文件索引服务,如果需要使用Drive,不要停用,用下文的方法可以解决

检查

ls -l /var/packages/SynoFinder/etc/
ls -l /var/packages/SynoFinder/var/

这两个位置的软连接,如果不是在volume1 上,需要用以下命令将这两个文件夹挪到固态上

mv /volumeX/\@SynoFinder-etc-volume /volume1
mv /volumeX/\@SynoFinder-log /volume1

cd /var/packages/SynoFinder/etc
ln -sf /volume1/\@SynoFinder-etc-volume etc-volume

cd /var/packages/SynoFinder/var
ln -sf /volume1/\@SynoFinder-log log      
然后有个天坑,重启后这个修改又会恢复原样!

原因:群晖偷懒了,在服务重启、存储池创建、销毁、上线、离线等事件中,不论这俩文件夹是否受影响,都会直接简单粗暴的重建这两个文件夹,跑到机械盘上就无法休眠了
解决方法如下:
vim /var/packages/SynoFinder/scripts/start-stop-status
vim /var/packages/SynoFinder/target/scripts/syno_finder_fileindex_volume_create.sh
vim /var/packages/SynoFinder/target/scripts/syno_finder_fileindex_volume_delete.sh
vim /var/packages/SynoFinder/target/scripts/syno_finder_fileindex_volume_offline.sh
vim /var/packages/SynoFinder/target/scripts/syno_finder_fileindex_volume_online.sh
在这五个文件中,注释掉update_log_location和update_etc_location所在的两行
#${TOOL_DIR}/fileindex -a update_log_location -j "[]"

/usr/syno/bin/synosystemctl start pkg-SynoFinder-synoelasticd.service
${TOOL_DIR}/updater
# FIXME: restarting is bad, achieve settings reloading with socket command
#${TOOL_DIR}/fileindex -a update_etc_location -j "[]"

到这里,硬盘应该已经可以正常独立休眠了,每天大约会唤醒1-2次,如果你还有强迫症,请进行后续的进一步优化

5. 调整唤醒硬盘的定时任务
经过几天的监控,有几个任务会唤醒硬盘


[*]内置的定时任务builtin-libhwcontrol-disk_daily_routine每天晚上12点整硬盘会准时唤醒,进行硬盘smart检查,调整到每周进行一次。
vim /usr/syno/share/synocron.d/libhwcontrol.conf


从"0 0 ***"每天0:00执行,改成"0 10 * * 0"每周日10:00执行

[*]内置定时任务builtin-libsynostorage-syno_disk_db_update每天更新硬盘兼容性数据库,并进行兼容性检查,这个每月一次就够,完全禁掉也是可以的
vim /usr/syno/share/synocron.d/libsynostorage.conf
这里从daily改成monthly,每月一次
重启群晖的定时服务
systemctl restart synocrond
到这里基本上就OK了,白裙黑裙通用,可以做到不去访问机械盘上的数据,机械盘就不会唤醒,静音凉快又节能~

此方案最好使用两块ssd来实现,一块ssd理论上也是可以的,只是mdadm --grow命令需要加上force选项。
这样的话操作系统将失去Raid保护,万一主SSD挂了,就得重新装系统了,不过重装系统不影响p3分区,不会丢失重要用户数据

最后重要的事情说3遍:
勤备份!勤备份!勤备份!重要数据遵循3-2-1原则,硬盘有价数据无价!
ssd上的数据定期备份到机械盘,机械盘坏了还能开盘,ssd坏了数据没有任何修复可能,重要数据定期用cloudsync加密备份到百度云等云盘

探索不易,原创不易,各位欢迎各位大佬交流指点,转载请注明原作者和出处!


2月7日更新: 支持在群晖日志中心直接查看硬盘休眠日志。

2月9日更新: 添加硬盘指示灯控制。

经过逆向和测试,群晖可以通过sysfs的方式来控制指示灯

各指示灯sys路径如下
1号硬盘灯(/dev/sata3)/sys/class/leds/syno_led0
2号硬盘灯(/dev/sata4)/sys/class/leds/syno_led2
3号硬盘灯(/dev/sata1)/sys/class/leds/syno_led4
4号硬盘灯(/dev/sata2)/sys/class/leds/syno_led6

例如我想要控制4号盘位硬盘灯
强制灭灯,用root执行echo 0 > /sys/class/leds/syno_led6/brightness
恢复默认,用root执行echo syno_led6_ledtrig > /sys/class/leds/syno_led6/trigger

把这个整合到上面的定时脚本, 就可以控制某个硬盘唤醒的时候亮灯,休眠的时候熄灯
哪个在休眠哪个在干活更直观了。。
至此日志中心的休眠日志和指示灯都有了,完美替代系统休眠~~


ihainan 发表于 2025-2-6 16:38

我之前折腾威联通的就是,混合磁盘,使用 QTS 自带的休眠时,SSD 访问就会连带把 HDD 唤醒(已经踢出了 RAID),折腾了很久也没解决,最后直接换了全闪,整个世界安静了。

谢谢楼主好文,等周末我再继续研究一下。

qp6g3o 发表于 2025-2-6 16:47

不错好文,帮忙置顶~

VariedValiance 发表于 2025-2-6 16:52

不过,不过折腾到这份上也是没谁了

deihc 发表于 2025-2-6 17:03

CHH藏龙卧虎啊

zipvo 发表于 2025-2-6 17:12

能折腾到这份上,确实够厉害的。
我选择不休眠,黑裙扔客厅了。

kinslayer 发表于 2025-2-6 17:27

本帖最后由 kinslayer 于 2025-2-6 18:12 编辑

ihainan 发表于 2025-2-6 16:38
我之前折腾威联通的就是,混合磁盘,使用 QTS 自带的休眠时,SSD 访问就会连带把 HDD 唤醒(已经踢出了 RAI ...

群晖和威联通都有这个问题,即使系统分区脱离raid也无法做到独立休眠,所以一定要禁用系统的休眠,用hdparm来管理硬盘休眠,实现独立休眠

StevenG 发表于 2025-2-6 20:14

早3年看到楼主的帖子,可能就不会花大价钱玩全闪了[偷笑]

elgargui 发表于 2025-2-6 20:16

群主大神,但是,硬盘休眠真的好吗?

leecytp 发表于 2025-2-6 22:41

楼主大神!我不会折腾linux,所以选择了绿联+docker,各硬盘正常都能休眠。

kinslayer 发表于 2025-2-6 22:46

本帖最后由 kinslayer 于 2025-2-6 22:48 编辑

elgargui 发表于 2025-2-6 20:16
群主大神,但是,硬盘休眠真的好吗?
探索中非大神,频繁的启停不推荐。
本文所有的目标就是为了让硬盘尽量长时间处于休眠状态,非必要不唤醒。
这样的话,从功耗、噪音甚至寿命来说,都是有利的

kinslayer 发表于 2025-2-6 22:50

StevenG 发表于 2025-2-6 20:14
早3年看到楼主的帖子,可能就不会花大价钱玩全闪了

羡慕壕,全闪NAS才是究极形态啊!大容量固态实在太贵,搞不起。。。

kinslayer 发表于 2025-2-6 22:53

leecytp 发表于 2025-2-6 22:41
楼主大神!我不会折腾linux,所以选择了绿联+docker,各硬盘正常都能休眠。

绿联的系统装在板载eMMC存储上,反而没有群晖和威联通的休眠问题。

YsHaNg 发表于 2025-2-6 22:58

我懒 直接群晖全闪 hdd都拔出来扔unraid 反正旧pc放着也是放着 一堆垃圾攒攒现在还能跑llm

qhdxy 发表于 2025-2-7 00:14

kinslayer 发表于 2025-2-6 22:50
羡慕壕,全闪NAS才是究极形态啊!大容量固态实在太贵,搞不起。。。

我的思路是分开存

机械盘又响又耗电,非必要不开机,主打容量大,作为仓库盘

全闪的就性价比,有个4-8T的热数据,差不多满就把“热”数据变为“冷”数据

唯一缺点,要两台NAS

kinslayer 发表于 2025-2-7 09:18

qhdxy 发表于 2025-2-7 00:14
我的思路是分开存

机械盘又响又耗电,非必要不开机,主打容量大,作为仓库盘


是的,我就是这个思路,冷热分开,大约4T的固态空间基本满足我热数据的日常需求,机械盘作为仓库盘和备份盘,被动唤醒频率降低至一周
休眠状态下硬盘停转,省电又安静,唤醒也比开机要快很多。

netboy2008 发表于 2025-2-11 09:14

这个风险比较高吧 不小心把数据搞没了

飞翔 发表于 2025-2-11 09:34

群晖在每个盘上都独立划出一个系统分区没错,如果你不是24小时运行的应用,这些系统盘也是可以休眠的,我群晖亲身实践过,所以个人以为不需要删除系统分区。

不能休眠的应用主要包括photo/media/等等,还有一些系统log你要把他调整到某个分区上。

另外,不常用的HDD,我建议以外置硬盘方式插到群晖,基本上没有访问就是休眠的。

c2h6o 发表于 2025-2-11 09:34

对硬盘寿命没有任何好处。如果要冷备,直接脱机最好。

tyy474 发表于 2025-2-11 10:54

我的机械盘都是4T的酷狼,吵不起来,更何况是机械单独raid,储存池是10个M2,系统区是4个sata,噪音没,除非整机最高负载,就有风扇的声音,日差机子就在我2m位置,听不到声音的

kinslayer 发表于 2025-2-11 12:56

飞翔 发表于 2025-2-11 09:34
群晖在每个盘上都独立划出一个系统分区没错,如果你不是24小时运行的应用,这些系统盘也是可以休眠的,我群 ...

您说的没错,我在另外一篇帖子里面曾经写过这个方案,就是把log目录挂载到tmpfs,就可以实现整系统休眠。
但是我想要的是:
我在正常使用的时候,特别是使用固态数据的时候,不要去唤醒无关的硬盘,所以才有了这篇文章。

sleele 发表于 2025-2-11 22:08

楼主有没有试过,所有HDD通过NFS挂载到群晖,群晖只安一块SSD
我最近想把白裙换了,8盘的群晖性价比低,也没有新品
准备底层系统PVE,直通SSD到群晖,其他HDD通过NFS的方式挂载,感觉能够有效解决硬盘无法休眠和噪音问题

kinslayer 发表于 2025-2-12 09:07

sleele 发表于 2025-2-11 22:08
楼主有没有试过,所有HDD通过NFS挂载到群晖,群晖只安一块SSD
我最近想把白裙换了,8盘的群晖性价比低,也 ...

HDD通过在PVE上直接跑NFS,PVE基于debian系统,用PVE来管理硬盘休眠是可行的。
不过群晖很鸡贼,人家按盘位卖钱,外挂NFS、webdav跟移动硬盘盒一样使用受限,很多套件功能都只支持内置存储池。
外挂的存储在FileStaion里面浏览,或作为HyperBackup的目的地,或者在通过nfs挂载给docker用(一般发行版linux都支持,群晖上未验证不确定)

Neptrock 发表于 2025-2-12 14:59

我的型号是DS918+,系统版本是DSM7.1.1,硬盘类型和存放的数据和你还挺类似的:

1号盘位,固态硬盘:
        Basic,安装所有套件,存放所有常用文件,包括照片和音乐

2号盘位,固态硬盘:
        Basic,下载盘

3号和4号盘位,机械盘
        Raid1,存放影音文件和1号盘位中重要数据的备份

M2盘位,没装

================

我能直接抄作业吗?以及系统更新会不会有问题?[可爱]

LoongKwok 发表于 2025-2-12 15:14

想要单个硬盘休眠最简单的就是用unraid,把系统文件都放到固态,一个硬盘只做一个共享,访问这个硬盘的共享别的硬盘就不会唤醒。

kinslayer 发表于 2025-2-12 23:48

本帖最后由 kinslayer 于 2025-2-12 23:56 编辑

Neptrock 发表于 2025-2-12 14:59
我的型号是DS918+,系统版本是DSM7.1.1,硬盘类型和存放的数据和你还挺类似的:

1号盘位,固态硬盘:


我之前跟你的用法一模一样。。也是3和4组Raid1,后来空间不太够就把Raid拆成俩Basic了,重要数据加密后备份到云上

M2本来也非必须的,不影响操作。。

本文中的所有操作都不会破坏系统及内核,也不会影响系统更新。

中间经历过一次小版本更新,一切正常
大版本更新有可能会把所有盘重新加回RAID,再踢一次就好了

中间针对SynoFinder的修改部分,如果Universal Search套件有更新,可能也会被覆盖

目前我这完全不访问3、4号盘的工况下唤醒频率可以到一周一次,保持休眠日志开启,发现唤醒就去查下休眠日志,看是哪个定时任务或者是套件在搞事情。

欢迎大佬尝试,有任何问题可以随时私信交流

Neptrock 发表于 2025-2-13 07:07

kinslayer 发表于 2025-2-12 23:48
我之前跟你的用法一模一样。。也是3和4组Raid1,后来空间不太够就把Raid拆成俩Basic了,重要数据加密后备 ...

哈哈谢谢回复,等周末有空折腾一下看看

xblue 发表于 2025-2-13 09:56

mark标记,留存备用

redraiderj 发表于 2025-2-13 10:00

DSM6也能这么操作吗?一直没升7

kinslayer 发表于 2025-2-13 10:41

redraiderj 发表于 2025-2-13 10:00
DSM6也能这么操作吗?一直没升7

系统RAID这块6跟7的机制是一样的,区别是DSM6的系统分区更小只有2G

定时任务配置的位置、指示灯控制这块不确定,最好登上去看下确认下,位置是否一致。
手上没有DSM6的设备了,未验证
页: [1] 2
查看完整版本: 群晖完美的独立硬盘休眠,打造真正静音的NAS