Zenith Horizon

更换故障硬盘重建飞牛 Raid5

2026/04/18
loading

更换硬盘并重建 RAID5 阵列,是解决你当前文件系统只读问题的根本方法。整个流程分为两大步:先修复硬件(更换硬盘)再修复文件系统(Btrfs)

注意:执行这些操作前,请务必评估风险,因为重建过程本身有一定概率导致其他旧硬盘出现新的故障。如果你的数据极其重要,最稳妥的方案是先用专业软件(如R-Studio)在另一台电脑上为所有5块盘创建完整镜像,再在新镜像上进行后续操作。


📋 第一阶段:更换硬盘

1. 确认阵列状态并标记故障盘

在更换硬盘前,确保你的数据已做好备份,或已做好承担风险的准备。之后,登录飞牛NAS的SSH终端,按顺序执行:

bash

# 1. 再次确认RAID阵列状态
cat /proc/mdstat
sudo mdadm --detail /dev/md126

确认当前阵列中有且只有sdc1一块盘出现故障。

bash

# 2. 将故障盘标记为已损坏并从阵列中移除
sudo mdadm --manage /dev/md126 --fail /dev/sdc1
sudo mdadm --manage /dev/md126 --remove /dev/sdc1

2. 物理更换硬盘

  • 关闭飞牛虚拟机:在PVE Web界面,安全关闭你的飞牛虚拟机。

  • 更换硬盘:找到主机上对应的物理硬盘(/dev/sdc),更换为新硬盘。新硬盘的容量建议等于或大于旧盘(6TB)。

  • 重新启动虚拟机:完成物理更换后,重新启动飞牛虚拟机,并再次通过SSH登录。

3. 为新硬盘分区并加入阵列

  • 检查新硬盘:使用lsblk命令确认新硬盘已被系统识别为/dev/sdc

  • 为新硬盘分区:使用fdisk工具为新硬盘创建一个Linux RAID类型的分区。

    bash

    # 使用fdisk对/dev/sdc进行分区
    sudo fdisk /dev/sdc

    fdisk的交互界面中,你需要执行以下操作:

    1. 输入 n 并回车,创建新分区。

    2. 输入 p 并回车,选择主分区。

    3. 输入 1 并回车,设置分区编号为1。

    4. 直接按两次回车键,使用默认的起始和结束扇区(即使用整个硬盘)。

    5. 输入 t 并回车,修改分区类型。

    6. 输入 fd 并回车,将分区类型设置为Linux RAID auto

    7. 输入 w 并回车,将上述操作写入硬盘并退出。

  • 将新分区加入阵列:系统将自动开始数据重建,通过cat /proc/mdstat可以监控重建进度(这个过程可能耗时数小时甚至数天)。

    bash

    # 将新创建的分区/dev/sdc1添加到RAID阵列中
    sudo mdadm --manage /dev/md126 --add /dev/sdc1
    # 监控重建进度,按Ctrl+C退出监控
    watch -n 1 cat /proc/mdstat

等待重建完成:务必等待重建进度达到100%,并且/proc/mdstat中显示为active状态。在此期间,系统可能因负荷较重而变慢,这是正常现象。


🛠️ 第二阶段:修复Btrfs文件系统

阵列重建完成后,存储空间可能仍无法正常挂载或处于只读状态,因为文件系统的元数据在之前故障盘的影响下已经损坏。这通常是由于超级块(Superblock)损坏或日志不一致导致的。下面是Btrfs官方的标准修复流程。

bash

# 1. 安全卸载存储空间
#    在飞牛NAS的Web界面,先卸载出问题的存储空间,并确保没有其他程序(如Docker)正在使用它[reference:4]。
#    你也可以通过SSH强制卸载(如果之前已挂载):
# sudo umount /dev/md126

# 2. 尝试修复超级块(解决“No valid Btrfs found”问题)
#    此命令会尝试从备份中恢复超级块。
sudo btrfs rescue super-recover -v /dev/md126

# 3. 清除文件系统日志
#    如果上一步无效,可以尝试清除日志,这能解决因日志回放失败导致的挂载问题[reference:5]。
sudo btrfs rescue zero-log /dev/md126

# 4. 执行完整文件系统检查与修复
#    这是最彻底的一步,会检查并尝试修复文件系统的所有元数据。
#    ⚠️ 重要:此命令可能有一定风险,执行前强烈建议确保数据已备份[reference:6]。
sudo btrfs check --repair /dev/md126

在执行 btrfs check --repair 过程中,如果遇到关于特定inode的I/O错误,这通常表明该文件的磁盘区域有物理损坏。对于此类问题,不应中断修复程序,让它继续运行完成。完成修复后,数据可能仍有部分损坏,但这是恢复文件系统可挂载性的必要步骤。


✅ 最后检查与数据验证

完成上述修复后,按顺序进行验证:

bash

# 1. 挂载文件系统
sudo mount /dev/md126 /你的挂载点

# 2. 检查挂载状态
mount | grep /dev/md126
# 应该看到类似 "rw" 的输出,表示文件系统已可读写
  • 数据完整性检查:进入你挂载的目录,浏览并检查文件是否能正常打开,确认数据基本完好。

  • 重启测试:为确保万无一失,建议重启一次飞牛虚拟机,再次验证存储空间是否能自动挂载,并且不再是只读状态。


  1. 备份现有数据(即使文件系统只读,仍可尝试复制):

    bash

    # 创建备份目录(例如挂载一个外部硬盘或网络存储)
    sudo mkdir /mnt/backup
    # 如果 /dev/md126 可以挂载为只读,直接复制
    sudo mount -o ro /dev/md126 /mnt/old_data
    sudo rsync -av /mnt/old_data/ /mnt/backup/

    如果无法挂载,使用 btrfs restore 提取数据(见下文)。

  2. 标记并移除故障硬盘

    bash

    sudo mdadm --manage /dev/md126 --fail /dev/sdc1
    sudo mdadm --manage /dev/md126 --remove /dev/sdc1
  3. 物理更换硬盘:关闭飞牛虚拟机,拔出旧 sdc,换上一块容量 ≥ 6TB 的新硬盘。重新启动,确认新盘被识别为 /dev/sdc(或新设备名)。

  4. 为新硬盘创建分区

    bash

    sudo fdisk /dev/sdc
    # 输入 n (新建) -> p (主分区) -> 1 -> 默认起始 -> 默认结束 -> t (修改类型) -> fd (Linux RAID) -> w
  5. 将新硬盘添加到阵列

    bash

    sudo mdadm --manage /dev/md126 --add /dev/sdc1

    系统会自动开始重建数据。通过 cat /proc/mdstat 监控进度。

  6. 修复 BTRFS 文件系统(重建完成后):

    bash

    sudo btrfs check --repair /dev/md126
    # 或者尝试超级块恢复
    sudo btrfs rescue super-recover -v /dev/md126
  7. 挂载并验证

    bash

    sudo mount /dev/md126 /vol1   # 替换实际挂载点
    mount | grep md126   # 检查是否为 rw

Author: Max

Permalink: /archives/raid-recovery

Published: 2026-04-18 16:55:40

Updated: 2026-04-18 16:52:48

License: 本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

CATALOG