Восстановление битых секторов на жестком диске

Есть у меня 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 мне прослужит еще какое то время!

Комментарии ()

    Есть вопрос или предложение пиши в Telegram @cloudsv

    MTProto прokси для Telegram

    Прямой эфир

    cloudsv 10 сентября 2020, 13:17
    MySQL Workbench падает при подключении 2
    cloudsv 31 августа 2020, 15:55
    Let's Encrypt это легко и просто 2
    cloudsv 05 августа 2020, 11:57
    Мне вчера стукнуло 34 4
    Алексей 19 июня 2020, 15:06
    Обновление Scala Rider G4 34
    Tmks 24 января 2020, 01:05
    Настройка прокси mtproto для Telegram 50
    cloudsv 26 октября 2019, 20:11
    Linux I/O Scheduler, для кого какой? 2
    alex 26 февраля 2019, 11:28
    Установка и настройка minidlna 1
    Георгий 18 декабря 2018, 09:13
    Пароль от резервной копии Bitrix 2
    cloudsv 17 октября 2020, 09:55
    Arch Linux Отключить DHCP IPv6 в systemd 0
    cloudsv 30 июля 2020, 21:54
    О жизни Мне вчера стукнуло 34 4
    cloudsv 15 апреля 2020, 15:45
    Arch Linux Основные hotkeys редактора Vim 0
    cloudsv 01 октября 2019, 08:00
    Arch Linux Локальный редирект порта в Linux 0
    cloudsv 25 августа 2019, 16:14
    О жизни Социальная сеть от Яндекса Aura 0
    cloudsv 30 июля 2019, 21:34
    О жизни 33 year old 0
    cloudsv 25 июня 2019, 18:29
    Telegram Полезные боты в Telegram 0