Table of Contents

Самотестирование диска с помощью smartctl

Устанавливаем необходимый пакет smartmontools

sudo apt-get install smartmontools

Существуют два вида тестов - foreground (когда диск в ответ на все команды имеет статус CHECK CONDITION) и background - когда диск остается работоспособным.
Тесты бывают short и long.
Short - ограничен по времени и тестирует только часть диска.
Long - аналогичен финальному тестированию на производстве, не ограничен по времени и тестирует весь диск.

Запускаем “длинный” тест, который можно запускать прямо во время работы системы:

sudo smartctl -t long /dev/sdb

Узнать сколько времени займет тот или иной тест можно командой:

sudo smartctl -c /dev/sdc
  ...
Self-test execution status:      ( 249) Self-test routine in progress...
                                        90% of test remaining.
Total time to complete Offline 
data collection:                ( 1211) seconds.
  ...

После того как он закончится смотрим результат с помощью команды smartctl -l selftest /dev/sdb:

sudo smartctl -l selftest /dev/sdb
smartctl 5.40 2010-07-12 r3124 [x86_64-unknown-linux-gnu] (local build)
Copyright (C) 2002-10 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF READ SMART DATA SECTION ===
SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Extended offline    Completed: read failure       90%     28243         1048784

Также можно протестировать только часть диска. Команда:

sudo smartctl -t select,10-20 /dev/sdc

протестирует сектора с 10 по 20 включительно.
Кроме того, можно одной командой протестировать несколько диапазонов:

sudo smartctl -t select,0-10 -t select,5-15 -t select,10-20 /dev/sdc


Запустить foreground тест можно, указав опцию -C:

sudo smartctl -t  long -C /dev/sdc

Короткий foreground тест, который принудительно обновит значения параметров SMART можно запустить так:

sudo smartctl -t offline /dev/sda

Утилиты sg_verify и sg_reasign

Пакет утилит sg3-utils предназначен для работы с дисками на низком уровне, поддерживающими полный набор команд SCSI. В настоящее время - это диски с интерфейсом SAS (но не SATA).
Обнаружить нечитающийся сектор можно, например, с помощью команды dd:

sudo dd if=/dev/sdb of=/dev/null bs=4096

Затем, когда dd сообщит об ошибке, с помощью sg_verify можно удостовериться, что проблема именно в том секторе:

sudo sg_verify --lba=1193046 /dev/sdb
verify (10):  Fixed format, current;  Sense key: Medium Error
Additional sense: Unrecovered read error
Info fld=0x123456 [[1193046]]
Field replaceable unit code: 228
Actual retry count: 0x008b
medium or hardware error, reported lba=0x123456


Зетем можно проверить, что размер GLIST не очень велик и там есть место:

sudo sg_reassign --grown /dev/sdb
>> Elements in grown defect list: 0


Теперь можно выполнить переназначкение сектора и проверить, что размер GLIST изменился:

sudo sg_reassign --address=1193046 /dev/sdb
sudo sg_reassign --grown /dev/sdb
>> Elements in grown defect list: 1


Размер GLIST изменился на 1 - чего и следовало ожидать. В результате в переназначаемом секторе будет записан заданный производителем паттерн (либо - если сектор все-же удалось прочесть - его содержимое не изменится).
Также утилита sg_reassign может выполнить переназначение группы секторов.
Для дисков с интерфейсами SAS и SATA наборы команд для работы с переназначаемыми секторами различны. Диск с интерфейсом SAS (неважно подключен он к SATA или SAS контроллеру) способен безусловно переназначить группу секторов в резервную область независимо от того, читаемы сектора или нет. Использование sg_reasign для диска SATA скорее всего никакого эффекта не даст.

Переназначение секторов для дисков с интерфейсом SATA

Для переназначения секторов на дисках с интерфейсом SATA можно просто дать команду на перезапись этого сектора, либо воспользоваться hdparm:

sudo hdparm --repair-sector 

или

sudo hdparm --write-sector

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

sudo hdparm --repair-sector 1000 /dev/sda

или для группы секторов:

for i in {1000..2000}; do sudo hdparm --repair-sector $i /dev/sda; done

Аналог MHDD под Linux

С удивлением обнаружил наличие под Linux некоторого аналога (по крайней мере визуально) популярной программы под DOS - MHDD.
Речь идет об утилите, входящей в состав SystemRescueCd - whdd.