Sebelumnya, sedikit pesan singkat dari saya:
Jangan pernah menghidupkan laptop di dalam mobil yang sedang berjalan.
Untuk menutupi harddisk bad-sector ada dua cara, cara singkat dan cara panjang.
Cara singkat,
$ fsck.ext4 -vcck [harddisk]
akan dilakukan oleh sistem, dengan program fsck akan menjalankan program
badblocks dan menyimpan setiap bad-sector di inode tertentu supaya tidak
terpakai oleh berkas atau direktori.
Untuk informasi lebih lanjut, man fsck
.
Cara panjang di bagian seterusnya.
Paket-paket yang dibutuhkan,
-
smartmontools
-
e2fsprogs.
Catat informasi harddisk
Periksa besar unit, sektor, dan partisi pada harddisk anda dengan cara,
$ fdisk -lu [harddisk]
Keluarannya seperti,
Disk /dev/sda: 320.1 GB, 320072933376 bytes, 625142448 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0xaaf6aaf6 Device Boot Start End Blocks Id System /dev/sda1 * 63 23438834 11719386 83 Linux /dev/sda2 23438835 625142447 300851806+ 83 Linux
dan,
$ tune2fs -l /dev/sda2 | grep Block
keluarannya seperti,
Block count: 75212951 Block size: 4096 Blocks per group: 32768
Yang perlu dicatat adalah Unit size (512), dan Block Size (4096), seperti yang terlihat pada keluaran berwarna merah di atas. Selain itu yang perlu diperhatikan adalah "Start" dan "End" (warna biru pada keluaran) dari setiap partisi karena nanti akan digunakan.
Jalankan tes harddisk
Simpan skrip berikut dengan nama smartctl-select.sh,
#!/bin/bash smartctl -t select,$1-max /dev/sda2
Jalankan program tersebut dengan diawali dari Logical Block Address (LBA) 0,
$ ./smartctl-select.sh 0
Tunggu beberapa saat sampai hasil tes keluar,
smartctl 6.1 2013-03-16 r3800 [i686-linux-3.9.2-1-ARCH] (local build) Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org === START OF READ SMART DATA SECTION === SMART Self-test log structure revision number 1 Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error #1 Selective offline Completed: read failure 90% 1845 27949496
Keluaran dari tes yaitu "Completed: read failure", dengan sektor LBA yang
gagal berada di 27949496.
Karena nilai tersebut berada di antara 23438835 dan 625142447 itu berarti
partisi yang memiliki bad-sector adalah /dev/sda2
(lihat kembali keluaran
fdisk pada bagian 00).
Hitung sektor dari LBA
Simpan skrip berikut dengan nama get-sector.sh
(ganti nilai u
dengan
unit-size, bs
dengan Block-Size, sesuai dengan dari hard disk anda; dan
partstart
sesuai dengan nilai "Start" dari partisi yang rusak).
#!/bin/bash export u=512 export bs=4096 export partstart=23438835 export lba=$1 export sector=0 let sector=$[(($lba - $partstart) * $u) / $bs] echo $sector
Jalankan skrip tersebut dengan parameter LBA yang error untuk mendapatkan posisi sektor,
$ ./get-sector.sh 27949496
keluarannya: 563832.
Cek kemungkinan bad-sector di sektor selanjutnya
Simpan skrip berikut dengan nama cbb.sh
,
#!/bin/bash export i=$1; export x=$2; rm -f cbb.out; trap "exit" INT; while [ $i -lt $x ]; do echo $i; dd if=/dev/sda2 of=/dev/null bs=4096 count=1 skip=$i status=none; let i+=1; done &> cbb.out
Jalankan skrip tersebut,
$ ./cbb.sh 563830 564000
Skrip tersebut akan mencek bad-sector dari sektor 563830 sampai sektor 564000. Hasil cek akan tersimpan di berkas bad.out. Contoh keluarannya,
563830 563831 dd: error reading ‘/dev/sda2’: Input/output error 563832 dd: error reading ‘/dev/sda2’: Input/output error 563833
Dari keluaran di atas diketahui bad-sector mulai di posisi 563831 dan berakhir di 563832 (2 sektor).
Timpa bad-sector dengan nilai 0
Simpan skrip berikut dengan nama dd.sh
,
#!/bin/bash export _c=$1 export _s=$2 read -p "Are you sure? " -n 1 -r if [[ $REPLY =~ ^[Yy]$ ]] then dd if=/dev/zero of=/dev/sda2 bs=4096 count=$_c seek=$_s sync fi
Jalankan dengan parameter pertama yaitu jumlah bad-sector yang akan ditimpa, dan parameter kedua yaitu posisi awal dari sektor yang akan ditimpa,
$ ./dd.sh 2 563831
Cuci dan ulangi
Jalankan ulang langkah 01 sampai 04 sampai hasil tes dari smartctl mengeluarkan keluaran "Completed without error" atau nilai LBA_of_first_error-nya kosong.