Checking badblocks with smartmontools

… and some other observations. Warning: use at your own risk!

I used to keep some of my photo backups on an external Seagate 500G drive which I also use for travel. Today however as I tried to access it I noticed some problems so I quickly ran:

smartctl -t long /dev/sdb
#followed by
smartctl -l selftest
#the result
Extended offline    Completed: read failure       90%       109         414996448

I started using this useful guide to correct the problems by repeatedly running smartctl, calculating the offset, finding the file with debugfs, forcing reallocation with dd and so on. However it seems there are a lot of bad blocks and even I realize the disk is quite gone I decided to write a small script to test the hole disk and try to fix it. Here it is:

#!/bin/bash
 
DEV=/dev/sdb
MNT=/dev/sdb1 #assuming a single partition
START=2048 #which starts at 2048
BS=4096 #block size 4096
 
while : ; do
    smartctl -l selftest $DEV | egrep '# 1' | grep 'Completed: read failure'
    if [ $? -eq 0 ] ; then
	lba=$(smartctl -l selftest $DEV | egrep '# 1' | cut -c78-86)
	pos=$(echo "($lba-$START)*512/$BS" | bc)
	echo Read failure at $lba. Writting at $pos
	dd if=/dev/zero of=$MNT bs=$BS count=1 seek=$pos
	sync
	#smartctl --test long $DEV
        smartctl -t select,$lba-max $DEV
    else
        echo Still ok
    fi
    sleep 1m
done

Also as a note. The disk will spin down of it’s own after some time and the test will be “Aborted by host”. Use sdparm to change the STANDBY param:

sdparm -a /dev/sdb
/dev/sdb: Seagate Portable 0130
Power condition mode page:
PM_BG 0 [cha: n, def: 0, sav: 0]
STANDBY_Y 0 [cha: n, def: 0, sav: 0]
IDLE_C 0 [cha: n, def: 0, sav: 0]
IDLE_B 0 [cha: n, def: 0, sav: 0]
IDLE 0 [cha: n, def: 0, sav: 0]
STANDBY 1 [cha: y, def: 1, sav: 1]
ICT 0 [cha: n, def: 0, sav: 0]
SCT 3000 [cha: y, def:3000, sav:3000]
SAT ATA Power condition mode page:
APMP 0 [cha: n, def: 0, sav: 0]
APM 0 [cha: n, def: 0, sav: 0]
root@purple:~# sdparm --clear STANDBY -6 /dev/sdb
/dev/sdb: Seagate Portable 0130
root@purple:~# sdparm -a /dev/sdb
/dev/sdb: Seagate Portable 0130
Power condition mode page:
PM_BG 0 [cha: n, def: 0, sav: 0]
STANDBY_Y 0 [cha: n, def: 0, sav: 0]
IDLE_C 0 [cha: n, def: 0, sav: 0]
IDLE_B 0 [cha: n, def: 0, sav: 0]
IDLE 0 [cha: n, def: 0, sav: 0]
STANDBY 0 [cha: y, def: 1, sav: 1]
ICT 0 [cha: n, def: 0, sav: 0]
SCT 4294967286 [cha: y, def:3000, sav:3000]
SAT ATA Power condition mode page:
APMP 0 [cha: n, def: 0, sav: 0]
APM 0 [cha: n, def: 0, sav: 0]

Warning: use at your own risk!

Related Posts with Thumbnails
Be Sociable, Share!

2 Responses

  1. Actually, I hope you have a backup of that backup, since the bad blocks will keep on extending.

  2. You are right, but it was more of an exercise in pride :)

Leave a Reply

*