凌晨三点发的这篇帖子,值得每个群晖机主收藏
9月27日凌晨3点27分,知乎上线了一篇标题很长的修复记录:《vmware+黑群晖数据盘文件系统修复与数据恢复全记录-by豆包》。开篇第一句是"实名感谢豆包!!!折磨我2年的NAS数据恢复问题一朝得解"。一台运行群晖DSM 7.1.1-42951的DS918+虚拟机,因异常断电导致数据盘上的Btrfs元数据损坏,DSM起不来、重装也持续失败,盘里那个3TB卷(使用率93.5%、卷标还是2023年3月建的)的照片和视频,就这么躺了整整两年。知乎
单看这是一篇硬核折腾帖。但往前翻你会发现,它不是孤例:7月24日、8月29日、9月27日,65天里三篇独立记录,症状几乎一模一样——硬盘健康全绿、存储池却报"已损毁"、卷固定以只读方式挂载。 8月29日那篇回答下面马上有人跟帖:"一样的问题,状态:已损毁,但是可以正常读取。"小红书上更早有一篇《群晖反复只读,已经没招了》,评论区攒了50条求助,帖主凌晨三点还在截告警列表。 群晖圈里那句"买软件送硬件"的老梗,到这里有了下半句:软件送的还有"已损毁"三个红字。这三篇记录坏的位置各不相同,但叠在一起看,恰好能拼出一张完整的排查地图——在DSM弹出红色"已损毁"的那一天,先别动手,先分清你坏在哪一层。小红书

硬盘"已损毁"和红字,经常不是一回事
把三篇记录拆开,是三个不同层级的病:
7-24案例(阵列层):黑群晖裸机重启后,单盘Basic存储池显示"已损毁",数据卷只读挂载,但Linux MD阵列仍能识别数据分区,Btrfs也读得出来——问题出在MD层给唯一成员盘打上了faulty标记。作者数了一下,当时约有241GB数据在只读状态下仍可正常读取。知乎
8-29案例(DSM状态层):盘没问题、阵列clean、`btrfs check --readonly`跑出err is 0,文件系统结构完好——但每次重启DSM都把卷挂成只读。最后定位到DSM内部状态文件里残留的`access_type=ro`:真正决定启动后读写模式的,不是文件系统,是DSM自己记的那笔旧账。 手动remount,rw能写,一重启又回到ro,就是这一层的典型症状。知乎
9-27案例(Btrfs元数据层):断电瞬间被写错的只是根树里4个leaf的元数据(EXTENT_TREE的ROOT_ITEM把level和generation写岔了,磁盘上那份旧的extent tree其实完整可读),但所有标准工具在open_ctree阶段就被拦下,restore、check、mount全军覆没。
三个病,同一个红字。第一篇记录里有句话值得抄下来贴在机柜上:DSM的"硬盘健康"和"存储池状态"不是同一个概念,SMART状态正常,并不代表其所在的MD阵列或文件系统一定正常。知乎

一个反常识:群晖的"魔改",连标准工具都会误判
9-27这篇记录里最有信息量的部分,是作者对群晖Btrfs的两个实测发现:
校验和长度不是4字节。 该群晖卷采用BTRFS_CSUM_SIZE=32,而Linux标准默认是4字节——头部整体后移,标准工具按4字节解析自然全部错位,早期出现"缺页/偏移假象"就是这么来的。知乎
0x400000000是群晖自定义rootflags位。 根树leaf里散布57处这个标志位,内核tree-checker不认识,统一报`invalid root flags`。作者用dd直接读出报错节点,内容结构完全正常,判定是"误报损坏"。
作者最后是在Kali虚拟机里从源码编译了一套打补丁的btrfs-progs,按群晖实际布局重算校验和(`~crc32c(data[32:])`实测全部匹配),一次命中58处修改点完成最小修复,最终以`mount -o ro,usebackuproot`只读挂载成功,把照片视频目录整个读了出来。
这个发现对普通机主的意义:此前社区反复讨论"群晖盘插进飞牛读不出",讲的是拔盘搬家时"魔改Btrfs"的坑;这一篇讲的是它的镜像面——就算你不拔盘、就在原厂工具链里,"损坏"两个字也未必是物理事实,可能是翻译失败。 证据只能覆盖到案例本身,不能反推所有红字都是误报,但至少说明:看到红字先定性,是成本最低的一步。
单盘用户的两条坏消息和一条好消息
两篇记录都提到同一个架构细节:群晖就算你建的是单盘Basic存储池,底层仍是单成员的Linux MD(RAID1形式)——看着像镜像,其实只有一个成员,盘一旦被打上faulty,池子立刻整体标红,零容错。知乎
这轮对比里还有一个实物对照组:9月14日小红书一篇《群晖NAS单盘踩坑|8T酷狼磁头损坏救援》,DS220+只插一块硬盘长期使用,某天硬盘直接识别不到,电商设计部的图纸和详情页随磁头一起没了。小红书

它和前面三篇的区别值得每个机主记住:症状页面上都是"数据读不出",但那三篇盘是好的、数据还在,这一篇盘真死了。 前者急不得,后者等不得——区分它们,靠的就是分层检查。
坏消息说完了,好消息是:盘真没坏的时候,只读挂载恰恰是DSM的保护动作——它拒绝写入,是为了防止继续破坏。7-24案例里那241GB数据,就是在只读状态下安全拷出来的。
三条红线,全是这三篇记录用真机踩出来的
把三篇记录里的"不要"合并去重,恰好是动手前最该背下来的三条:
红线一:先备份,哪怕"只是看一眼修复教程"。 9-27作者动手前先把64KB superblock和4个原始leaf备份在/tmp,因此两次`btrfs check --repair`先后以"事务abort"和"No space left"失败后,仍能全身而退——他在记录里明确写了"两次尝试均未破坏任何数据"。7-24作者更进一步:数据特别重要的话,先用ddrescue做扇区级克隆,修复动作全在克隆盘上做。知乎
红线二:不重建阵列、不盲目–repair。 删除存储池或重新创建阵列可能覆盖MD元数据,把本来可读的数据变成难以恢复——这是7-24案例的第一警告;`btrfs check --repair`只允许在"有完整备份+明确错误类型"两个条件同时成立时考虑——8-29案例特意做了对比:只读check干净、手动RW能写,病根在DSM状态层,这种时候跑–repair纯属自残。知乎
红线三:不要用force掩盖问题。 阵列重组只允许`mdadm --assemble`不允许`–create`;如果仍显示[E]/FAILED或返回I/O错误,立即停止,不要反复`–force`;挂载占用不要`umount -f/-l`硬来,先去套件中心停掉占用卷的套件(尤其Docker);设备名、阵列UUID没确认前,任何教程里的命令都不能照抄——三篇记录无一例外都在强调,8-29那篇甚至把自己的流程直接标注为"高风险、非官方支持"。

四层自查顺序:从免费到花钱
综合三篇记录的操作清单,普通机主可以照着走一个由浅入深的排查漏斗:
SMART层:别只看DSM界面的"健康良好"。7-24案例发现黑群晖磁盘映射有问题时,`smartctl`会按SCSI设备访问、拿不到真实属性,要显式加`-d sat`透传;重点看坏道重分配/挂起扇区是否继续增长,以及换盘位、换线之后dmesg里的CRC错误是否归零——8-29案例正是靠"换盘位后错误不再增长"排除了盘片问题。
阵列层:`cat /proc/mdstat`和`mdadm --detail`看成员是[U]还是[E];注意MD元数据版本(0.90/1.2)识别失败不等于分区丢了。
文件系统层:只允许`btrfs check --readonly`,错没错、错在哪,先记录再决定下一步;卷用得很满的(两篇案例分别是93.5%和97%)尤其避免任何写入型操作。
DSM状态层:前三层全健康而卷仍固定ro,问题大概率在DSM自己的持久化状态里——这一层官方不支持自行修复,建议带着前三层的输出找专业支持。

三条路怎么选
只读还能进、数据要保:先拷贝,后修机。只读挂载恰恰是拷贝窗口,7-24案例就是这么操作的。
元数据损坏、结构仍可辨(9-27型):有条件做离线环境(Kali/PE挂救援盘)+最小化手工修复,前提是先镜像。这篇记录的另一个信号是:作者全程由AI辅助完成协议解析、补丁编译、校验和重算——两年前这类活基本只能"找大佬",现在AI把执行门槛打下来了,但读懂命令、识别红线的能力仍不可替代。
I/O错误反复、没有备份、自己看不懂输出:停手,找Synology官方或专业数据恢复。9-27案例里"DiskGenius裸扫只拿到碎片、视频大半不播放"就是拖延成本的实物证据;正规恢复的第一步,通常是对整块盘做扇区级镜像、再在镜像上作业。

至于预防,上次聊UPS那篇讲的是"买不买",这里只补两条零成本的:断电重启之后,先看清池子状态再动手,别一上来就点修复——群晖官方资料也把意外断电列为卷损毁和文件系统错误的常见原因之一。 Btrfs卷定期跑数据清理(scrub),有问题它比DSM首页更早告诉你。知乎
那篇凌晨帖的结尾,作者把挂载成功的子卷清单列了出来:@syno、媒体库、homes——两年的照片视频,就这样回来了。如果你的群晖也见过那块红牌,欢迎把四层自查的输出贴到评论区对一对;这篇的清单,值得现在就收藏,赌它用不上。