SMART указывает один ожидающий сектор на жестком диске моего сервера. Я читал множество статей, в которых рекомендовалось использовать hdparm, чтобы «легко» заставить диск переместить поврежденный сектор, но я не могу найти правильный способ его использования.
Некоторая информация из моего "smartctl":
Error 95 occurred at disk power-on lifetime: 20184 hours (841 days + 0 hours)
When the command that caused the error occurred, the device was active or idle.
After command completion occurred, registers were:
ER ST SC SN CL CH DH
-- -- -- -- -- -- --
40 51 00 d7 55 dd 02 Error: UNC at LBA = 0x02dd55d7 = 48059863
Commands leading to the command that caused the error were:
CR FR SC SN CL CH DH DC Powered_Up_Time Command/Feature_Name
-- -- -- -- -- -- -- -- ---------------- --------------------
c8 00 08 d6 55 dd e2 00 18d+05:13:42.421 READ DMA
27 00 00 00 00 00 e0 00 18d+05:13:42.392 READ NATIVE MAX ADDRESS EXT
ec 00 00 00 00 00 a0 02 18d+05:13:42.378 IDENTIFY DEVICE
ef 03 46 00 00 00 a0 02 18d+05:13:42.355 SET FEATURES [Set transfer mode]
27 00 00 00 00 00 e0 00 18d+05:13:42.327 READ NATIVE MAX ADDRESS EXT
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% 20194 48059863
# 2 Short offline Completed without error 00% 15161 -
С этой "плохой LBA" (48059863) в руке, как мне использовать hdparm? Какой тип адреса должны иметь параметры «--read-sector» и «--write-sector»?
Если я дам команду hdparm --read-сектор 48095863 / dev / sda он читает и выгружает данные. Если эта команда верна, я должен ожидать ошибки ввода-вывода, верно?
Вместо этого он выгружает данные:
$ ./hdparm --read-sector 48059863 /dev/sda
/dev/sda:
reading sector 48059863: succeeded
4b50 5d1b 7563 a932 618d 1f81 4514 2343
8a16 3342 5e36 2591 3b4e 762a 4dd7 037f
6a32 6996 816f 573f eee1 bc24 eed4 206e
(...)
Если по какой-либо причине вы предпочитаете попытаться очистить эти поврежденные сектора и не заботитесь о существующем содержимом диска, может помочь приведенный ниже фрагмент оболочки. Я тестировал это на более старом накопителе Seagate Barracuda, срок гарантии которого истек. Он может не работать с другими моделями или производителями дисков, но он должен направить вас на правильный путь, если вы должен сценарий что-нибудь. Это воля уничтожить все содержимое на диске.
Вы можете предпочесть просто запуск плохих блоков, безопасное стирание hdparm (SE) (https://wiki.archlinux.org/index.php/Securely_wipe_disk) или какой-либо другой инструмент, который действительно предназначен для этого. Или даже производитель предоставил такие инструменты, как SeaTools (есть 32-битная версия Linux для предприятий, погуглите).
Прежде чем делать это, убедитесь, что диск, о котором идет речь, полностью не используется / отключен. Кроме того, я знаю, что цикл while, никаких оправданий. Это хак, ты можешь улучшить ...
baddrive=/dev/sdb
badsect=1
while true; do
echo Testing from LBA $badsect
smartctl -t select,${badsect}-max ${baddrive} 2>&1 >> /dev/null
echo "Waiting for test to stop (each dot is 5 sec)"
while [ "$(smartctl -l selective ${baddrive} | awk '/^ *1/{print substr($4,1,9)}')" != "Completed" ]; do
echo -n .
sleep 5
done
echo
badsect=$(smartctl -l selective ${baddrive} | awk '/# 1 Selective offline Completed: read failure/ {print $10}')
[ $badsect = "-" ] && exit 0
echo Attempting to fix sector $badsect on $baddrive
hdparm --repair-sector ${badsect} --yes-i-know-what-i-am-doing $baddrive
echo Continuning test
done
Одним из преимуществ использования метода самотестирования является то, что нагрузка обрабатывается микропрограммой накопителя, поэтому компьютер, к которому он подключен, не загружается, как это было бы с dd или badblocks.
ПРИМЕЧАНИЕ: извините, я допустил ошибку, правильное условие while такое:
while [ "$(smartctl -l selective ${baddrive} | awk '/^ *1/{print $4}')" = "Self_test_in_progess" ]; do
И условие выхода сценария становится:
[ $badsect = "-" ] || [ "$badsect" = "" ] && exit 0
Я думаю, что он мог читать без ошибок, потому что этот сектор неплох, но другие инструменты не могут прочитать этот сектор из-за какого-то другого поведения. (читать дальше, что доходит до фактически нечитаемого сектора?)
Я обнаружил несколько сбойных секторов, и если я восстановлю единственный, который не читается, с помощью команды «hdparm --read-sector», другие «плохие» сектора внезапно перестанут считываться с такими вещами, как dd. И что интересно, при просмотре вывода "dmesg" сообщаются только нечитаемые файлы hdparm.
например. У меня были сектора с 36589320 по 36589327 и с 36589344 по 36589351, нечитаемые с помощью dd, но только 36589326 и 36589345 не читались с помощью hdparm --read-sector. Затем я использовал hdparm --write-sector для этих 2, и тогда все 16 секторов снова стали доступны для чтения.
Вот небольшая часть вывода dmesg:
[30152036.527940] end_request: I/O error, dev sda, sector 36589326
[30152077.363710] end_request: I/O error, dev sda, sector 36589345
И информация о диске:
# smartctl -i /dev/sda
...
=== START OF INFORMATION SECTION ===
Device Model: TOSHIBA MK2002TSKB
...
Firmware Version: MT2A
User Capacity: 2,000,398,934,016 bytes [2.00 TB]
Sector Size: 512 bytes logical/physical
...
И, по всей видимости, прошивка этого диска либо неправильно записывает перераспределенные сектора, либо они не были перераспределены, а просто повреждены (например, неисправимая ошибка ECC, но поверхность все еще работает, как будто это было вызвано гнилью бит, а не неисправной электроникой или плохие медиа):
# smartctl -A /dev/sda | egrep "Reallocated|Pending|Uncorrectable"
5 Reallocated_Sector_Ct 0x0033 100 100 050 Pre-fail Always - 0
196 Reallocated_Event_Count 0x0032 100 100 000 Old_age Always - 0
197 Current_Pending_Sector 0x0032 100 100 000 Old_age Always - 0
198 Offline_Uncorrectable 0x0030 100 100 000 Old_age Offline - 0
# smartctl -l error /dev/sda
...
SMART Error Log Version: 1
No Errors Logged
Обратите внимание, я запустил --read-сектор и --write-сектор. Для правильного перераспределения сектора может потребоваться чтение, а не только запись. Если вы сначала не прочитаете, он может не знать, что сектор плохой.