Самотестирование диска с помощью 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.
Discussion