PC 3000: зависающие HDD на примере Western Digital

Большинство современных дисков разных производителей имеют общую одинаково проявляющуюся неисправность: по звукам диск запускается как обычно, но при этом либо очень медленно читает данные, либо долгое время висит в состоянии BSY, а после 2-3 минут иногда выдает ошибку, а иногда висит до бесконечности. В качестве примера взят диск модели WD20EARS. Для доступа к данным пользователя используется комплекс ACE Lab PC-3000. В конце заметки видеоролик с демонстрацией всех описанных действий.

Рассмотрим пример зависающего диска. Сначала подаем на него питание. Слышно, что диск калибруется нормально, не стучит, никаких посторонних звуков не выдает, но при этом в готовность не выходит. То есть в регистре состояния индикатор BSY горит постоянно.

WD_SlowResponding_01

WD_SlowResponding_02

При этом, через какое-то время, можно услышать, что диск еще раз перезагрузился. Такая ситуация с не запуском жесткого диска происходит от того, что микропрограмма уходит в бесконечный цикл, то есть не завершает какую-то из важных процедур инициализации. При этом, с аппаратной точки зрения (головки, поверхности), все работает.

Чтобы решить этот случай, нужно войти в утилиту Western Digital в, так называемом, режиме kernel.

WD_SlowResponding_03

Примерно через минуты две, жесткий диск вышел в состояние ошибки. Он погасил индикатор BSY (бизи) и зажег индикатор ERR (ошибка). При этом, тип ошибки выдал ABR.

WD_SlowResponding_04

То есть диск не запустился. Попробуем запустить утилиту.

WD_SlowResponding_05

Утилита у нас сразу показывает режим kernel.

WD_SlowResponding_06

Нажимаем автоопределение, диск автоматически определяется(Sadle G6).

WD_SlowResponding_07

И можно нажать «Запуск утилиты».

WD_SlowResponding_08

Интересно, тут «Debug Stop Code» RESET TIMEOUT. Получается, что диск остановился по истечении таймаута на запуск. Он должен был запуститься за какое-то время и диск не запустился.

Для того, чтобы решить данный случай нам нужно вызвать следующую опцию: «Тесты → Работа с ПЗУ → Блокировать доступ к модулю 02».

WD_SlowResponding_09

После этого будет произведена правка ПЗУ.

WD_SlowResponding_10

Диск в состоянии с блокированным доступом к модулю 02 не запустит большую часть своей микропрограммы. Но, так называемый, оверлей (overlay) будет запущен и это позволит зайти в режим утилиты «Normal».

Давайте посмотрим что будет. Сначала отключаем питание.

WD_SlowResponding_11

Потом включаем. Диск раскручивается, слышна калибровка и он выходит в готовность.

WD_SlowResponding_12

Давайте прочитаем его идентификацию.

Правый щелчок → «Читать паспорт».

WD_SlowResponding_13

Видно, что он определился не своим родным серийным номером, а, если говорить жаргонным названием, хузом (XYZ).

WD_SlowResponding_14

Из-за того, что мы блокировали доступ 02, то серийный номер из модуля 02 не читается. При этом оверлей запускается. Теперь можно зайти в утилиту, но уже в режиме «Normal».

WD_SlowResponding_15

То есть не «Kernel» подсвечивается, а «Normal». И выполняем запуск утилиты.

WD_SlowResponding_16

В режиме «Kernel» доступ к служебной зоне нельзя реализовать, а в режиме с блокировкой модуля 02 нам уже доступна служебная зона.

Для начала нужно создать ее резервную копию «Тесты → Служебная информация → Резервирование ресурсов HDD → Ok → Ok». Я обычно треки не сохраняю и снимаю галочку «Треки SA».

WD_SlowResponding_17

Жмем последний раз «OK» и пошло копирование. Тут есть одна интересная ошибочка. Вместо модуля 0D у нас модуль 02.

WD_SlowResponding_18

Это и есть механизм блокировки, когда мы модуль 0D заменяем на модуль 02. Поэтому модуль 02 у нас не копируется с поверхности и в этом бэкапе будет отсутствовать. Но сейчас мы это решим немножко другим способом.

После того, как процесс резервного копирования завершен, нам нужно прочитать оригинальный модуль 02 на всякий случай. Для этого мы идем в «Инструменты → Каталог модулей».

WD_SlowResponding_20

В открывшемся списке видно, что у нас есть модуль 02.

WD_SlowResponding_21

Нам нужно его прочитать. Он читается, потому, что чтение идет в режиме ABA.

WD_SlowResponding_22

Можно менять переключатель и читать по ABA или по ID.

WD_SlowResponding_24

Если сейчас по ID поставить, то этот же самый модуль не читается, пишет «Invalid file ID». Программа пытается читать модуль 02, а реально там лежит модуль 0D.

Переключаемся снова в режим ABA и сохраняем модуль.

WD_SlowResponding_25

Среди данных виден серийный номер нашего диска.

WD_SlowResponding_26

Далее, переключаемся обратно в протокол.

WD_SlowResponding_27

В утилите есть опция под названием «Решение проблемы ‘slow responding’».

WD_SlowResponding_28

Это как раз относится к теме нашего видео — о зависающих дисках. Нажимаем на эту опцию. В данном случае программа будет писать модуль 02, а если указать режим ID, то запись будет вестись куда-то не туда, потому, что мы сделали блокировку. Поэтому мы указываем «Запись по АВА».

WD_SlowResponding_29

Чтобы обе копии исправить ставим две галочки. Жмем ОK.

Когда процесс завершится, мы увидим, что программа пытается сначала прочитать по ID, потом идет на чтение по ABA, затем идет правка.

Давайте попробуем сделать обратно, а именно — разрешить доступ к модулю 02.

WD_SlowResponding_30

Идем в «Тесты → Служебная информация → Работа с ПЗУ → Разрешить доступ к модулю 02». Теперь нужно на всякий случай посмотреть все ли разрешилось.

WD_SlowResponding_31

Нажимаем «Инструменты → Просмотр и редактирование ресурсов HDD». В открывшемся диалоге выбираем ROM и в модуле 20B у нас вся информация.

WD_SlowResponding_32

Это можно проверить переключившись в протокол.

WD_SlowResponding_33

Там есть строчка «Чтение Flash ROM dir (Ext)…..:Ok (Active)». Это означает, что у нас правильный модуль 20В. Если бы «Active» было строчкой выше, то значит, модуль 0В был бы правильный.

Далее нам нужно в модуле 20В посмотреть опцию «WD Marvel ROM Flash dir».

WD_SlowResponding_34

После выбора опции мы видим модуль 0D.

WD_SlowResponding_35

Это практически победа! Теперь выключим питание и попробуем снова включить. Диск выходит в готовность. Теперь нажимаем «Инструменты → Редактор сектора → Да → Да».

WD_SlowResponding_36

И после этого видим данные пользовательской зоны!

WD_SlowResponding_37

Первый пример получился! На сегодня все, продолжение следует.

Поделиться ссылкой на пост в соц. сетях

7 thoughts on “PC 3000: зависающие HDD на примере Western Digital

  1. Алексей

    У вас творческий кризис? Решили пересказать кусок мануала от PC-3000?Давайте уже продолжение про изобретение HDD!

    Reply
    1. Sergei Post author

      Пока посылки из Китая идут (АЦП, ПЛИС, STM32) и еще такие же WD-хи 1995-ого года находятся, занимаюсь реализацией давней задумки про простые случаи использования PC-3000. Так как нас часто просят гос организации прочитать им лекции про PC-3000, то было бы не плохо прикладывать к ним «методички» подробные и с видео. Сейчас в работе по изобретению велосипеда диска два поста: про серводемодулятор и про макет «своей платы».

      Reply
      1. Алексей

        Страшное дело, эти короткие мануалы для чайников. Я уже представляю как они, толком ничего не прочитав, не осмыслив, не сделав бэкап ресурсов, не проверив пишут ли головы и есть ли вообще записи в Relo-листе, слепо тыркают в волшебную педаль «слоу респондинг» 🙂 А потом, чтобы наверняка все починить, начинают очищать листы дефектов, пересчитывают трансляторы, записывают чужие зонники и т.п. (:

         

        Reply
        1. Sergei Post author

          Есть такие, которые чтобы «увидеть данные» начинают дефекты в P-List добавлять не обращая внимание на предупреждение… В моем опусе бэкап ресурсов есть 🙂

          Reply
  2. igan

    >>«Тесты → Работа с ПЗУ → Блокировать доступ к модулю 02».

    Интересно, а физически в дамп spi флешки после этой комманды что меняется?

    Есть дампы слитые до и после?

     

    Reply
    1. Sergei Post author

      Меняется 1 байт в модуле 0B или 20B (они в ПЗУ хранятся) в зависимости от того, какой из них задействован. Байт этот — идентификатор модуля 0D. Меняется он на 02. Т.е. когда диск доходит до чтения модуля 02 он пробует его прочитать, а по таблице получается, что он читает содержимое модуля  0D и останавливает запуск с практически полностью инициализированной микропрограммой.

      Reply
  3. Ури

    Шикарно! Огромное спасибо! Побольше бы таких разборов!

    Reply

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *