🐹 CentOS 7: Восстанавливаем битые сектора на диске. Утилита smartmontools. Утилита smartctl. Утилита dd.

Содержание:

1. Введение.
2. Диагноз по атрибутам.
3. Вариант решение проблемы.
4. Работа со значением счетчика.
5. Нулевое значение.
6. Способ автоматизации.
7. Оригиналы источников информации.


1. Введение.

Живешь ты такой своей обычной жизнью системного администратора и тут тебе на почту от сервера начинают приходить вот такие интересные письма…

Потом такие…

Затем такое пришло…

Ладно, шучу, выключил сервер, поправил провода и всё заработало обратно, но битые сектора так просто не чинятся.

Если поднять логи попыток чтения  этого диска, то можно обнаружить интересные строки о работе диска.

2. Диагноз по атрибутам.

На Википедии существует подробное описание атрибутов S.M.A.R.T.  

Типичные спутники большинства проблем с механическими жесткими дисками — увеличившиеся счётчики Current_Pending_Sector и Offline_Uncorrectable.

Из всего отчёта нас интересуют в первую очередь они:

# sudo smartctl -A -f brief /dev/sde | grep -e 196 -e 197 -e 198 -e ID

Рассмотрим подробно каждый из счетчиков.

  • Current Pending Sector.

В счётчике Current_Pending_Sector указано число секторов, которые диск не смог прочитать. Это критическая ошибка в том смысле, что данные уже не восстановить, но не фатальная в том смысле, что для этих секторов у диска ещё есть резерв. При следующей записи в эти секторы прошивка диска сделает логическую замену их другими секторами из резерва, который, как обычно подразумевается, находится в другой физической части диски.

  • Offline Uncorrectable Sector Count.

В счётчике Offline_Uncorrectable указано число секторов, которые диск не смог восстановить во время операций, предусмотренных предыдущим пунктом.

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

  • Reallocated Event Count.

Счётчик Reallocated_Event_Count тоже представляет для нас интерес. В этом счётчике указано число секторов, которые были заменены на резервные. Если в этом счётчике есть какое-то ненулевое значение, а в других счётчиках всё по нулям, то это говорит о том, что с диском уже проводились восстановительные операции, подобные описанным в этой статье.

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

3. Вариант решение проблемы.

Для решения проблемы нам понадобится утилита smartctl. Она входит в пакет Smartmontools, который состоит из двух утилит — smartctl и smartd. Вместе они представляют мощную систему мониторинга и предупреждения о возможных поломках HDD в CentOS 7.

Подробнее работа с Smartmontools описана в инструкции «CentOS 7: Работа со S.M.A.R.T. Утилита smartmontools. Утилита smartctl.»

Запуск установки Smartmontools производится через терминал:

# yum -y install smartmontools

Теперь посмотрим какие устройства хранения данных имеются у нас в системе, но силами утилиты smartctl, которую мы только что поставили:

# smartctl --scan

Везде в инструкция ниже мы будет работать с диском /dev/sde, хоть в примерах такого диска и нет.

Чтобы диск сделал логическую замену сектора, сектор нужно перезаписать нулями. Для чего нужно знать какой именно сектор нужно перезаписывать. В самих атрибутах нет данных о конкретных секторах, вызвавших ошибку. Координаты сектора можно найти в логе самотестирования диска.

Запустим быстрый тест, который быстро покажет проблемный сектор:

# sudo smartctl -t short /dev/sde | grep ^Test

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

Для верности подождём и после обозначенного времени смотрим на первую строку в логе тестов:

# sudo smartctl -l selftest /dev/sde | grep -e '# 1' -e Num

Проблемный сектор будет в последней колонке отчёта. Номер его указан в физических координатах относительно диска, а чтобы мы могли перезаписать этот сектор нулями, нам нужно знать логические координаты относительно операционной системы.

# sudo smartctl -i /dev/sde | grep 'Sector Sizes'

Физические секторы на диске имеют размеры в 4 Кб, но логический сектор (LBA) имеет размер 512 байт. Значит нам нужно перезаписать нулями физический сектор размером 4 Кб, используя LBA, посчитанный исходя из размера сектора в 512 байт.

Внимание! Дальнейшие инструкции натурально удаляют данные с диска. При ошибке данные вернуть будет нельзя. Данные будут удалены совсем и навсегда. Это не шутка. Проверяйте каждую команду по несколько раз. Если сомневаетесь, ни шагу дальше.

Перезаписывать нужно именно физический сектор целиком. Если попытаться перезаписать восемь секторов по 512 байт, которые вроде как соответствуют одному сектору по 4 Кб, то диск вернёт ошибку:

# sudo dd if=/dev/zero of=/dev/sde bs=512 count=8 seek=451365794 conv=fdatasync

Если заметить, что физический сектор в восемь раз больше логического (4096/512 = 8), то проблема высчитывания смещения от начала диска сводится к делению LBA-координат проблемного сектора на восемь:

# sudo dd if=/dev/zero of=/dev/sde bs=4096 count=1 seek=$((451365794/(4096/512))) conv=fdatasync

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

Флаг fdatasync в этой команде указывает дождаться физической записи сектора на диск, а если это не удастся, то dd сообщит об ошибке. Это означает, что если команда завершилась с ошибкой и во второй раз, то, или вы ошиблись в расчётах, или диск восстановлению не подлежит.

После успешной перезаписи число проблемных секторов уменьшится:

# sudo smartctl -A -f brief /dev/sde | grep -e 197 -e ID

Уменьшение счётчика Current_Pending_Sector говорит об успехе нашей операции. Если этот или другие счётчики не изменили своих значений, то это, скорее всего, означает что в расчёте координат сектора есть ошибка (был перезаписан нулями не тот сектор).

4. Работа со значением счетчика.

Такую же процедуру следует повторить до уменьшения счётчика проблемных секторов до нуля:

  • Запускаем быстрое самотестирование тест диска.
  • Смотрим координаты проблемного сектора из лога.
  • Перезаписываем сектор нулями.
  • Сверяемся с атрибутами.

И так далее.

# sudo smartctl -t short /dev/sde | grep ^Test

# sudo smartctl -l selftest /dev/sde | grep -e '# 1' -e Num

# sudo dd if=/dev/zero of=/dev/sde bs=4096 count=1 seek=$((451407136/(4096/512))) conv=fdatasync

Не составляет особого труда заскриптовать эту операцию.

5. Нулевое значение.

Спустя какое-то время тесты будут проходить без ошибок, а счётчик битых секторов Current Pending SectorOffline Uncorrectable) будет показывать ноль.

# sudo smartctl -l selftest /dev/sde | grep -e '# 1' -e Num

# sudo smartctl -A -f brief /dev/sde | grep -e 197 -e ID

После исправления всех ошибок стоит запустить глубокое тестирование диска:

# sudo smartctl -t long /dev/sde

Эта операция займёт ощутимое время. Если по её итогам найдутся ещё какие-то ошибки, то шаги выше нужно будет повторить.

6. Способ автоматизации.

Можно обойтись без большей части операций выше если данные на диске не представляют ценности (например, это диск из RAID 1). Для этого запускаем полный тест командой выше, дожидаемся его завершения с ошибкой, затем перезаписываем весь диск целиком нулями:

# sudo dd if=/dev/zero of=/dev/sde bs=64k oflag=direct status=progress

В этой команде можно обратить внимание на два флага: один — для прямо записи на диск, минуя кеш операционной системы, и второй: для показа процесса копирования. Последняя опция есть в GNU coreutils по крайней мере начиная с версии 8.24, а все версии, выпущенные после 2016 года. Если используется более старая версия dd, то можно или просто подождать, либо использовать трюк с pv.

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

# sudo smartctl -l selftest /dev/sde | grep -e '# 1' -e Num

7. Оригиналы источников информации.

  1. alexeykopytko.com «Восстанавливаем битые сектора на диске с помощью smartctl и dd».

Читайте также: