У меня есть SW RAID1, и я просто заменил / dev / sda новым жестким диском, так как старый вышел из строя.
Теперь, при попытке воссоздать массив RAID, я обнаружил, что "хороший" жесткий диск (/ dev / sdb) имеет плохие блоки, которые не позволяют mdadm повторно синхронизировать массив.
Хотя я мог сделать резервные копии, заменить / dev / sdb и полностью переустановить сервер, мне было интересно, есть ли способ «обмануть» mdadm, чтобы повторно синхронизировать массив RAID, а затем заменить / dev / sdb новым жестким диском. .
Из того, что я могу предположить, плохие блоки находятся в неиспользуемой области / dev / sdb, которая используется только при попытке воссоздать массив RAID.
Лучшей стратегией было бы использовать ddrescue для копирования плохого диска на хороший. Этот инструмент изо всех сил пытается прочитать весь диск, выполняя повторное чтение и «обрезая» нечитаемые блоки. Он также создает журнал, который используется для сохранения прогресса, но в конечном итоге будет содержать список плохих блоков. Затем вы можете проанализировать этот список и записать в каждый сбойный блок, чтобы увидеть, выживет ли диск, переназначив их все. Если это так, вы можете mdadm --zero-superblock, а затем просто добавить его в качестве нового диска в свой деградированный raid1. Кстати, для сегодняшних накопителей большой емкости вполне нормально время от времени создавать «мягкие» плохие блоки. Просто проводите рейд-проверку еженедельно, и все будет в порядке, если один и тот же блок не станет нечитаемым на двух дисках, что очень маловероятно.
Можете ли вы проверить, перераспределены ли затронутые блоки и лежащие в основе сбойные секторы на диске в зона "запасных секторов"? Плохой сектор должен быть перераспределен при сбое операции записи. Проверьте это с помощью smartctl:
smartctl -a /dev/sdb | grep -i reallocated
Последний столбец должен содержать общее количество перераспределенных секторов. Если ноль, попробуйте прочитать сбойный сектор:
hdparm –-read-sector XXXXXXXX /dev/sdb
Он должен вернуть Ошибка ввода / вывода в противном случае я бы рекомендовал пропустить следующий раздел.
Ошибка означает, что сектор еще не был перераспределен. Таким образом, вы можете попробовать принудительно перераспределить его, написав его. Помните, что все данные, хранящиеся в этом секторе, будут потеряны после этого шага !!!:
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. Счетчик увеличился? Если да, попробуйте прочитать его с помощью hdparm. Теперь он должен прочитать его без ошибок, так как предполагается, что он будет перераспределен. Готово.
Наконец, вы можете продолжить с mdadm и добавить диск к деградировавшему зеркалу.