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