ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

黑群晖断电后存储池损毁?SSH+mdadm命令急救指南

黑群晖断电后存储池损毁?SSH+mdadm命令急救指南 黑群晖断电后存储池“已损毁”别慌SSH里这几条命令能救急“存储池已损毁”——这句话几乎是每个玩黑群晖的人早晚都要经历的“成人礼”。我自己第一次撞见是一个夏夜全小区跳闸第二天爬起来打开 DSM存储池状态直接变成灰色点进去一行大字“已损毁”。我当时心跳比硬盘转速还快脑子里已经开始盘算哪年的照片没备份了。但吃完这几年的亏我越来越确定一件事黑群晖断电后出现的“已损毁”绝大多数情况下是一次“保护性停机”不是数据被物理抹掉。你真正要做的不是格式化、不是重建池而是通过 SSH 进去用几条 mdadm 和 LVM 命令让系统重新识别那些本来就还在硬盘上的数据。这篇文章就把整套急救流程、每条命令背后的原理、以及我踩过的坑一次性讲透适合手头有黑群晖、遇到断电重启后存储池异常的朋友照着操作。1. 断电后的恐慌现场先弄明白“已损毁”到底在说什么1.1 黑群晖存储池的三层结构要理解为什么断电会触发“已损毁”得先看黑群晖的存储池在 Linux 层面到底是怎么搭起来的。它的结构大致分三层最底层是物理硬盘上的分区比如 sda3、sdb3、sdc3这些分区通过 mdraid 组成 RAID 阵列中间层是 mdraid 阵列对应的设备是 /dev/md0、/dev/md1、/dev/md2其中 md0 放系统引导分区md1 放 swapmd2 通常是你的数据卷最上层是 LVM逻辑卷管理DSM 会把阵列空间切成物理卷PV、卷组VG、逻辑卷LV再在 LV 之上格式化 ext4 或 Btrfs 文件系统。SHRSynology Hybrid RAID本质上也是这套组合只不过它用 mdraid 实现不同 RAID 级别拼接再用 LVM 把各盘分区统一汇聚成一个卷供 DSM 使用。所以你会看到黑群晖拿 4 块盘做的 SHR 或 RAID5对应到 Linux 上就是一个 md2下面挂着 4 个分区成员。1.2 断电到底打断了什么正常关机时系统会执行一套“体面退场”流程内核把内存里的脏页dirty pages刷到磁盘文件系统卸载umount日志正确关闭mdadm 把每个成员的 superblock 状态从 dirty 更新为 cleanLVM 把卷组标记为 inactive干净退出。突然断电这套流程全部被打断。具体表现在两个地方第一RAID superblock 的 State 字段还停留在 dirty。superblock 是写在每个盘分区开头的一段元数据相当于整组 RAID 的“工作证”上面记录了 UUID、阵列级别、成员清单、事件计数和状态。断电瞬间各盘写入进度不一致Event Count事件计数没有对齐。内核下次启动时发现状态不是 clean或者各盘事件计数差异过大就会采取保守策略不自动激活阵列。于是 md2 保持在 inactive 状态DSM 的 UI 上就显示“存储池已损毁”。第二如果 md2 没有被正确激活叠在它上面的 LVM 卷组就成了无源之水pvscan 找不到可用的物理卷/volume1 自然无法挂载。所以“已损毁”大概率是一个软件层面的保护性停机是系统不确定阵列状态干脆先不碰它等你裁决。你要做的不是“重建”而是“让系统重新识别已经存在的数据”。1.3 三个故障层级的判断框架我习惯把断电后的“已损毁”按层级分成三类方便快速定位故障层级典型现象恢复难度出现概率mdraid 阵列未组装/proc/mdstat 无 md2 或 md2 为 inactive低最高LVM 卷组未激活pvscan/vgscan 找不到卷组或显示 inactive低次之文件系统受损挂载失败、目录缺失、Btrfs checksum 错误中较低无论你遇到哪一种都建议按“从下往上”的顺序排查先确认物理盘健康再组装 mdraid再激活 LVM最后处理文件系统。跳过任何一步都可能把问题搞得更大。2. 进场第一步SSH 开通、登录和五分钟硬件排雷2.1 开通 SSH 并登录黑群晖默认不开 SSH需要先到“控制面板 → 终端机和 SNMP → 启用 SSH 功能”这里打开。端口默认 22如果你为了安全改过端口后面连接时记得带上 -p 参数。连接方式Windows 用户可以用 Windows Terminal 自带的 OpenSSH 客户端或者 Xshell、PuTTYmacOS 和 Linux 用户直接终端敲 ssh 命令即可。命令格式是ssh admin192.168.1.100这里有两个坑要先提醒DSM 6 和 DSM 7 都不允许 root 直接登录你需要用 admin 账号或你创建的管理员账号登录然后再执行 sudo -i 切换到 root。如果 SSH 连接失败先检查 DSM 的防火墙是否放行了 22 端口再检查你登录的账号是否属于 administrators 组。黑群晖有时候会因为引导盘问题导致一些服务异常SSH 起不来那就得先解决引导和网络问题这属于另一个话题。登录并提权ssh admin192.168.1.100 sudo -i看到提示符变成 root 开头说明你已经进入 root 状态下面所有命令都基于这个状态执行。2.2 第一眼读 /proc/mdstat进入系统后第一件事不是去执行什么恢复命令而是先看一眼阵列当前的真实状态cat /proc/mdstat正常输出长这样Personalities : [raid1] [raid6] [raid5] [raid4] md2 : active raid1 sdc3[1] sdb3[0] sdd3[3] sda3[2] 17513607064 blocks super 1.2 [4/4] [UUUU] md1 : active raid1 sdd2[1] sda2[0] 2092288 blocks [2/2] [UU] md0 : active raid1 sdd1[1] sda1[0] 2490176 blocks [2/2] [UU] unused devices: none怎么读这段输出md2 后面如果是 active说明阵列已经组装完成如果是 inactive说明阵列存在但内核没有激活它——这正是断电后最常见的状态[4/4] [UUUU] 表示 4 个成员全部在线如果看到 [3/4] [UUU_]说明有一个成员掉了blocks 后面显示的是阵列总容量super 1.2 是 metadata 版本。最常见的断电后输出是md2 : inactive sdc3[1] sdb3[0] sdd3[3] sda3[2] 17513607064 blocks super 1.2成员分区都在但 md2 没有启动。看到这个心里先松一半盘都认识只是没跑起来。2.3 dmesg 和 SMART先排除硬件雷在动任何“组装”操作之前花五分钟排除硬件问题能避免你后面白折腾一小时。先看内核日志dmesg | tail -n 100重点搜索这些关键词dmesg | grep -E I/O error|Buffer I/O|ata.*fail|link reset|exception Emask如果出现大量 I/O error说明某块盘在硬件层面已经有读写失败这不是单纯断电导致的“假死”后面操作要更加保守。接着检查 SMART 信息。DSM 自带 smartctl可以直接用smartctl -a /dev/sda重点关注三个指标Reallocated_Sector_Ct重映射扇区数持续增长说明盘在物理磨损Current_Pending_Sector待处理扇区非零说明盘有坏道在排队UDMA_CRC_Error_Count如果这个值高可能要检查数据线或背板接口。真实案例我有一次处理一台断电后“已损毁”的黑群晖四块盘里三块 superblock 都正常只有一块盘的 Event Count 差了 10 万以上SMART 显示 pending sector 已经上千。这种情况下不是执行 --force 强行组阵列而是需要先判断这块盘的数据是不是已经不可信甚至要考虑直接从备份恢复。先做硬件排查再谈软件恢复顺序不能反。3. 核心救急命令组合从阵列重组到卷激活再到挂载验证3.1 mdadm 重组让内核重新认识 RAID确认硬件没问题后就该处理“inactive”的 md2 了。标准动作分三步。第一步如果 md2 已经存在且状态是 inactive先把它停掉避免状态残留mdadm --stop /dev/md2如果提示 device busy说明有进程还在引用它。先检查有没有挂载mount | grep md2确认没有挂载再用 lsof 或 fuser 找出占用进程。绝大多数情况下不会 busy因为 DSM 都还没挂载这个卷。第二步尝试全自动扫描组装mdadm --assemble --scan这条命令会让内核在系统已知的 superblock 元数据里去匹配所有磁盘分区把能组装的阵列都组装起来。执行完再看一次 /proc/mdstatcat /proc/mdstat如果 md2 从 inactive 变成了 active直接跳到 3.2。如果 --scan 没成功多半是 mdadm 的配置文件 /etc/mdadm.conf 里没有正确记录阵列信息或者各盘 superblock 的事件计数差异过大。第三步手动指定成员组装。先用 lsblk 拿到盘和分区布局lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT你会看到类似这样的结构sda 3.6T ├─sda1 2.4G linux raid autodetect ├─sda2 2G linux raid autodetect └─sda3 3.6T linux raid autodetect sdb 3.6T ├─sdb1 2.4G linux raid autodetect ├─sdb2 2G linux raid autodetect └─sdb3 3.6T linux raid autodetectsda3、sdb3 这一类就是数据卷 md2 的候选成员。不要凭感觉猜用 mdadm --examine 去每个分区上读 superblock确认它们的 UUID 是否一致、事件计数差多少mdadm --examine /dev/sda3 /dev/sdb3 /dev/sdc3 /dev/sdd3输出里最关键的是几行Array UUID所有成员必须一致不一致说明有盘不属于这个阵列Event Count同一个阵列内各盘的这个数值应该接近差距过大说明某块盘长时间离线State显示 clean、active 还是 degraded。如果四个分区的 UUID 一致就可以手动组装mdadm --assemble /dev/md2 /dev/sda3 /dev/sdb3 /dev/sdc3 /dev/sdd3如果 mdadm 因为事件计数不一致拒绝组装你需要先评估差距再决定是否加 --force。关于 --force 的底线我在第 5 章专门说。组装成功后md2 应该变成 active。记住到这一步你只是把 RAID 层恢复还没让 DSM 看到卷。3.2 LVM 卷激活最容易被忽略的一环md2 active 之后下一步是激活 LVM。很多新手在这里卡住因为 mdstat 看着一切正常但 /volume1 依然挂不上。原因很简单DSM 在 LVM 之上LVM 卷组没激活文件系统自然无影无踪。依次执行三条扫描命令pvscan vgscan lvscan正常输出会看到PV /dev/md2 VG vg1 lvm2 [16.36 TiB / ...] LV /dev/vg1/lv1 VG vg1 lvm2 [15.99 TiB ...]如果你看到的卷组状态不是 active或者 lvscan 里 LV 路径存在但卷没有激活执行vgchange -ay这条命令会把系统里所有卷组激活。激活后检查ls -l /dev/mapper/ lvdisplay看到类似 /dev/mapper/vg1-lv1 的设备节点说明 LVM 层已经恢复。这里说一个判断重点如果 pvscan 什么 PV 都找不到大概率不是 LVM 元数据损坏而是 md2 其实还没真正 active。LVM 扫描不到底层设备自然找不到 PV。所以遇到“找不到卷组”先回头确认 /proc/mdstat 里 md2 是不是 active别急着怀疑 LVM 元数据坏了。真有元数据损坏时可以考虑 vgcfgrestore 从备份恢复但那个场景极少而且需要你之前做过 vgcfgbackup。3.3 文件系统检查与最终挂载验证LVM 激活后别急着让系统自动挂载。你可以先做一次只读检查评估文件系统状态fsck -n /dev/mapper/vg1-lv1这条命令的 -n 参数表示“只读检查不修复”非常关键。它能告诉你在没有写操作的情况下文件系统里有没有 inode、块引用之类的问题。注意执行 fsck 前必须确认文件系统没有被挂载否则会有风险。如果 DSM 已经自动挂载了卷你需要先卸载umount /volume1如果 umount 提示 busy说明有进程在使用可以先用 fuser -km /volume1 踢掉占用进程再卸载。实在卸不掉可以临时把卷挂载为只读来复制数据mount -o ro /dev/mapper/vg1-lv1 /mnt/rescue多数情况下断电后的 ext4 或 Btrfs 在挂载时会自动执行日志回放第一次挂载会比较慢但能正常完成。验证数据mkdir -p /mnt/rescue mount /dev/mapper/vg1-lv1 /mnt/rescue ls -l /mnt/rescue df -h | grep vg1看到你的共享文件夹、照片、影视文件夹都在就说明数据完整。确认没问题后卸载直接重启umount /mnt/rescue reboot重启后 DSM 会自动接管 md2、激活 LVM、挂载卷存储池状态恢复正常。整条急救链路总结成最短命令集sudo -i cat /proc/mdstat mdadm --stop /dev/md2 mdadm --assemble --scan cat /proc/mdstat pvscan vgscan vgchange -ay lvscan reboot这几条命令的顺序不能乱md 没起来就去激活 LVM等于白忙。4. 实测中最常见的几种“假损毁”场景和现场解法4.1 场景一四块盘全在md2 却 inactive这个场景占了断电后“已损毁”的七成以上。现象是 /proc/mdstat 里 md2 显示 inactive但所有成员分区都还在列表里。发生原因断电时 superblock 状态还停在 dirtymdadm 默认不自动激活。内核看到“状态不干净”就选择等命令于是 DSM 就显示存储池不可用。解法就是 3.1 的完整流程。我自己实测下来最简单的三步就能解决mdadm --stop /dev/md2 mdadm --assemble --scan cat /proc/mdstat看到 active 和 [UUUU]接下来 vgchange -ay再 reboot。全程五分钟数据零丢失。4.2 场景二md2 已经 active但 LVM 卷组显示 Not found这个场景也很常见。你明明在 mdstat 里看到 md2 是 activepvscan 却告诉你No PV found或者 vgscan 找不到 vg1。这种现象绝大多数不是 LVM 元数据损坏而是时序问题Linux 在启动时先扫描 PV当时 md2 还没组装完成于是 PV 扫描结果为空。加上 md2 active 之后LVM 没有自动触发重新扫描自然看不到。解法很简单手动触发一次重新扫描pvscan vgscan --cache vgchange -ay如果还是不行检查一下 /dev/md2 设备节点是否存在以及 /etc/lvm/backup 下有没有历史卷组配置备份。极少情况下需要 vgcfgrestore但前提是你之前通过 vgcfgbackup 生成了备份文件。所以平时养成习惯在 NAS 稳定运行的时候顺手跑一次 vgcfgbackup vg1把配置备份到安全位置关键时刻能救命。4.3 场景三一块盘“掉队”md2 显示 degraded现象是 mdstat 里出现类似 [UU_U] 的状态说明 4 个成员里 3 个在线1 个缺失。这有两种可能一种是某块盘在断电后没有被内核识别superblock 的事件计数落后太多被判定为 stale另一种是盘物理上已经出问题。区分方法lsblk smartctl -a /dev/sdX dmesg | grep -E I/O error|ready|fail如果盘还在系统里、SMART 没有明显异常、dmesg 没有 I/O error那大概率只是事件计数落后。查看 md2 的成员详情mdadm --detail /dev/md2输出里会标明谁在谁不在。确认缺失的那块盘分区编号比如 /dev/sdx3然后执行mdadm --add /dev/md2 /dev/sdx3add 操作会把盘作为热备重新加入阵列触发重建。重建期间阵列处于 degraded 状态系统仍可读写但性能会下降。注意如果你不确定这块盘的数据是否和阵列同步不要直接 add。更稳妥的做法是先备份再用 --add。如果这块盘显示的 Event Count 和当前阵列差得不多重建通常没有问题。4.4 场景四真的有一块盘硬件坏了如果 SMART 显示 pending sector 持续增长或者 dmesg 里刷 I/O error那就不是“假损毁”而是真硬件故障。这种情况下的原则是如果是 RAID1 / RAID5 / RAID6 / SHR1 / SHR2阵列有冗余数据还在剩余盘上。先不要做任何修复动作把当前 md2 的信息完整记录mdadm --detail /dev/md2 /root/md2-before.txt mdadm --examine /dev/sda3 /dev/sdb3 /dev/sdc3 /dev/sdd3 /root/md2-examine.txt然后把坏盘替换成新盘插入同槽位再在 DSM 存储池界面执行修复。修复过程本质上是把阵列数据重建到新盘期间不要频繁重启。如果是 RAID 0 或 Basic那就真的没有冗余只能评估数据损失从备份恢复。这也是我一直不建议在主力 NAS 上用 RAID 0 或单盘 Basic 的原因断电后的“已损毁”虽然大部分能救但一旦碰上硬件坏盘RAID 0 就是裸奔。5. 哪些命令绝对不能乱敲复盘里总结出的底线原则5.1 mdadm --create 是数据毁灭指令我见过不止一个案例存储池显示已损毁用户搜到网上说“重新创建 md2”然后执行了 mdadm --create。一旦 --create 跑起来mdadm 会认为你是在建一个新阵列它会向成员分区写入新的 superblock旧阵列的元数据直接被覆盖。虽然磁盘上的文件数据字节还在但整组 RAID 的身份信息已被销毁后续恢复难度会几何级上升。所以无论网上教程怎么讲看到“存储池已损毁”你的默认回应应该是 --assemble而不是 --create。--create 只适合你明确知道数据不要了、要重建空阵列的情况。如果阵列真的损坏到无法 assemble也别急着 create先备份 superblock再用 --assemble --force 尝试最后才考虑数据恢复公司级别的操作。5.2 fsck 的正确时机是“文件系统未挂载”fsck 是文件系统检查工具但它有个硬性前提必须在文件系统未被挂载时执行。在挂载状态下对 ext4 或 Btrfs 跑 fsck轻则检查结果无意义重则因为元数据变更造成进一步混乱。实际环境中DSM 往往会在你还没操作时就把卷挂载到 /volume1。所以标准动作是umount /volume1 fsck -n /dev/mapper/vg1-lv1先 -n 只读检查看看输出里有没有“contains a file system with errors”这类内容。如果确认有问题再考虑去掉 -n 执行修复。Btrfs 用户不能直接用常规 fsck应该用 btrfs check而且 Btrfs 的 check 命令对正在挂载的文件系统同样危险执行前必须卸载。5.3 --force 要配合 Event Count 使用mdadm --assemble --force 能把事件计数不一致的阵列强制组装起来但副作用是如果某块盘其实已经离线很久Event Count 远远落后强制组装后系统可能把这块旧盘上的陈旧数据当成最新数据从而覆盖其他盘上的正确数据造成静默损坏。我用 --force 前一定会做三件事对每个成员执行 mdadm --examine逐行记录 Event Count对比各盘计数如果只有几十到几百的差异强制组装风险可控如果差了上万必须把落后盘先摘除组装完成后立刻做一次文件层面的遍历比如用 rsync -n 或者 md5sum 抽查关键文件确认数据没有异常。另外一个兜底操作成本很低但收益很高在动手前把每块盘分区开头的 superblock 区域备份出来dd if/dev/sda3 of/root/sda3-superblock.img bs512 count32768 dd if/dev/sdb3 of/root/sdb3-superblock.img bs512 count32768真出现误操作这个备份能让专业人员把原 superblock 写回去找回阵列身份。类似的还有 LVM 卷组备份vgcfgbackup vg1这条命令会把 vg1 的配置备份到 /etc/lvm/backup/vg1万一之后卷组元数据出问题可以用 vgcfgrestore 恢复。6. 救回来了然后呢断电防护与长期体检6.1 UPS 是解决问题的根子一次断电能救两次三次也能救但每次都带着风险。最根本的解决方案是给黑群晖配一台带 USB 通讯口的 UPS。APC 的 BK650、施耐德的 SRC 系列或者国产一些带 USB 的型号都可以。配置方式不复杂用 USB 线把 UPS 连到黑群晖主板 USB 口在 DSM“控制面板 → 电源 → UPS”里启用 UPS 支持设置当检测到断电后等待 X 分钟后自动关机或者当 UPS 电量低于某个百分比时自动关机。我习惯设置断电后 3 分钟自动关机低于 30% 电量强制关机。这样既给缓存脏页足够的落盘时间又不会把 UPS 电量耗干。注意黑群晖对 UPS 的识别有时候不完美如果 DSM 认不出 UPS 型号可以看 /var/log/messages 里有没有 usbhid-ups 相关信息。认不出的场景可以尝试更换 USB 线或换一个 USB 口部分主板的供电电流太弱会导致 UPS 通讯不稳定。6.2 SSD 缓存和写缓存在断电时的放大效应黑群晖的 SSD 缓存有两种模式只读缓存和读写缓存回写。回写缓存性能好但一旦断电SSD 缓存里未下刷的数据直接丢失风险比普通硬盘的写缓存高不少。我见过几台黑群晖因为 NVMe 回写缓存加断电文件系统直接出现 Btrfs checksum 错误恢复复杂度明显上升。建议如果你的数据重要SSD 缓存优先用只读模式或者给 SSD 配置带掉电保护的企业级型号。普通硬盘的写缓存一般不需要关现代硬盘都有掉电保护逻辑但如果你用的是很老或很便宜的盘可以在 DSM 里关闭写缓存换取一点安心。6.3 定期体检的几条命令把这次救回来的经验变成日常巡检比等出事再手忙脚乱强得多。我每两个月会 SSH 进去跑一轮cat /proc/mdstat mdadm --detail /dev/md2 | grep -E State|Rebuild|Event smartctl -a /dev/sda | grep -E Reallocated|Pending|CRC vgscan把这些命令攒成一个脚本或者直接记在手机备忘录里。遇到状态异常比如 md2 从 clean 变成 degraded或者某块盘 SMART 数值在涨尽早处理别拖到下一次断电。我个人的做法是把“断电急救命令清单”放在每台黑群晖的 /root/ 目录下文件名就叫 rescue-notes.txt用一次救一次不指望自己的脑子比硬盘可靠。数据这个东西平时看不出价值但断电那五分钟你会发现一行 mdadm --assemble --scan 比什么都有用。
返回列表