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!




Actually, I hope you have a backup of that backup, since the bad blocks will keep on extending.
You are right, but it was more of an exercise in pride :)