Есть у меня WD Black(WDC WD1003FBYX-01Y7B0) объемом 1TB, и при записи на него в лог сыпались ошибки, скорость записи была очень низкая и все было не так, все было не то.
Такие ошибки сыпались в консоль:
янв 26 13:16:47 izero kernel: ata2.00: configured for UDMA/133
янв 26 13:16:47 izero kernel: sd 1:0:0:0: [sdb] tag#7 FAILED Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE cmd_age=1s
янв 26 13:16:47 izero kernel: sd 1:0:0:0: [sdb] tag#7 Sense Key : Medium Error [current]
янв 26 13:16:47 izero kernel: sd 1:0:0:0: [sdb] tag#7 Add. Sense: Unrecovered read error - auto reallocate failed
янв 26 13:16:47 izero kernel: sd 1:0:0:0: [sdb] tag#7 CDB: Read(10) 28 00 35 01 14 52 00 00 01 00
янв 26 13:16:47 izero kernel: blk_update_request: I/O error, dev sdb, sector 889263186 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 0
янв 26 13:16:47 izero kernel: Buffer I/O error on dev sdb, logical block 889263186, async page read
янв 26 13:16:47 izero kernel: ata2: EH complete
янв 26 13:16:49 izero kernel: ata2.00: exception Emask 0x0 SAct 0x2000 SErr 0x0 action 0x0
янв 26 13:16:49 izero kernel: ata2.00: irq_stat 0x40000008
янв 26 13:16:49 izero kernel: ata2.00: failed command: READ FPDMA QUEUED
янв 26 13:16:49 izero kernel: ata2.00: cmd 60/01:68:52:14:01/00:00:35:00:00/40 tag 13 ncq dma 512 in
res 41/40:00:52:14:01/00:00:35:00:00/40 Emask 0x409 (media error) <F>
янв 26 13:16:49 izero kernel: ata2.00: status: { DRDY ERR }
янв 26 13:16:49 izero kernel: ata2.00: error: { UNC }
В итоге жесткий диск из за большого количество ошибок переходил в режим ReadOnly, моя жопа почуяла, что быть беде и все мои 40гб фоток и остальные бесполезные файлы могут кануть в небытие, освободил место на соседних дисках и начал выкачивать накопленные годами данные.
В какой то степени я смирился с потерей, но стало интересно, можно ли с диском что нибудь сделать, вбил в гугл непомню какой запрос и попал на
страницу с решение данной проблемы.
Автор рассказывает в чем может быть дело и подробности вывода SMART.
Так же он описывает решение проблемы, которое я продублирую у себя в бложике.
1. Запускаем короткий тест диска
sudo smartctl -t short /dev/sdb | grep ^Test
2. Смотрим на каком секторе тест зафейлился, номер проблемного сектора находится в последней колонке
sudo smartctl -l selftest /dev/sdb | grep -e '# 1' -e Num
3. Смотрим размер сектора (у меня такого значения в смарте нет, я тупо глянул при помощи fdisk, но думаю с большой вероятностью у вас тоже 512)
sudo smartctl -i /dev/sdb | grep 'Sector Sizes'
4. Затираем битый сектор нулями при помощи утилиты
dd,
151365793 — Номер битого сектора
sudo dd if=/dev/zero of=/dev/sdb bs=4096 count=1 seek=$((151365793/(4096/512))) conv=fdatasync
5. Запускаем снова тест и повторяем до победного.
Как автор и рекомендовал, для этой операции накидал простенький скриптик, может кому пригодится
#!/bin/bash
LBA=0
DISK="/dev/sdb"
while(true);do
sudo smartctl -l selftest $DISK | grep -e '# 1' -e Num | tail -1 | awk '{print $10}'
newLBA=$(sudo smartctl -l selftest $DISK | grep -e '# 1' -e Num | tail -1 | awk '{print $10}')
echo "New LBA: #$newLBA, Old LBA: #$LBA"
if [[ ! $newLBA =~ ^[0-9]+$ ]];then
echo "LBA NOT a NUMBER"
exit 1
fi
if [[ $newLBA != $LBA ]];then
LBA=$newLBA
echo "Clean $LBA"
sudo dd if=/dev/zero of=$DISK bs=4096 count=1 seek=$(($LBA/(4096/512))) conv=fdatasync
sudo smartctl -t short $DISK | grep ^Test
sleep 5
fi
sleep 1
done
Алгоритм простой, в вечном цикле запускается тест и смотрится есть ли бэдовый сектор и если он отличается от предыдущего затирается нулями и снова запускается тест.
После того как исправите все ошибки запустите долгий тест, оно длится около часа
sudo smartctl -t long /dev/sdb
Хочется сказать спасибо автору(Alexey Kopytko), но у него нет на сайте комментариев, поэтому скажу ему здесь:
Спасибо Alexey Kopytko, WD мне прослужит еще какое то время!
Комментарии ()