找回密码
 加入我们
搜索
      
查看: 7208|回复: 36

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

[复制链接]
发表于 2025-2-6 16:17 | 显示全部楼层 |阅读模式
本帖最后由 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用户

  1. ssh username@nas-ip
  2. sudo -i
复制代码

1. 首先找到各硬盘所对于的设备标识符
  1. fdisk -l /dev/sata3
  2. fdisk -l /dev/sata4
  3. fdisk -l /dev/sata1
  4. fdisk -l /dev/sata2
复制代码

Pasted image 20250206114618.png

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

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

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

  5. mdadm /dev/md1 --fail /dev/sata2p2
  6. mdadm /dev/md1 --remove /dev/sata2p2
  7. mdadm /dev/md1 --fail /dev/sata1p2
  8. mdadm /dev/md1 --remove /dev/sata1p2
复制代码

此时系统会弹出警告系统分区降级,可以无视,正常使用没有问题

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

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


再次执行
  1. cat /proc/mdstat
复制代码
发现sata1和sata2上多了一个S标识(Spare),其主要功能是在raid的磁盘发生故障的时候自动替换掉故障磁盘,正常状态下不活动
Pasted image 20250206120303.png
这时候系统警告消失,进入下一步

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

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

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

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

4.监控休眠状态,找出无故唤醒的元凶
在技术支持中心->技术支持服务中,启用硬盘休眠调试模式
Pasted image 20250206132757.png
硬盘活动日志记录在 /var/log/hibermation.log 和 /var/log/hibermationFull.log中,这个日志会滚动压缩,你可能需要在压缩包中找到特定时间点的日志

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

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

  7. # Ensure files exist
  8. touch "$LOG_FILE" "$STATE_FILE"

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

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

  23. # Process each drive state
  24. changes=()
  25. while IFS=: read -r device state; do
  26.     if [[ -z "$device" ]]; then
  27.         continue
  28.     fi
  29.    
  30.     # Compare with previous state
  31.     prev_state=$(grep -s "^$device:" "$STATE_FILE" | cut -d: -f2)
  32.    
  33.     if [[ "$prev_state" != "$state" ]]; then
  34.         changes+=("$device: $state;")
  35.         sed -i "\#$device#d" "$STATE_FILE"
  36.         echo "$device:$state" >> "$STATE_FILE"
  37.     fi
  38. done <<< "$drive_states"

  39. # Log changes if any
  40. if [[ ${#changes[@]} -gt 0 ]]; then
  41.     log "${changes[*]}"
  42. fi
复制代码
在控制面板->任务计划->新增->计划的任务,以root身份每分钟定时执行上述脚本
WX20250206-150238@2x.png
此脚本会监控硬盘的休眠状态,并在状态变更后记录到 /tmp/hddmon.log中
  1. cat /tmp/hddmon.log
复制代码
查看休眠日志
Pasted image 20250206132625.png
如果发现中某个时间点无故唤醒,就去hibermation.log中去找原因,作出相应的调整

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

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

WX20250207-132512@2x.png

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

这是群晖的文件索引服务,如果需要使用Drive,不要停用,用下文的方法可以解决

检查

  1. ls -l /var/packages/SynoFinder/etc/
  2. ls -l /var/packages/SynoFinder/var/
复制代码

这两个位置的软连接,如果不是在volume1 上,需要用以下命令将这两个文件夹挪到固态上
Pasted image 20250206135133.png
  1. mv /volumeX/\@SynoFinder-etc-volume /volume1
  2. mv /volumeX/\@SynoFinder-log /volume1

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

  5. cd /var/packages/SynoFinder/var
  6. ln -sf /volume1/\@SynoFinder-log log      
复制代码

然后有个天坑,重启后这个修改又会恢复原样!

原因:群晖偷懒了,在服务重启、存储池创建、销毁、上线、离线等事件中,不论这俩文件夹是否受影响,都会直接简单粗暴的重建这两个文件夹,跑到机械盘上就无法休眠了
解决方法如下:
  1. vim /var/packages/SynoFinder/scripts/start-stop-status
  2. vim /var/packages/SynoFinder/target/scripts/syno_finder_fileindex_volume_create.sh
  3. vim /var/packages/SynoFinder/target/scripts/syno_finder_fileindex_volume_delete.sh
  4. vim /var/packages/SynoFinder/target/scripts/syno_finder_fileindex_volume_offline.sh
  5. vim /var/packages/SynoFinder/target/scripts/syno_finder_fileindex_volume_online.sh
复制代码

在这五个文件中,注释掉update_log_location和update_etc_location所在的两行
  1. #${TOOL_DIR}/fileindex -a update_log_location -j "[]"

  2. /usr/syno/bin/synosystemctl start pkg-SynoFinder-synoelasticd.service
  3. ${TOOL_DIR}/updater
  4. # FIXME: restarting is bad, achieve settings reloading with socket command
  5. #${TOOL_DIR}/fileindex -a update_etc_location -j "[]"
复制代码
Pasted image 20250206140227.png

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

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

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

Pasted image 20250206142026.png

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

  • 内置定时任务builtin-libsynostorage-syno_disk_db_update每天更新硬盘兼容性数据库,并进行兼容性检查,这个每月一次就够,完全禁掉也是可以的
  1. vim /usr/syno/share/synocron.d/libsynostorage.conf
复制代码
Pasted image 20250206141801.png
这里从daily改成monthly,每月一次

重启群晖的定时服务
  1. 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

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


评分

参与人数 3邪恶指数 +50 收起 理由
strongtan + 20 支持一下
Neptrock + 20 支持一下
hawie + 10

查看全部评分

发表于 2025-2-6 16:38 | 显示全部楼层
我之前折腾威联通的就是,混合磁盘,使用 QTS 自带的休眠时,SSD 访问就会连带把 HDD 唤醒(已经踢出了 RAID),折腾了很久也没解决,最后直接换了全闪,整个世界安静了。

谢谢楼主好文,等周末我再继续研究一下。
发表于 2025-2-6 16:47 | 显示全部楼层
不错好文,帮忙置顶~
发表于 2025-2-6 16:52 | 显示全部楼层
不过,不过折腾到这份上也是没谁了
发表于 2025-2-6 17:03 | 显示全部楼层
CHH藏龙卧虎啊
发表于 2025-2-6 17:12 | 显示全部楼层
能折腾到这份上,确实够厉害的。
我选择不休眠,黑裙扔客厅了。
 楼主| 发表于 2025-2-6 17:27 | 显示全部楼层
本帖最后由 kinslayer 于 2025-2-6 18:12 编辑
ihainan 发表于 2025-2-6 16:38
我之前折腾威联通的就是,混合磁盘,使用 QTS 自带的休眠时,SSD 访问就会连带把 HDD 唤醒(已经踢出了 RAI ...


群晖和威联通都有这个问题,即使系统分区脱离raid也无法做到独立休眠,所以一定要禁用系统的休眠,用hdparm来管理硬盘休眠,实现独立休眠
发表于 2025-2-6 20:14 来自手机 | 显示全部楼层
早3年看到楼主的帖子,可能就不会花大价钱玩全闪了
发表于 2025-2-6 20:16 | 显示全部楼层
群主大神,但是,硬盘休眠真的好吗?
发表于 2025-2-6 22:41 | 显示全部楼层
楼主大神!我不会折腾linux,所以选择了绿联+docker,各硬盘正常都能休眠。
 楼主| 发表于 2025-2-6 22:46 | 显示全部楼层
本帖最后由 kinslayer 于 2025-2-6 22:48 编辑
elgargui 发表于 2025-2-6 20:16
群主大神,但是,硬盘休眠真的好吗?

探索中非大神,频繁的启停不推荐。
本文所有的目标就是为了让硬盘尽量长时间处于休眠状态,非必要不唤醒。
这样的话,从功耗、噪音甚至寿命来说,都是有利的
 楼主| 发表于 2025-2-6 22:50 | 显示全部楼层
StevenG 发表于 2025-2-6 20:14
早3年看到楼主的帖子,可能就不会花大价钱玩全闪了

羡慕壕,全闪NAS才是究极形态啊!大容量固态实在太贵,搞不起。。。
 楼主| 发表于 2025-2-6 22:53 | 显示全部楼层
leecytp 发表于 2025-2-6 22:41
楼主大神!我不会折腾linux,所以选择了绿联+docker,各硬盘正常都能休眠。

绿联的系统装在板载eMMC存储上,反而没有群晖和威联通的休眠问题。
发表于 2025-2-6 22:58 | 显示全部楼层
我懒 直接群晖全闪 hdd都拔出来扔unraid 反正旧pc放着也是放着 一堆垃圾攒攒现在还能跑llm
发表于 2025-2-7 00:14 | 显示全部楼层
kinslayer 发表于 2025-2-6 22:50
羡慕壕,全闪NAS才是究极形态啊!大容量固态实在太贵,搞不起。。。

我的思路是分开存

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

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

唯一缺点,要两台NAS
 楼主| 发表于 2025-2-7 09:18 | 显示全部楼层
qhdxy 发表于 2025-2-7 00:14
我的思路是分开存

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

是的,我就是这个思路,冷热分开,大约4T的固态空间基本满足我热数据的日常需求,机械盘作为仓库盘和备份盘,被动唤醒频率降低至一周
休眠状态下硬盘停转,省电又安静,唤醒也比开机要快很多。
发表于 2025-2-11 09:14 | 显示全部楼层
这个风险比较高吧 不小心把数据搞没了
发表于 2025-2-11 09:34 | 显示全部楼层
群晖在每个盘上都独立划出一个系统分区没错,如果你不是24小时运行的应用,这些系统盘也是可以休眠的,我群晖亲身实践过,所以个人以为不需要删除系统分区。

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

另外,不常用的HDD,我建议以外置硬盘方式插到群晖,基本上没有访问就是休眠的。
发表于 2025-2-11 09:34 | 显示全部楼层
对硬盘寿命没有任何好处。如果要冷备,直接脱机最好。
发表于 2025-2-11 10:54 | 显示全部楼层
我的机械盘都是4T的酷狼,吵不起来,更何况是机械单独raid,储存池是10个M2,系统区是4个sata,噪音没,除非整机最高负载,就有风扇的声音,日差机子就在我2m位置,听不到声音的
 楼主| 发表于 2025-2-11 12:56 | 显示全部楼层
飞翔 发表于 2025-2-11 09:34
群晖在每个盘上都独立划出一个系统分区没错,如果你不是24小时运行的应用,这些系统盘也是可以休眠的,我群 ...

您说的没错,我在另外一篇帖子里面曾经写过这个方案,就是把log目录挂载到tmpfs,就可以实现整系统休眠。
但是我想要的是:
我在正常使用的时候,特别是使用固态数据的时候,不要去唤醒无关的硬盘,所以才有了这篇文章。
发表于 2025-2-11 22:08 | 显示全部楼层
楼主有没有试过,所有HDD通过NFS挂载到群晖,群晖只安一块SSD
我最近想把白裙换了,8盘的群晖性价比低,也没有新品
准备底层系统PVE,直通SSD到群晖,其他HDD通过NFS的方式挂载,感觉能够有效解决硬盘无法休眠和噪音问题
 楼主| 发表于 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都支持,群晖上未验证不确定)
发表于 2025-2-12 14:59 | 显示全部楼层
我的型号是DS918+,系统版本是DSM7.1.1,硬盘类型和存放的数据和你还挺类似的:

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

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

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

M2盘位,没装

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

我能直接抄作业吗?以及系统更新会不会有问题?
发表于 2025-2-12 15:14 | 显示全部楼层
想要单个硬盘休眠最简单的就是用unraid,把系统文件都放到固态,一个硬盘只做一个共享,访问这个硬盘的共享别的硬盘就不会唤醒。
 楼主| 发表于 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号盘的工况下唤醒频率可以到一周一次,保持休眠日志开启,发现唤醒就去查下休眠日志,看是哪个定时任务或者是套件在搞事情。

欢迎大佬尝试,有任何问题可以随时私信交流
发表于 2025-2-13 07:07 来自手机 | 显示全部楼层
kinslayer 发表于 2025-2-12 23:48
我之前跟你的用法一模一样。。也是3和4组Raid1,后来空间不太够就把Raid拆成俩Basic了,重要数据加密后备 ...

哈哈谢谢回复,等周末有空折腾一下看看
发表于 2025-2-13 09:56 | 显示全部楼层
mark标记,留存备用
发表于 2025-2-13 10:00 | 显示全部楼层
DSM6也能这么操作吗?一直没升7
 楼主| 发表于 2025-2-13 10:41 | 显示全部楼层
redraiderj 发表于 2025-2-13 10:00
DSM6也能这么操作吗?一直没升7

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

定时任务配置的位置、指示灯控制这块不确定,最好登上去看下确认下,位置是否一致。
手上没有DSM6的设备了,未验证
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

Archiver|手机版|小黑屋|Chiphell ( 沪ICP备12027953号-5 )沪公网备310112100042806 上海市互联网违法与不良信息举报中心

GMT+8, 2025-4-25 12:18 , Processed in 0.017163 second(s), 7 queries , Gzip On, Redis On.

Powered by Discuz! X3.5 Licensed

© 2007-2024 Chiphell.com All rights reserved.

快速回复 返回顶部 返回列表