更换硬盘并重建 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/sdc12. 物理更换硬盘
关闭飞牛虚拟机:在PVE Web界面,安全关闭你的飞牛虚拟机。
更换硬盘:找到主机上对应的物理硬盘(/dev/sdc),更换为新硬盘。新硬盘的容量建议等于或大于旧盘(6TB)。
重新启动虚拟机:完成物理更换后,重新启动飞牛虚拟机,并再次通过SSH登录。
3. 为新硬盘分区并加入阵列
检查新硬盘:使用
lsblk命令确认新硬盘已被系统识别为/dev/sdc。为新硬盘分区:使用
fdisk工具为新硬盘创建一个Linux RAID类型的分区。bash
# 使用fdisk对/dev/sdc进行分区 sudo fdisk /dev/sdc在
fdisk的交互界面中,你需要执行以下操作:输入
n并回车,创建新分区。输入
p并回车,选择主分区。输入
1并回车,设置分区编号为1。直接按两次
回车键,使用默认的起始和结束扇区(即使用整个硬盘)。输入
t并回车,修改分区类型。输入
fd并回车,将分区类型设置为Linux RAID auto。输入
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" 的输出,表示文件系统已可读写数据完整性检查:进入你挂载的目录,浏览并检查文件是否能正常打开,确认数据基本完好。
重启测试:为确保万无一失,建议重启一次飞牛虚拟机,再次验证存储空间是否能自动挂载,并且不再是只读状态。
备份现有数据(即使文件系统只读,仍可尝试复制):
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提取数据(见下文)。标记并移除故障硬盘:
bash
sudo mdadm --manage /dev/md126 --fail /dev/sdc1 sudo mdadm --manage /dev/md126 --remove /dev/sdc1物理更换硬盘:关闭飞牛虚拟机,拔出旧 sdc,换上一块容量 ≥ 6TB 的新硬盘。重新启动,确认新盘被识别为
/dev/sdc(或新设备名)。为新硬盘创建分区:
bash
sudo fdisk /dev/sdc # 输入 n (新建) -> p (主分区) -> 1 -> 默认起始 -> 默认结束 -> t (修改类型) -> fd (Linux RAID) -> w将新硬盘添加到阵列:
bash
sudo mdadm --manage /dev/md126 --add /dev/sdc1系统会自动开始重建数据。通过
cat /proc/mdstat监控进度。修复 BTRFS 文件系统(重建完成后):
bash
sudo btrfs check --repair /dev/md126 # 或者尝试超级块恢复 sudo btrfs rescue super-recover -v /dev/md126挂载并验证:
bash
sudo mount /dev/md126 /vol1 # 替换实际挂载点 mount | grep md126 # 检查是否为 rw