Merhaba sevgili e-bergi okuyucuları. Bu ayki yazımızda, Linux işletim sisteminde silinen dosyaları geri getirmekten bahsedeceğiz. Gerek günlük hayatta, gerekse iş hayatında bilgisayar kullanırken bir çok dosyayla çalışırız ve zaman zaman ihtiyaç duymadığımız dosyaları sileriz. Ancak bazen istenmeyen durumlarda olaşabilir: dalgınlıkla, ihtiyacımız olan bir dosyayı silmek gibi. Çoğu kullanıcı tamamen silinen dosyaların (shift + delete) geri getirilemeyeceğini zanneder. Ancak tam kesin olmamakla beraber, silinen verileri kurtarabilmek mümkündür. Bunun nasıl olduğunu anlamak için biraz harddiskin yapısından bahsetmekte fayda var.

En kaba tamirle harddisk çok sayıda blok grubundan oluşmuştur ve her bir blok grubunda belli sayıda blok bulunur. Veriler (ya da dosyalar) harddiske yazılırken işte bu blokların üzerine yazılırlar. Bu veriler silindiklerinde ise, artlarında iz bırakırlar ve bu izler takip edilerek tekrar geri getirilebilirler. Bu işlem bilgisayar aleminde data carving (veri oyma) olarak da bilinir. Bu yazıda, basit bir geri getirme işlemini anlatacağız; ancak öncelikle iki paketin yüklü olduğundan emin olmalıyız. Bu paketlerden birincisi The Sleuth Kit. The Sleuth Kit'in barındırdığı bir program ile öncelikle verinin silindiği blok grubunun içeriğini diskten ayıklayacağız. Ardından bu içeriği ikinci paketimiz olan Foremost ile anlamlı bütünler haline getirerek verileri kurtaracağız. Eğer Ubuntu kullanıcıysanız bu paketleri:

sudo apt-get install sleuthkit
sudo apt-get install foremost

komutlarıyla indirebilirsiniz. Başka bir Linux dağıtımı kullanıyor iseniz, paket yöneticiniz ile bu paktleri aratabilir ve indirebilir, bulamazsanız ise, The Sleuth Kit'i http://www.sleuthkit.org/sleuthkit/download.php adresinden, Foremost'u ise http://foremost.sourceforge.net/ adresinden indirip kurabilirsiniz.

Hazırsanız başlayalım. Diyelim ki, /home/senan/resimler (silinen dosyanızın bulunduğu klasör bundan farklı olacaktır) klasöründeki resim.jpg dosyasını sildiniz ve geri getirmek istiyorsunuz. Öncelikle bilgisayarımızda bulunan disklerin yapısını incelememiz gerekiyor.

senan@ubuntu:~$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda6              14G  4,5G  8,3G  35% /
tmpfs                 505M     0  505M   0% /lib/init/rw 
varrun                505M  236K  504M   1% /var/run
varlock               505M     0  505M   0% /var/lock
udev                  505M  2,8M  502M   1% /dev
tmpfs                 505M  152K  504M   1% /dev/shm
lrm                   505M  2,0M  503M   1% /lib/modules/2.6.27-7-generic/volatile
/dev/sda5              20G   19G  1,4G  94% /media/disk-1
/dev/sda1              31G  9,8G   21G  33% /media/disk-2

"df -h" komutu bilgisayardaki disklerin (partition) yapısıyla ilgili bilgileri görüntüleyen komuttur. Bu komutu çalıştırdığınızda gördükleriniz bundan biraz farklı olabilir. Burada dikkat etmeniz gereken Linux'un harddiskimizin /dev/sda6 bölümünde yüklü olduğu ve bu bölümün haricinde başka bölümlerin de olduğudur (/dev/sda1 ve /dev/sda5) (sizde farklı olabilir). Eğer tek bir bölüm görüyorsanız (/dev/sda1) muhtemelen diskiniz tek parçadır. Silinen dosyları geri getirme konusunda dikkat etmeniz gereken nokta, sildiğiniz dosyanın bulunduğu disk bölümüne asla başka dosyalar kopyalamamanızdır. Çünkü bu disk bölümüne kopyalayacağınız dosyalar diskte silinen ancak izleri kalan dosyanızın üstüne yazılabilir, bu durumda dosyanızı bir daha geri getiremeyebilirsiniz. Bu yüzden eğer tek bir disk bölümünüz varsa en azından bir flash bellek kullanmanız geri getirme olsaılığını artıracaktır..

Gerekli uyarıları yaptıktan sonra devam edelim. İlk olarak silinen dosyanın izlerinin diskteki konumunu belirleyelim. Bunun için debugfs isimli bir dosya sistemi hata ayıklayıcısı (debugger) kullanacağız. Ancak debugfs'i kullanabilmek için süper kullanıcı haklarını elde etmemiz gerekiyor:

senan@ubuntu:~$ su -
Password:

şifreyi girdikten sonra ise,

root@ubuntu:~# debugfs /dev/sda6

komutunu verelim. Burada dikkat etmemiz gereken şey, az önce de gördüğümüz gibi Linux'umuz diskimizin /dev/sda6 bölümüne kurulu olduğundan, debugfs komutunu bu bölümle birlikte verdiğimizdir.

Şimdi yapmamız gereken silinen dosyanın bulunduğu dizine gitmek ve inode (silinen dosyalarla ilgili bilgileri ve diskteli blok grubunu saklar) numarasını tespit etmek.

Bunun için,

debugfs 1.41.3 (12-Oct-2008)
debugfs:  cd /home/senan/resimler
debugfs:  ls -d

komutunu verdikten sonra karşımıza şöyle bir çıktı geliyor.

366571  (12) .    333908  (4084) ..   <366591> (4052) resim.jpg   
(END)

q tuşuna basarak debugfs'e geri dönelim. Hatırlayacağınız üzere /home/senan/resimler silinen dosyanın adresiydi. Burada yaptığımız, bu klasöre girip, ls -d komutunu vermek. Bu komut işlem yaptığımız klasördeki (/home/senan/resimler) silinen verileri görüntülemeyi sağlar. Sonuçta da görüldüğü gibi bir tane silinmiş dosya (hem de sildiğmiz dosyamız) ve inode numarısını bulmuş olduk : 366591. Şimdi yapmamız gereken silinen dosyanın bulunduğu blok grubunu tespit etmek. Bunun için,

debugfs:  imap <366591>
Inode 366591 is part of block group 45
    located at block 1474568, offset 0x0e00

Gördüğümüz gibi dosyamız 45 nolu blok grubunda yer alıyor. Dosyamızı geri geri getirebilmek için bir bilgiye daha ihtiyacımız var, o da bir blok grubundaki blok sayısı, bulmak içinse stats komutunu verelim ve ardından q tuşuna basarak debugfs'e geri dönelim.

debugfs: stats
    ***
    ***
Blocks per group:         32768
    ***
debugfs: q

stats komutunu verdikten sonra bir çok çıktı görüntülenir, ancak bizim işimize yarayacak olan bilgi Blocks per group yani bir blok grubundaki blok sayısıdır. Çıktıda da görebileceğiniz gibi bir blok grubunda 32768 tane blok bulunuyor. Bu bilgiyi de elde ettiğimize göre debugfs'i kapatmak için q komutunu vermemiz yeterlidir.

Sıradaki işlemimiz adresini tespit ettiğimiz blok grubununun içeriğini elde etmek. Bunun için The Sleuth Kit'i kullanacağız. Hatırlayacağımız gibi silinen dosyamız disk bölümündeki 45. grupta yer alıyordu, bu yüzden 45. blok grubundaki bütün blokların içeriğini elde etmemiz gerek. Bunun için ise 45. blok grubundaki ilk blok ile son bloğun adresini bulmamız yeterlidir, gerisini The Sleuth Kit bizim için hallediyor.

Şimdi bize gerekli olan blok adreslerini bulalım. Bir blok grubunda 32768 tane blok olduğunu daha önce bulmuştuk. Bu yüzden 45. blok grubunun ilk bloğunun adresi 45 x 32768 = 1474560 dir. Son bloğun adresi ise 46. blok grubunun ilk bloğundan bir önce gelen bloğun adresidir. Bu nedenle 45. blok grubunun son bloğunun adresi 46 x 32768 – 1 = 1507327 dir. Böylece 45. blok grubuna 1474560-1507327 adresleri arasındaki bütün blokların dahil olduğunu bulmuş oluyoruz. Bu formülü genelleştirecek olursa, bir gruptaki blok sayısını b olarak bulmuşsak ve n. blok grubundaki bloklar n x b – (n+1) x b -1 adresleri arasında yer alır.

Artık 45. bloğun içeriğini diskten ayıklayabiliriz. Bunun için,

root@ubuntu:~# dls /dev/sda6 1474560-1507327 > /media/disk-1/block.dat

komutunu verip birkaç saniye bekliyoruz. Bu işlem sonunda, 45. blok grubundaki tüm içeriği blok halinde, block.dat adı altında, başka bir diske aktarmış bulunuyoruz (/media/disk-1). Yapmamız gereken son şey silinen dosyaları bu içerikten çekip almak. Bu işlem için Foremost'u kullanacağız:

root@ubuntu:~# mkdir /media/disk-1/output
root@ubuntu:~# foremost -t jpg -i /media/disk-1/block.dat -o /media/disk-1/output/

bu komutu verdikten sonra ekrana

Processing: /media/disk-1/block.dat
|*|

benzeri bir çıktı gelecektir. Burada yaptığımız şey yeni bir klasör yaratıp (output) blok grubu içeriğindeki silinen dosyaları bu klasöre atmak. Gördüğümüz gibi foremost komutuna -t, -i ve –o gibi parametreler verdik. -t parametresi istediğimiz tipteki dosyların araştırılmasını sağlar. Bir jpg dosyası aradığımızdan -t yi jpg argümanı ile kullandık. -i parametresi içeriğini araştırmak istediğimiz veri dosyaları (block.dat) için kullanılan parametredir. -o parametresi ise silinen dosyaların geri geldikten sonra saklanacağı klasörü tanımlar, o yüzden de -o ile /media/disk-1/output argümanını kullandık.

Hepsi bu kadar. Şimdi /media/disk-1/output klasörünü açalım. Eğer yaptığımız işler doğruysa burada bir jgp adlı klasör bulunmalıdır. Eğer -t parametresini kullanmasaydık foremost tüm dosya tiplerini araştıracak ve geri getirebildiği dosyaları, tip isimlerine sahip olan klasörlere atacaktı.

jpg klasörünü açalım. Burada birden fazla dosya görebiliriz, bunun nedeni incelenen bloklarda birçok silinmiş dosya olması dolayısıyladır. Şekilde de görüldüğü gibi 00059056.jpg dosyası aradığımız dosyadır ve silinen dosyayı başarıyla geri getirmiş bulunmaktayız.

Sonuç olarak, dosya geri getirme işlemleri her zaman kesin sonuç veren işlemler değillerdir. Dosyalar geri getirilse bile doğru çalışmayabilir ve yaptığımız işlemler sonucu geri getirilen dosyaların tam anlamıyla doğru çalışacağının garantisi yoktur. Bu yüzden önemli dosyalarla çalışırken yedeğini almakta fayda vardır.

Kaynaklar: