前段时间我家里有一个RAID5系统。 4 个磁盘中的一个出现故障,但将其取出并放回原处后似乎一切正常,因此我开始重新同步。当它完成时,我惊恐地意识到,四分之三的磁盘出现了故障。但我不相信这是可能的。磁盘上有多个分区,每个分区属于不同的 RAID 阵列。
- md0 是由 sda1、sdb1、sdc1 和 sdd1 组成的 RAID1 阵列。
- md1 是由 sda2、sdb2、sdc2 和 sdd2 组成的 RAID5 阵列。
- md2 是由 sda3、sdb3、sdc3 和 sdd3 组成的 RAID0 阵列。
md0 和 md2 报告所有磁盘均正常运行,而 md1 报告 3 个磁盘出现故障(sdb2、sdc2、sdd2)。据我了解,当硬盘驱动器出现故障时,所有分区都应该丢失,而不仅仅是中间分区。
此时我关闭了计算机并拔下了驱动器。从那时起,我就使用那台带有较小新磁盘的计算机。
数据还有恢复的希望吗?我能否以某种方式让 mdadm 相信我的磁盘实际上正在工作?唯一可能真正有问题的磁盘是 sdc,但其他阵列也报告了该问题。
更新
我终于有机会连接旧磁盘并从 SystemRescueCd 启动这台机器。以上都是凭记忆写的。现在我有一些硬数据。这是输出mdadm --examine /dev/sd*2
/dev/sda2:
Magic : a92b4efc
Version : 0.90.00
UUID : 53eb7711:5b290125:db4a62ac:7770c5ea
Creation Time : Sun May 30 21:48:55 2010
Raid Level : raid5
Used Dev Size : 625064960 (596.11 GiB 640.07 GB)
Array Size : 1875194880 (1788.33 GiB 1920.20 GB)
Raid Devices : 4
Total Devices : 4
Preferred Minor : 1
Update Time : Mon Aug 23 11:40:48 2010
State : clean
Active Devices : 3
Working Devices : 4
Failed Devices : 1
Spare Devices : 1
Checksum : 68b48835 - correct
Events : 53204
Layout : left-symmetric
Chunk Size : 64K
Number Major Minor RaidDevice State
this 0 8 2 0 active sync /dev/sda2
0 0 8 2 0 active sync /dev/sda2
1 1 8 18 1 active sync /dev/sdb2
2 2 8 34 2 active sync /dev/sdc2
3 3 0 0 3 faulty removed
4 4 8 50 4 spare /dev/sdd2
/dev/sdb2:
Magic : a92b4efc
Version : 0.90.00
UUID : 53eb7711:5b290125:db4a62ac:7770c5ea
Creation Time : Sun May 30 21:48:55 2010
Raid Level : raid5
Used Dev Size : 625064960 (596.11 GiB 640.07 GB)
Array Size : 1875194880 (1788.33 GiB 1920.20 GB)
Raid Devices : 4
Total Devices : 4
Preferred Minor : 1
Update Time : Mon Aug 23 11:44:54 2010
State : clean
Active Devices : 2
Working Devices : 3
Failed Devices : 1
Spare Devices : 1
Checksum : 68b4894a - correct
Events : 53205
Layout : left-symmetric
Chunk Size : 64K
Number Major Minor RaidDevice State
this 1 8 18 1 active sync /dev/sdb2
0 0 0 0 0 removed
1 1 8 18 1 active sync /dev/sdb2
2 2 8 34 2 active sync /dev/sdc2
3 3 0 0 3 faulty removed
4 4 8 50 4 spare /dev/sdd2
/dev/sdc2:
Magic : a92b4efc
Version : 0.90.00
UUID : 53eb7711:5b290125:db4a62ac:7770c5ea
Creation Time : Sun May 30 21:48:55 2010
Raid Level : raid5
Used Dev Size : 625064960 (596.11 GiB 640.07 GB)
Array Size : 1875194880 (1788.33 GiB 1920.20 GB)
Raid Devices : 4
Total Devices : 4
Preferred Minor : 1
Update Time : Mon Aug 23 11:44:54 2010
State : clean
Active Devices : 1
Working Devices : 2
Failed Devices : 2
Spare Devices : 1
Checksum : 68b48975 - correct
Events : 53210
Layout : left-symmetric
Chunk Size : 64K
Number Major Minor RaidDevice State
this 2 8 34 2 active sync /dev/sdc2
0 0 0 0 0 removed
1 1 0 0 1 faulty removed
2 2 8 34 2 active sync /dev/sdc2
3 3 0 0 3 faulty removed
4 4 8 50 4 spare /dev/sdd2
/dev/sdd2:
Magic : a92b4efc
Version : 0.90.00
UUID : 53eb7711:5b290125:db4a62ac:7770c5ea
Creation Time : Sun May 30 21:48:55 2010
Raid Level : raid5
Used Dev Size : 625064960 (596.11 GiB 640.07 GB)
Array Size : 1875194880 (1788.33 GiB 1920.20 GB)
Raid Devices : 4
Total Devices : 4
Preferred Minor : 1
Update Time : Mon Aug 23 11:44:54 2010
State : clean
Active Devices : 1
Working Devices : 2
Failed Devices : 2
Spare Devices : 1
Checksum : 68b48983 - correct
Events : 53210
Layout : left-symmetric
Chunk Size : 64K
Number Major Minor RaidDevice State
this 4 8 50 4 spare /dev/sdd2
0 0 0 0 0 removed
1 1 0 0 1 faulty removed
2 2 8 34 2 active sync /dev/sdc2
3 3 0 0 3 faulty removed
4 4 8 50 4 spare /dev/sdd2
自上次启动以来,情况似乎发生了变化。如果我没看错的话,sda2、sdb2 和 sdc2 正在工作并且包含同步数据,而 sdd2 是备用的。我清楚地记得看到 3 个磁盘出现故障,但这是个好消息。然而数组仍然无法工作:
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md125 : inactive sda2[0](S) sdb2[1](S) sdc2[2](S)
1875194880 blocks
md126 : inactive sdd2[4](S)
625064960 blocks
md127 : active raid1 sda1[0] sdd1[3] sdc1[2] sdb1[1]
64128 blocks [4/4] [UUUU]
unused devices: <none>
md0 似乎已重命名为 md127。 md125和md126很奇怪。它们应该是一个数组而不是两个。以前称为 md1。 md2 完全消失了,但那是我的交换,所以我不在乎。
我可以理解不同的名称,但这并不重要。但为什么具有 3 个“主动同步”磁盘的阵列无法读取? sdd2 位于单独的数组中怎么办?
更新
备份超级块后我尝试了以下操作:
root@sysresccd /root % mdadm --stop /dev/md125
mdadm: stopped /dev/md125
root@sysresccd /root % mdadm --stop /dev/md126
mdadm: stopped /dev/md126
到目前为止,一切都很好。由于 sdd2 是空闲的,我还不想添加它。
root@sysresccd /root % mdadm --assemble /dev/md1 /dev/sd{a,b,c}2 missing
mdadm: cannot open device missing: No such file or directory
mdadm: missing has no superblock - assembly aborted
显然我不能这么做。
root@sysresccd /root % mdadm --assemble /dev/md1 /dev/sd{a,b,c}2
mdadm: /dev/md1 assembled from 1 drive - not enough to start the array.
root@sysresccd /root % cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : inactive sdc2[2](S) sdb2[1](S) sda2[0](S)
1875194880 blocks
md127 : active raid1 sda1[0] sdd1[3] sdc1[2] sdb1[1]
64128 blocks [4/4] [UUUU]
unused devices: <none>
那也没用。让我们尝试使用所有磁盘。
mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@sysresccd /root % mdadm --assemble /dev/md1 /dev/sd{a,b,c,d}2
mdadm: /dev/md1 assembled from 1 drive and 1 spare - not enough to start the array.
root@sysresccd /root % cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : inactive sdc2[2](S) sdd2[4](S) sdb2[1](S) sda2[0](S)
2500259840 blocks
md127 : active raid1 sda1[0] sdd1[3] sdc1[2] sdb1[1]
64128 blocks [4/4] [UUUU]
unused devices: <none>
没有运气。基于这个答案我打算尝试:
mdadm --create /dev/md1 --assume-clean --metadata=0.90 --bitmap=/root/bitmapfile --level=5 --raid-devices=4 /dev/sd{a,b,c}2 missing
mdadm --add /dev/md1 /dev/sdd2
安全吗?
更新
我发布了超级块解析器脚本我曾经在评论中制作过该表。也许有人会发现它很有用。感谢你的帮助。
答案1
首先检查磁盘,尝试运行智能自检
for i in a b c d; do
smartctl -s on -t long /dev/sd$i
done
可能需要几个小时才能完成,但每隔几分钟检查一次每个驱动器的测试状态,即
smartctl -l selftest /dev/sda
如果磁盘的状态由于读取错误而报告未完成,则该磁盘应被视为对于 md1 重组不安全。自检完成后,您可以开始尝试重新组装阵列。或者,如果您想格外小心,请在继续之前将磁盘移至另一台计算机(以防内存/控制器等损坏)。
最近,我就遇到了一个和这个一模一样的案例。一个驱动器出现故障,我将其重新添加到阵列中,但在重建过程中,4 个驱动器中的 3 个完全出现故障。 /proc/mdadm 的内容和你的一样(可能顺序不同)
md1 : inactive sdc2[2](S) sdd2[4](S) sdb2[1](S) sda2[0](S)
但我很幸运并用这个重新组装了阵列
mdadm --assemble /dev/md1 --scan --force
通过查看您提供的 --examine 输出,我可以看出发生了以下情况:sdd2 失败,您将其删除并重新添加,因此它成为尝试重建的备用驱动器。但是重建 sda2 失败,然后 sdb2 失败。因此,sdc2 和 sdd2 中的事件计数器更大,它们是阵列中最后一个活动驱动器(尽管 sdd 没有机会重建,因此它是所有驱动器中最过时的)。由于事件计数器的差异,--force 将是必要的。所以你也可以尝试这个
mdadm --assemble /dev/md1 /dev/sd[abc]2 --force
总而言之,我认为如果上述命令失败,您应该尝试重新创建数组,如下所示:
mdadm --create /dev/md1 --assume-clean -l5 -n4 -c64 /dev/sd[abc]2 missing
如果您执行此操作--create
,则该missing
部分很重要,请勿尝试在阵列中添加第四个驱动器,因为这样就会开始构建,并且您将丢失数据。创建缺少驱动器的阵列不会更改其内容,并且您将有机会获得副本别处(raid5 的工作方式与 raid1 不同)。
如果无法启动数组,请在此处尝试此解决方案(perl 脚本)重新创建数组
如果您最终设法启动阵列,文件系统将不干净并且可能已损坏。如果一个磁盘在重建期间发生故障,预计阵列将停止并冻结,不会对其他磁盘进行任何写入。在这种情况下,两个磁盘出现故障,或许系统正在执行无法完成的写入请求,因此您有可能丢失一些数据,但也有可能您永远不会注意到它:-)
编辑:添加了一些说明。
答案2
我在使用过程中遇到了很多问题mdadm
,但从未丢失过数据。您应该避免使用该--force
选项,或者非常小心地使用它,因为您可能会丢失所有数据。请发布您的/etc/mdadm/mdadm.conf