kilabit.info
Build | GitHub | Mastodon | SourceHut |

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.