我曾尝试添加新硬盘来代替旧硬盘。但新硬盘无法与旧硬盘同步。同步过程显示进行到 30% 之后就停止了。
cat /proc/mdstat
Personalities : [raid1]
md2 : active raid1 sda3[0] sdb3[2](S)
1458319504 blocks super 1.0 [2/1] [U_]
md1 : active raid1 sda2[3] sdb2[2]
524276 blocks super 1.0 [2/2] [UU]
md0 : active raid1 sda1[0] sdb1[2]
6291444 blocks super 1.0 [2/2] [UU]
md0 和 md1 同步成功,但 md2 不能
这是细节
mdadm --detail /dev/md2
/dev/md2:
Version : 1.0
Creation Time : Fri May 24 11:22:21 2013
Raid Level : raid1
Array Size : 1458319504 (1390.76 GiB 1493.32 GB)
Used Dev Size : 1458319504 (1390.76 GiB 1493.32 GB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
Update Time : Mon Aug 4 22:08:23 2014
State : clean, degraded
Active Devices : 1
Working Devices : 2
Failed Devices : 0
Spare Devices : 1
Name : rescue:2 (local to host rescue)
UUID : 96b46a6c:f520938c:f94879df:27851e8a
Events : 616
Number Major Minor RaidDevice State
0 8 3 0 active sync /dev/sda3
1 0 0 1 removed
2 8 19 - spare /dev/sdb3
有什么解决办法吗?我想备份我的数据
答案1
抱歉来晚了。所以,我很惊讶没有人回答这个问题。甚至有一个指向类似问题的链接,但我怀疑在这种情况下电缆没有发挥作用。
您开始同步到新磁盘,但当同步到 30% 时,源(剩下的最后一个包含所有数据的驱动器)遇到读取错误。如果出现读取错误,Linux MD RAID 驱动程序会查询其他组件设备的读取情况,但在这种情况下,没有同步的组件设备可供读取,因此它会放弃。它会在第一次出现这种不可恢复的错误时停止同步,然后从头开始重新启动同步。当然,拉出备用件并重新添加无济于事。在这种情况下,您必须使用其他方式来完成同步或以其他方式检索(轻微损坏的)数据。
系统可能运行正常,因为这个扇区可能不包含任何数据,所以在正常运行期间它从未尝试读取,但 RAID 同步是一种特殊情况,它会读取所有内容。我们称这种情况为静默坏块。
第一个想法是强迫驾驶重映射内部修复坏块。不幸的是,无法保证做到这一点,但如果您写入此特定扇区,则很有可能会重新映射它,然后成功读回。为此,可以使用实用程序hdparm
(注意--repair-sector
是的别名--write-sector
):
hdparm --write-sector 448271680
我故意在这里放了一个几乎随机的数字。这是 896543360/2,其中的大数字取自dmesg
错误消息。你必须根据你的情况自己计算。一定要非常小心。我建议使用相同的数字进行读取检查(--read-sector
),以触发相同的错误消息,从而证明这确实是正确的扇区。注意,您将失去这个扇区中的任何内容,但无论如何都是不可读的,因此它基本上已经丢失了,如果它保持沉默,那就没有任何有用的信息。
对所有不可读块重复此操作。同步完成后,您还需要更换此驱动器。
另一种解决这种情况的方法需要长时间停止服务。您需要停止故障 RAID 并ddrescue
从故障磁盘运行到新磁盘。之后,您需要先完全移除旧设备并从新磁盘(我知道阵列已降级)启动系统。然后,如果可行,请添加另一个新磁盘并完成同步。
如果您想知道的话,我碰巧用这两种方法都成功进行了修复。
这里的教训是:具有RAID 是不够的;为了数据安全,你需要监视器你的阵列健康状况,斯克勒布定期检查(即对所有设备执行读取检查并进行比较 — 以确保读取每个块),当然还要及时采取必要的措施。硬件 RAID 还具有设置自动定期清理的功能。对于每个 MD RAID,您应该每月执行一次:
echo check >> /sys/block/md0/md/sync_action
(据我所知,Debian 默认有此功能)。因此,当某个磁盘出现无法读取的静默扇区时,一个月后您就会发现这一点。然后不要忘记尽快更换坏掉的磁盘!
答案2
mdadm 开关“grow”应将备用设备拉入阵列。类似“#mdadm --grow /dev/sdb3 --raid-devices=3”如果失败,我会跟踪系统日志以找出原因。
答案3
mdadm --manage /dev/md2 --add /dev/sdb3
这应该可以完成工作,
/dev/sdb3 仍然标记为备用,因此为 (S)。
如果这还不够,您可以:删除它并尝试重新添加:
mdadm --manage /dev/md2 --remove /dev/sdb3
您可能需要停止并重新启动阵列:
mdadm --stop /dev/md2 ; mdadm --start /dev/md2
最后一个选择是强制重新同步(不用担心,它不会造成破坏):
mdadm --assemble --run --force --update=resync /dev/md2 /dev/sda3 /dev/sdb3
此外,只需重新启动阵列就足以完成工作,而无需进一步麻烦。还有更多:您甚至可以使用 mdadm --create 重新创建整个阵列。;)