Как сделать так, чтобы мой диск не отображался в ожидании нечитаемых секторов

10

У меня есть диск с некоторыми нечитаемыми секторами, согласно SmartD. Какой самый простой способ заставить диск переназначить их и не дать SmartD жаловаться?

Сегодня я получаю два из них каждый час:

10 сентября, 23:15:35 hylton smartd [3353]: устройство: / dev / sdc, 1 в настоящее время не читаемые (ожидающие) сектора

Система представляет собой систему x86 под управлением Ubuntu Linux 9.10 (просто). Диск является частью группы LVM. Вот как smartctl идентифицирует диск:

Семейство моделей: семейство Western Digital Caviar второго поколения Serial ATA
Модель устройства: WDC WD5000AAKS-00TMA0
Серийный номер: WD-WCAPW4207483
Версия прошивки: 12.01C01
Емкость пользователя: 500 107 862 016 байт
dkagedal
источник
2
Эта проблема решилась сама собой; диск начал жаловаться громче, поэтому я заменил его.
dkagedal

Ответы:

15

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

  1. Сектор успешно перечитан
  2. Сектор переписан

До тех пор сектор остается в ожидании. Таким образом, у вас есть два соответствующих способа справиться с этим:

  1. Продолжайте перечитывать сектор, пока не добьетесь успеха
  2. Перезаписать этот сектор новыми данными

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

Если рассматриваемый сектор содержит данные, которые вам не нужны, или которые можно восстановить из резервной копии, то перезапись этого файла, вероятно, является самым быстрым и простым решением. Затем вы можете просмотреть перераспределенные и ожидающие подсчеты для накопителя, чтобы убедиться, что сектор позаботился.

Как вы узнаете, какому сектору соответствует файловая система? Я нашел отличную статью на Smartmontools веб - сайте, здесь , хотя это довольно технические и специфично для ext2 / 3/4 и файловых систем Райзера.

Более простой подход, который я использовал на одном из моих собственных (Mac) дисков, заключается в том, чтобы использовать find / -xdev -type f -print0 | xargs -0 ...для чтения всех файлов в системе. Запишите ожидающий подсчет перед запуском. Если сектор находится внутри файла, вы получите сообщение об ошибке от инструмента, который вы использовали для чтения файлов (например, md5sum), с указанием пути к нему. Затем вы можете сосредоточить свое внимание на перечитывании только этого файла, пока он не будет успешно прочитан. Часто это решает проблему, если это нечасто используемый файл, который просто нужно было перечитать несколько раз. Если ошибка исчезнет или вы не столкнетесь ни с какими ошибками при чтении всех файлов, проверьте число ожидающих, чтобы увидеть, уменьшилось ли оно. Если это так, проблема была решена путем чтения.

Если файл не может быть успешно прочитан после нескольких попыток (например, 20), то вам нужно перезаписать файл или блок в файле, чтобы диск мог перераспределить сектор. Вы можете использовать ddrescue для файла (а не для раздела), чтобы перезаписать только один сектор, скопировав во временный файл и затем скопировав обратно. Обратите внимание, что просто удалить файл на этом этапе - плохая идея, потому что плохой сектор попадет в свободный список, где его будет сложнее найти. Полностью перезаписать это тоже плохо, потому что сектора снова попадут в свободный список. Вам нужно переписать существующие блоки. notruncВариант ddявляется одним из способов сделать это.

Если вы не столкнулись с ошибками, и число ожидающих не уменьшилось, то сектор должен быть в списке freelist или в части инфраструктуры файловой системы (например, таблица inode). Вы можете попытаться заполнить все свободное пространство cat /dev/zero >tempfile, а затем проверить количество ожидающих. Если проблема исчезнет, ​​проблема была в свободном списке и теперь исчезла.

Если сектор находится в инфраструктуре, у вас есть более серьезная проблема, и вы, вероятно, столкнетесь с ошибками, просто пройдясь по дереву каталогов. В этой ситуации, я думаю, единственное разумное решение - переформатировать диск, при необходимости используя ddrescue для восстановления данных в случае необходимости.

Внимательно следите за движением. Перераспределение сектора - очень хорошая канарейка в угольной шахте , потенциально предупреждающая о сбое привода. Принимая ранние меры, вы можете предотвратить последующий катастрофический и очень болезненный оползень. Я не предполагаю, что перераспределение нескольких секторов является признаком того, что вы должны отказаться от диска. Все современные диски должны быть перераспределены. Однако, если накопитель не очень старый (<1 года) или вы часто получаете новые перераспределения (> 1 / месяц), то я рекомендую заменить его как можно скорее.

У меня нет эмпирических доказательств, чтобы доказать это, но мой опыт показывает, что проблемы с диском можно уменьшить, читая время от времени весь диск, либо с помощью ddнеобработанного диска, либо читая каждый файл с использованием find. Почти все проблемы с дисками, с которыми я сталкивался в последние несколько лет, сначала возникали в редко используемых файлах или на машинах, которые не используются часто. Это также имеет смысл с точки зрения эвристики, так как, если сектор часто перечитывается, у привода есть шанс перераспределить его, когда он впервые обнаружит небольшую проблему с этим сектором, вместо того, чтобы ждать, пока сектор будет полностью нечитаемым. Накопитель не в состоянии что-либо делать с сектором, если только хост не получит к нему какой-либо доступ, либо прочитав или записав его, либо выполнив один из тестов SMART.

Я хотел бы поэкспериментировать с идеей ночной или еженедельной работы cron, которая читает весь диск. В настоящее время я использую «RAID для бедных», в котором у меня есть второй жесткий диск в машине, и я каждый вечер копирую на него основной диск. В некотором смысле это на самом деле лучше, чем зеркалирование RAID, потому что, если я ошибаюсь и удаляю файл по ошибке, я могу сразу получить вчерашнюю версию с резервного диска. С другой стороны, я считаю, что аппаратный RAID-контроллер хорошо выполняет фоновую работу, отслеживая, сообщая и исправляя проблемы с дисками по мере их появления. Мой текущий скрипт резервного копирования использует, rsyncчтобы избежать копирования данных, которые не изменились, но ввиду необходимости перечитать все сектора, возможно, было бы лучше скопировать все или иметь отдельный скрипт, который читает весь сырой диск каждую неделю.

Нил Мэйхью
источник
2
Если вы выполняете резервное копирование (rsyncing на внутренний диск не считается;)), тогда все ваши данные (повторно) считываются через определенные промежутки времени (в зависимости от вашего полного / инкрементного расписания резервного копирования). RAID или rsync не являются резервными заменителями. И, кстати, я «верю», что вы слишком сильно верите в поставщиков аппаратного RAID. ;)
maxschlepzig
@maxschlepzig: Вы правы. У меня также есть отдельный режим резервного копирования. Тем не менее, по моему опыту, вероятность потери данных из-за сбоя диска намного превышает все другие риски (кража, пожар и т. Д.). Современные жесткие диски имеют настолько низкую надежность, что я в настоящее время совершенно параноидален в отношении них. Так что мой второй внутренний драйв - это основная часть моей стратегии.
Нил Мэйхью
Я прочитал и перечитал содержимое диска, используя dd if=/dev/sda ...секторы, все еще ожидающие, есть идеи, почему?
Дмансфилд
@dmansfield, если вы не столкнулись с какими-либо ошибками, тогда я не уверен, почему. Я заметил, что только интеллектуальное значение является точным в интеллектуальном выводе, поэтому, если вы смотрели только на «приготовленное» значение, возможно, у вас нет ожидающих секторов.
Нил Мэйхью
1

Используйте программное обеспечение Data Lifeguard Diagnostic for DOS (загрузочный компакт-диск), доступное на сайте Western Digital.

AlexD
источник
1
  1. Сделайте резервную копию ваших данных
  2. Удалить это устройство из группы LVM
  3. dd if=/dev/zero of=/dev/sdc bs=4k- это удалит все данные на/dev/sdc
  4. Включите его снова в группу LVM
  5. Восстановите вашу резервную копию
maxschlepzig
источник
3
0. Есть резервная копия. :-)
Стивен Д
Но это ожидающая ошибка чтения, поэтому разве этого должно быть недостаточно, чтобы просто прочитать все сектора?
dkagedal
1
@dkagedal: Нет, прошивка HD уже обнаружила, что он не может прочитать этот сектор. Он не может восстановить его (сам по себе, кроме, возможно, повторных попыток и повторных попыток и удачи в какой-то момент ... надеюсь, это не поврежденные данные, а затем возвращенные) и, таким образом, устанавливает эту ошибку SMART. Но если микропрограмма обнаруживает запись в этом конкретном секторе, она отображает этот сектор (и больше не использует его) и вместо этого отображает резервный (рабочий) сектор по этому адресу.
maxschlepzig
@dkagedal: иногда только одно или два дополнительных чтения возвращают сектор обратно. В других случаях ничего не вернет. Кроме того, накопитель самостоятельно принимает решение о том, следует ли переназначить сектор или использовать его повторно, в зависимости от серьезности исходной ошибки и от того, сможет ли он успешно прочитать ее после записи в нее. Единственный способ узнать это - посмотреть на перераспределенный счетчик для накопителя. Я полагаю, что диски используют довольно обширные контрольные суммы, чтобы гарантировать, что при чтении данных они не повреждены, поэтому вы можете быть достаточно уверены в том, что сектор не был перераспределен.
Нил Мэйхью