Mengembalikan File yang Terhapus Permanen dengan Linux

Ada kalanya, kita secara tidak sengaja menghapus file tertentu. Menghapus ini bisa berarti melakukan operasi deletion, atau overwrite (menimpa), atau menghapus sebagian isi file secara sengaja maupun tidak disengaja. Nah, ternyata ada cara untuk melakukan recovery pada file-file tersebut.

Ada sedikit background story dari tulisan ini. Kebetulan memang hari ini tadi, seorang rekan saya yang juga merupakan seorang web developer menyadari bahwa terdapat satu file teks penting yang tiba-tiba ukurannya menjadi 0 byte, alias menjadi sebuah empty file. Sedihnya lagi, file ini tidak masuk ke dalam git repository, sehingga tidak ada backup dari file tersebut. Sebenarnya kami pun berusaha ikhlas dan berencana untuk mengulang pekerjaan pada file tersebut dari awal. Alhamdulillah, setelah satu-dua kali googling, saya menemukan salah satu thread di Stack Exchange yang cukup membantu. Tutorial ini sudah saya coba dan bekerja dengan baik di Ubuntu Server dan Manjaro Linux, dan semestinya berjalan dengan baik di berbagai komputer UNIX lainnya.

Pada dasarnya, ada dua perintah dasar linux yang digunakan, yaitu grep dan dd.

Pertama, kita perlu melakukan pencarian dengan search key tertentu menggunakan perintah grep. Usahakan search key yang digunakan terdapat pada versi terakhir file tersebut sehingga Anda dapat menemukan file dengan revisi terbaru. Berikut contoh perintahnya:
sudo grep -a -b "search-key-here" /dev/sda1

Parameter -a berarti bahwa pencarian dilakukan dengan asumsi bahwa tipe file yang dicari adalah file teks. Parameter kedua -b digunakan untuk menampilkan byte offset yang akan digunakan dalam perintah selanjutnya. Parameter ketiga merupakan search key yang harus Anda sesuaikan dengan key pencarian yang Anda lakukan. Terakhir, /dev/sda1 merupakan nama partisi harddisk tempat file tersebut berada. Sebagai catatan, untuk mengetahui daftar partisi harddisk, Anda dapat menggunakan perintah fdisk -l. Dalam tutorial ini, saya menggunakan partisi harddisk /dev/sda1, mohon sesuaikan dengan partisi Anda.

Selanjutnya, apabila berhasil ditemukan, eksekusi perintah grep tersebut akan menghasilkan daftar block yang memiliki search key yang dicari, contoh output-nya adalah sebagai berikut:
20199612669:         <div class="search-key-here">
20199633149:         <div class="search-key-here">
20199653629:         <div class="search-key-here">
20199682301:         <div class="search-key-here">

Block offset yang ditampilkan dalam format number yang berada di sebelah kiri adalah yang akan kita gunakan pada tahap selanjutnya. Akan terdapat beberapa hasil pencarian yang ditampilkan. Bisa saja, terdapat dua (atau lebih) file berbeda pada hasil pencarian ini. Oleh karenanya, usahakan menggunakan search key yang spesifik dan hanya akan ditemukan pada file yang ingin di-recover.

Setelah Anda mendapatkan block yang dicari, tahap selanjutnya adalah membuka block-block lainnya dengan menggunakan block yang terbaru. Block terbaru yang saya maksud adalah block terakhir yang ditampilkan pada hasil pencarian. Dalam contoh di atas, block yang saya maksud adalah 20199682301.

Tahap selanjutnya ini agak tricky, karena Anda perlu melakukan pencarian sepanjang block dari file tersebut. Pertama, jalankan perintah berikut:
dd if=/dev/sda1 count=1 skip=$(expr 20199682301 / 512) > file.txt
Perintah tersebut akan meng-copy isi block 20199682301 sepanjang satu block dan memasukkannya ke file.txt. Nah, kalau kita perhatikan hasil file.txt, maka kita hanya mendapatkan satu potong file tersebut. Oleh karenanya, Anda perlu merubah parameter count dan skip. Parameter count akan menentukan berapa banyak block yang akan di-copy. Coba Anda rubah menjadi 2, 3 dan seterusnya dan coba lihat hasilnya pada file.txt. Sedangkan, parameter skip akan melewati n blok tertentu sesuai masukan Anda. Ada cara simpel untuk ‘mengakali’ parameter ini yaitu dengan menambahkan + x ataupun - x untuk men-skip x blok setelahnya maupun x blok sebelumnya. Sehingga, perintah tadi dapat Anda rubah menjadi
dd if=/dev/sda1 count=1 skip=$(expr 20199682301 / 512 + 1) > file.txt, atau
dd if=/dev/sda1 count=1 skip=$(expr 20199682301 / - 1) > file.txt,
atau angka berapapun sesuai kebutuhan Anda. Tujuannya, Anda dapat mendapatkan kembali file tersebut secara utuh. Intinya, ‘mainkan’ parameter count dan skip. Oya, jangan melewatkan satu spasi sekalipun dari perintah di atas. 😉

Selamat mencoba, let me know if you’d like to ask anything!

1 comment

Leave a comment

Your email address will not be published. Required fields are marked *