Pull to refresh

Занимательная история о «бэдблоках» и RAID 0

Эта статья не руководство к действию, а скорее рассказ о моем эксперименте по замещению сбойного диска в RAID 0 массиве с сохранением всех данных. Раньше я часто задавался вопросом «зачем в WinHEX возможность редактирования диска?», теперь я знаю.

Жил был в одном системнике RAID 0 массив из трех одинаковых дисков по 250 Гб на контроллере Intel. Крутилась на этом массиве система, лежали важные данные да куча всякого разного барахла. И все было благополучно долгое время, пока однажды не пришла беда: во время копирования большого файла с раздела на раздел все стало дико тормозить и один из дисков выпал с ошибкой.

Сказка кончилась. Один из дисков стал потихоньку покрываться badblock'ами. Вариантов тут было два:
  1. «Правильный» — купить новый диск; сделать бэкап; пересобрать массив с новым диском; восстановить данные из бэкапа.
  2. «Простой/Временный» — переключить контроллер из RAID в AHCI; используя live CD производителя жестких дисков сделать remap для сбойных секторов; переключиться обратно в RAID; делать почаще бэкапы и надеяться, что больше проблем не будет и диск внезапно не умрет.

Недолго думая я выбрал вариант №2: не было денег на новый диск; некуда было забэкапить весь массив, чтобы не переустанавливать систему и не терять файловый архив; лень. Прошел год, я разжился новым диском на замену сбойному, но полный бэкап мне был все еще недоступен, так что за это время мне еще раз пришлось повторить вариант №2.

В одни из выходных запасшись пивом я уже было решился на пересборку массива, переустановку системы, смирился с потерей части файлового архива, как вдруг проскочила шальная идея — а что, если просто посекторно склонировать содержимое сбойного диска на новый?

Эксперимент начался. Перевел RAID контроллер в режим AHCI, загрузился с live CD, посекторно склонировал сбойный диск на новый, отключил старый диск, переключился с AHCI обратно в RAID, пробую загрузиться — не получается, контроллер не опознает новый диск.
Вспоминаю, есть же еще какие-то метаданные описывающие RAID массив, и хранятся они, вроде бы, в последнем секторе каждого диска. Загружаюсь с live CD, запускаю WinHEX, открываю последний сектор диска, сразу вижу, указаны серийники дисков из массива, заменяю серийник старого диска на новый, повторяю для всех дисков, пробую загрузиться — не помогает, опять «non RAID disk».
Есть, видимо еще какие-то поля, но как узнать формат метаданных? В результате долгих поисков выясняю: для аппаратных контроллеров единого стандарта нет, даже для разных чипов одного производителя, вот почему многие любят software RAID; у меня вовсе не настоящий аппаратный RAID, а полуаппаратный fakeRaid и для него есть поддержка в Linux (dmraid).
Скачиваю исходники Linux kernel, нахожу нужный файл, разбираюсь с форматом — нужно вставить правильную контрольную сумму. Пишу программку на C для подсчета CRC, правлю CRC, пробую — неудача. Снова копаюсь в исходниках, есть еще одна контрольная сумма для заголовка, как считать не понял, но есть чудо флаг — игнорировать CRC.

Итак, устанавливаю флаг, запускаю — все работает, победа: диск опознался, система грузится, все файлы целы, consistency check не выявил ошибок! Слава WinHEX и Linux kernel!
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.