Raid 1 无法与新驱动器同步。它停止在 30%

Raid 1 无法与新驱动器同步。它停止在 30%

我曾尝试添加新硬盘来代替旧硬盘。但新硬盘无法与旧硬盘同步。同步过程显示进行到 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 重新创建整个阵列。;)

相关内容