我有一个 SW RAID1,由于旧硬盘出现故障,我刚刚用新硬盘替换了 /dev/sda。
现在,在尝试重新创建 RAID 阵列时,我发现“好”硬盘 (/dev/sdb) 有坏块,阻止 mdadm 重新同步阵列。
虽然我可以进行备份、替换 /dev/sdb 并完全重新安装服务器,但我想知道是否有任何方法可以“欺骗” mdadm 重新同步 RAID 阵列,然后用新 HDD 替换 /dev/sdb。
据我猜测,坏块位于 /dev/sdb 的未使用区域中,该区域仅在尝试重新创建 RAID 阵列时使用。
答案1
您能否验证磁盘上受影响的块和底层坏扇区是否已重新分配给“备用扇区”区域? 写入操作失败时应重新分配坏扇区。使用smartctl 验证:
smartctl -a /dev/sdb | grep -i reallocated
最后一列应包含重新分配扇区的总数量。如果为零,请尝试读取坏扇区:
hdparm –-read-sector XXXXXXXX /dev/sdb
它应该返回I/O 错误否则我会建议跳过下一部分。
这个错误意味着该扇区还没有被重新分配。所以你可以尝试通过写入来强制重新分配它。请记住,此步骤后,该扇区中存储的所有数据都将丢失!:
hdparm –-write-sector XXXXXXXX --yes-i-know-what-i-am-doing /dev/sdb
顺便说一下,扇区号XXXXXX应该可以从内核消息(dmesg 命令或 /var/log/messages)中获得。由于您在重新同步期间有坏块,因此应该有一些类似以下内容的相关消息:
... end_request: I/O error, dev sdb, sector 1261071601
然后,尝试再次使用 smartctl 进行验证。计数器是否增加了?如果增加了,尝试使用 hdparm 读取它。现在,它应该可以读取它,没有任何错误,因为它应该被重新分配了。完成。
最后,您可以继续使用 mdadm 并将磁盘添加到降级镜像。
答案2
更好的策略是使用 ddrescue 将坏驱动器复制到好驱动器。此工具会尽力读取整个驱动器,进行重新读取并“修剪”不可读块。它还会生成日志,用于保存进度,但最终将包含坏块列表。然后,您可以解析此列表并写入每个坏块,以查看驱动器是否能够在重新映射所有坏块后继续存在。如果可以,您可以使用 mdadm --zero-superblock,然后将其作为新驱动器添加到降级的 raid1。顺便说一句,对于当今的高容量驱动器来说,不时产生“软”坏块是很正常的。只需每周检查一次 raid,您就没问题了,除非同一个块在两个驱动器上都无法读取,这种情况不太可能发生。