Murat Yıldırımoğlu
Peter
Norton, bilgisayarla ilgilenen herkesin hayatını kolaylaştıran Norton
Utilities'in yaratıcısı, bir klasik olan Inside the IBM PC kitabının yazarı.
Aynı zamanda UNDELETE programını yazan ilk kişi. PC dünyasını en iyi anlamış
bir kaç kişiden birisi ve olağanüstü bir yazılım dehası. Aşağıda onun Undelete
programını anlatırken FAT dosya sisteminin ayrıntılarını da görebileceksiniz.
Peter
Norton’a ilişkin son haber: Peter Norton uzun zamandır elini bilgisayara
sürmüyor. Bilgisayardan edindiği servetle şu anda resim koleksiyonculuğu
yapıyor. Yılın belli zamanlarında da firmasını sattığı Symantec’e uğrayıp halen
Norton adıyla satılmakta olan ürünlerin ambalajlarında yer almak üzere fotoğraf
çektiriyor.
UNDELETE
programı ya da komutu şu anda size çok sıradan gelebilir. Ama UNDELETE
komutunun ancak DOS'un 6.0 versiyonu ile birlikte işletim sisteminin bir
parçası olduğunu düşünürseniz bu komutun
ilk zamanlarda ne kadar önemli olduğunu anlayabilirsiniz.
İsterseniz
ilk önce bir sabit disk üzerinde
bilgilerin nasıl düzenlendiğine ve DOS'un bu bilgilere nasıl eriştiğine bir göz
atalım. Bu arada da çıkabilecek sorunları ve bu sorunların çözümünü de
tartışabiliriz.
Sabit disk birden fazla plakadan oluşur.
Plakaların her yüzü için bir adet okuma-yazma kafası bulunmaktadır.
Diskin
üzerinde iz (track) olarak adlandırılan daireler bulunur. Her İz üzerinde de
sektörler belirlenir (Sektörlerin her biri 512 byte'dır). Sabit diskin ilk sektörü MBR (Master Boot Record:
Ana Boot Kayıtı) olarak adlandırılır. DOS'a ayrılan bölümün (partition) ilk
sektörü ise DBR (Dos Boot Record: Dos Boot Kayıtı) olarak adlandırılmaktadır.
DBR'den sonra da Dosya Atama Tablosu (FAT) ve Kök Dizin (Root
Directory) bilgileri gelir. Bu ilk sistem alanlarını izleyen sektörler cluster
denilen birimler halinde gruplandırılır ve dosyalara cluster birimleri şeklinde
atanırlar. Disk üzerinde yer alan dosyalara atanan cluster'ların bilgisi FAT'de
(File Allocation Table: Dosya Atama Tablosu) ve kök dizinde tutulur. DOS, kök
ve alt dizinler ile FAT'de yer alan bilgileri kullanarak bir dosyaya erişir ve
gerekli işlemleri yapar. Dosya atama tablosundaki değerler bir başka cluster'ı
gösteren bir rakam, kullanılmayan cluster işareti, hatalı sektör (bad sector)
işareti ya da dosya sonu işareti olabilir.
Disk
üzerindeki bir alanın iz, kafa ve sektör numarası olarak adresi mutlak sektör
adresidir. DOS bu bilgiyi doğrudan kullanamaz. DOS kendi rölatif sektör
numaralarını kullanır. Rölatif numaralandırmada her sektöre 0'dan başlamak
üzere bir numara verilir ( 305 nolu sektör gibi) ve bütün işlemler bu numara
üstünden yapılır. Bu şekilde bir numaralandırma ile DOS'un donanımdan bağımsız
olarak verilere erişimi sağlanmış olur.
Disk
üzerindeki sektörlerin cluster adı verilen yığınlar şeklinde
değerlendirildiğini söylemiştik. DOS tarafından bir dosyaya atama yapılırken
byte ya da sektör temelinde değil de cluster temelinde atama yapılır. Örneğin,
1 byte'lık bir dosya yarattığınızı düşünelim. Bu dosya disk üzerinde 1 byte
değil 1 cluster'lık yer kaplar (1 cluster'ın kaç sektöre karşılık geldiği ise
farklılıklar arzedebilir). Örneğin, 720 KB'lık bir diskette 1 cluster 2 sektöre
eşittir ve bizim 1 byte'lık dosyamız için disk üzerinde tam tamına 1024
byte'lık yer ayrılır.
DBR
(DOS Boot Sector) bölümünde basit bir program bulunmaktadır. Bu program MBR'de
yer alan bilgileri ve 2 gizli sistem dosyasını kullanarak sistemin
başlatılmasını sağlar. Bu iki gizli sistem dosyası IBM PC'lerde IBMBIO.COM ve
IBMDOS.COM ve uyumlularda IO.SYS ve MSDOS.SYS olarak adlandırılmaktadır. DBR'de
yer alan program ilk önce bu iki gizli dosyanın bulunup bulunmadığını kontrol
eder. Sistemin boot edilebilir bir disk olup olmadığını bu dosya kontrolü ile
saptar. Eğer bu iki dosya bulunmakta ise bu dosyaları yükler ve işletir.
DBR'den
hemen sonra FAT alanı gelir. Bu alanda birbiri ardına iki adet FAT kopyası
bulunur. FAT'lerin iki adet olmasının nedeni güvenliktir: Eğer birisi bozulursa
diğeri kullanılabilir. Ama her ne kadar DOS'un kendisi güvenlik amacıyla iki
adet FAT kopyası tutmaktaysa da bu iki FAT'in aynı olup olmadığını kontrol
etmez. Bu kontrolü PCTOOLS'un DISKFIX ya da Norton'un Disk Doctor gibi
programları yapar. Eğer bu iki kopya birbiriyle uyuşmuyorsa yine bu programlar
en az hatalı FAT'i saptarlar ve hatalı FAT'i de düzeltirler.
FAT'den
sonra da kök dizin (root directory) gelmektedir. Bu bölümde diskin kök
dizininde yer alan dosyalarla ilgili bilgiler yer almaktadır. Kök dizinde her
bir dosya için 32 byte’lık yer ayrılmıştır. Kök dizin için ayrılan bölüm
kısıtlıdır ve bu yüzden kök dizinde yer alabilecek dosya sayısı da sınırlıdır.
Örneğin, sabit disklerde kök dizinde en
çok 512 dosya yer alabilir. Floppy disklerin kök dizininde ise daha az dosya
yer alabilir. Bir kök dizinin en fazla kaç dosya içereceği bilgisi de DBR'de
saklıdır. Kök dizinde her dosya için 32 byte ayrıldığını söylemiştik. 32
byte'ın sekizi dosya ismine, üçü dosya ismi uzantısına, biri dosya özelliğine
(attribute), ikisi son işlenme tarihine, yine ikisi son işlenme saatine, ikisi
başlangıç cluster numarasına ve dördü de dosya büyüklüğü bilgisine ayrılmıştır.
On adet byte ise ilerde ortaya çıkabilecek kullanımlar için saklanmaktadır. Dosyaların özellik
(attribute) byte'ının özel bir önemi vardır. Özellik byte'ı dosya hakkında çok
değerli bilgiler sunar. Bu byte'ı oluşturan 8 adet bitin yalnızca altısı
kullanılmaktadır. Şimdi bu bitleri teker teker gözden geçirelim:
1) Arşiv
biti: Eğer dosya yedeklenmişse (backup) 1 yedeklenmemişse 0'dır.
2)
Hidden (gizli) biti: Eğer bu bit 1 ise dosya gizlidir ve DOS'un DIR komutuyla
görülmez ya da COPY komutu kullanılarak kopyalanamaz.
3)
Yalnız-Oku (Read-only) biti: Eğer 1 ise dosya üzerinde değişiklik yapılamaz ya
da dosya silinemez.
4)
System biti: Eğer 1 ise sistem dosyası olduğu ve bulunduğu yerden başka bir
yere taşınmaması gerektiği anlaşılır.
5)
Etiket (label) biti: Eğer 1 ise bunun bir dosya değil disk etiketi olduğu
anlaşılır. Disk etiketleri bir dosya gibi saklanmaktadır.
6)
Dizin (directory) biti: Eğer bu bit 1 ise dosya değil bir alt dizin olduğu
anlaşılır. Alt dizinler de disk üzerinde aynen dosyalar gibi saklanırlar ama
bunların büyüklük bölümü 0 olur.
Bir
dosyaya erişim için hem FAT hem de dizin bilgileri gerekmektedir. Dizin yapısı,
dosyanın kimlik bilgilerini ve dosya atama tablosundaki ilk numarasını saklar.
Bu ilk numara yardımı ile dosyanın disk üzerindeki yerleşimini dosya atama
tablosundan izlememiz çok kolay olur. Şimdi bir dosyayı disk üzerinde nasıl
takip edebileceğimizi görelim. Adres.dbf adında bir dosyamız olsun. Bu dosyanın
dizin bilgilerinden de başlangıç cluster numarası olarak 40'ı saptamış olalım.
Dosya atama tablosu değerleri de şu şekilde sıralansın:
FAT
Hücre
Numarası Hücre İçeriği
39 EOF
40 41
41 42
42 44
43 112
44 102
.
.
.
102 103
103 EOF
Şimdi
dosyanın hangi cluster'ları kapladığını şu şekilde buluyoruz: Dosyanın
başlangıç cluster'ı 40 idi. FAT'de 40 nolu hücrede bir sonraki cluster'ın
numarası yer alıyor; o da 41. 41 Nolu hücrede de bir sonraki clusterın numarası
yer alıyor; 42. 42 Nolu hücrede yer alan değer 44. Görüldüğü gibi cluster'ların
birbirini izlemesi gerekmiyor. İşletim sistemimiz olan DOS bir dosyaya yer
ataması yaparken birbiri ardına gelen cluster'ları kullanmak gibi bir kaygı
taşımıyor; boş bulduğu ilk cluster'a atama yapıyor. Bu yöntem dosya atama
işleminin hızlı yapılmasını sağlıyor ama bir dosyanın parçaları birbirini
izlemeyen cluster'lar şeklinde sıralandığı zaman da dosyaya erişim daha uzun
zaman alıyor. Dosyaların bu şekilde birbiri ardına gelmeyen cluster'lar
şeklinde sıralanmaları parçalanma (fragmentation) olarak adlandırılıyor ve bir
süre sonra sistem performansını hissedilir oranlarda düşürüyor. Bu sorunu
çözmek için dosyaları arka arkaya gelen bloklar şeklinde düzenleyen bir
defragmentation programına, örneğin PCTOOLS'un COMPRESS.EXE'sine gereksinim
var. DOS 6.0 ve üzerinde ise DEFRAG
komutu aynı işi yapıyor.
Evet
sanırım 44 nolu hücrede kalmıştık. Bu hücredeki değer 102. 102 Nolu hücreye
gittiğimizde 103 rakamını görüyoruz. 103 Nolu hücrede yolculuğumuz sona eriyor
çünkü burada bir başka hücrenin numarası yok, dosya sonu işareti var. Demek ki
dosyamız 40, 41, 42, 44, 102 ve 103 nolu cluster'ları kaplıyor.
Peki bu
bilgileri kullanarak silinen bir dosyayı nasıl kurtarırız? Norton Utilities'in
yaratıcısı Peter Norton bu soruyu yanıtlayarak adını tüm dünyada duyurmuştu.
Şimdi Norton'un bu işi nasıl başardığını anlamaya çalışalım. Ama silinen bir
dosyayı kurtarabilmek için disk üzerinde bir işlem yapmamamız gerektiğini de bu
arada anımsatalım.
Bir
dosyanın disk üzerindeki yerini belirlemek için hem FAT'i hem de dizini
kullanmamız gerekiyor. Dizinden aldığımız bilgilere FAT'deki bilgileri de
ekleyerek dosyanın yerleşimini çok kolay bir şekilde takip edebiliyoruz. Disk üzerinde
yer alan bir dosya silindiği zaman dizine gidiliyor ve dosyanın isminin ilk
karakteri "Õ" olarak değiştiriliyor. Daha sonra dizin bilgisinde yer
alan başlangıç cluster bilgisi kullanılarak dosyanın FAT'de kullandığı
hücrelere gidiliyor ve bu hücrelere gerektiğinde bir başka dosyada kullanabilme
amacı ile 0 değeri yükleniyor (0 değeri o cluster'ın dosya atama işleminde
kullanılabilir olduğunu gösteriyor). Görüldüğü gibi dosyanın disk üzerinde
kapladığı alana fiilen dokunulmuyor, yalnızca bu alanları tanıtan bilgiler
siliniyor. Bizim dosya örneğimizde 0 değeri yüklenilerek kullanıma açılan
cluster'lar 40, 41, 42, 44, 102 ve 103. Bu cluster'lara yeni dosya bilgileri
aktarılmadığı sürece de dosya bilgileri disk üzerinde bozulmadan kalıyor. Ama
bir dosya yaratma ya da kopyalama işlemi yapılırsa bu kullanıma açılan
bölümlerden yararlanılması ve buralara yeni dosya bilgilerinin yazılması
olasılığı var. Bu durumda silinen dosyamızı kurtarmak hayal olabilir (silinen
dosyaları kurtarmak için neden disk üzerinde bir işlem yapmamanız gerektiğini
anladınız sanıyorum). UNDELETE komutu ilk önce dizine giderek isim bölümünde
ilk karakteri "Õ" olan bir kayıt bulunup bulunmadığına bakıyor. Eğer
böyle bir kayıt varsa dosya ile ilgili bilgileri alıyor. Nedir bu bilgiler?
Dosyanın büyüklüğü, başlangıç cluster'ı ve tarih ile saati gibi bilgiler. Şu
anda dosyanın ilk cluster'ını kurtarmış durumdayız. Üstelik dosyanın
büyüklüğünü bildiğimiz için kaç adet cluster kullanılacağını da
saptayabiliyoruz. Örneğimizde bize altı adet cluster gerekiyor. Ama FAT
kayıtları silindiği için bu cluster'ların hangi cluster'lar olduğunu
saptayamıyoruz. Bu cluster'lara nasıl erişebiliriz? İlk önce dosyanın birbiri
ardına gelen cluster'lar şeklinde disk üzerinde yer aldığını varsayalım. Bu
durumda 40'dan sonra gelen cluster'ları teker teker inceleyip bu cluster'ların
bir dosyaya atanmış olup olmadığını kontrol edebiliriz. Örneğimizde 41 ve 42
nolu cluster'lar bir dosyaya atanmamış görünüyor. Bizim dosyamızın parçaları
olma olaşılığı var. Ama şu anda yalnızca bir olasılık çünkü bu cluster'lar
zaten başından beri de boş olabilirler ya da silinmiş bir başka dosyanın
cluster'ları olabilirler. Üstelik bu cluster'lardan emin olsak bile sonraki
cluster'ın (43 nolu cluster) bizim dosyamıza ait olmadığı kesin. Dolayısıyla
bir sonraki cluster'ın hangisi olduğunu bulmak gibi bir sorunla karşı
karşıyayız. Bu oldukça büyük bir sorun ve kolay kolay da çözülecek gibi değil.
Bu yüzden sorunu ilk çözen kişi olan Norton da bir anda zenginler kervanına
katılmış. Neyse, biz silinmiş dosyaları kurtarma işlemini burada bitirelim ve
konumuza devam edelim.
Alt
dizinler de disk üzerinde herhangi bir dosya gibi kaydedilirler. Yalnızca
özellik kısmında dizin biti 1 değeri ve büyüklük bölümünde de 0 değeri yer alır.
Alt dizinler de disk üzerinde cluster'lar dizisi şeklinde yer alırlar. Ama alt
dizinlerin ilk iki kayıtı özellik arzeder. Bu kayıtlar bir alt dizinde DIR
komutunu verdiğinizde karşınıza çıkan "." ve ".."
kayıtlarıdır. Bu iki kayıt da alt dizin kavramının kendisi gibi UNIX işletim
sisteminden ödünç alınmışlardır. "." kayıtı alt dizinin kendisine ve
".." kayıtı da bir üst dizine işaret eder. Bu kayıtların da büyüklük
bölümleri 0'a eşittir. "." Kayıtı alt dizinin başlangıç cluster'ını
bulmada kullanılır. ".." Kayıtı ise tahmin edebileceğiniz gibi bir
üst dizinin başlangıç cluster'ını verir. Eğer bir üst dizin kök dizin ise bu
değer 0'a eşittir.
Şimdi
alt dizinler için bir örnek yapalım. Kökün hemen altında DBASE adında bir alt
dizin bulunsun. Bu alt dizinin kimlik kayıtı şu şekilde sıralansın:
ADI UZANTISI BÜĞÜKLÜĞÜ TARİHİ
SAATİ BAŞLANGICI
DBASE 0 02/02/93 8:03
5000
Tabii
bu kayıtın özellik (attribute) byte'ında dizin olup olmadığını gösteren biti de
1 olacak.
Başlangıç
cluster'ı 5000 olarak gösteriliyor. Bu alt dizin içinde de yalnızca bir dosya
bulunduğunu varsayalım. Bu dosyanın adı ADRES.DBF olsun ve disk üzerinde 6000
nolu cluster'dan başlasın. Şimdi DBASE dizinin kayıtlarına bir göz atalım:
AD UZANTI BUYUKLUK TARIH SAAT BASLANGIC ÖZELLİK
. 0 02/02/93 8:03 5000
Dizin
.. 0 02/02/93 8:03 0 Dizin
ADRES DBF
100 17/08/93 9:15 6000
"."
ve ".." kayıtları bir alt dizinin ilk iki kayıtı olarak yer
almalıdır. Aksi durumda CHKDSK ya da DISKFIX, NDD gibi programlar bu alt dizini
hatalı (invalid) olarak rapor eder. Yukarda da kısaca değindiğimiz gibi
ADRES.DBF topu topu 100 byte büyüklüğünde olduğu halde kocaman bir cluster'ı
kaplamaktadır.
Şimdi
DOS'un C:\DBASE\ADRES.DBF adresindeki dosyaya nasıl eriştiğini adım adım
görelim.
1) DOS,
kök dizinde DBASE adında bir kayıt olup olmadığını ve böyle bir kayıt varsa
özellik kısmında dizin bitinin 1 olup olmadığını kontrol eder. Eğer her şey
yolunda ise bu alt dizinin başlangıç cluster'ını not eder (5000).
2) DOS,
dosya atama tablosuna gider ve 5000 nolu cluster'da ne tür bir bilgi olduğuna
bakar. Bu alt dizin bilgileri tek bir cluster'a sığdığı için 5000 nolu
cluster'da dosya sonu (EOF) işareti bulunmaktadır. Eğer alt dizin içinde çok
fazla miktarda dosya yer almaktaysa dizinle ilgili bilgiler birden fazla
cluster'da yer alabilir. Ama genel olarak alt dizinlerin çoğu için tek bir
cluster yeterli olur. Çünkü sabit disk
üzerindeki bir cluster, örneğin 2048 byte'lık yer kaplıyorsa, bu alan 64 adet
dosya bilgisini tutmaya yeter (2048/32=64). Bu sayı da çoğu alt dizin için
yeterlidir.
3) DOS,
5000 nolu cluster'ı okur. Bu cluster'da ADRES.DBF ile ilgili bir bilgi bulunup
bulunmadğına bakar ve varsa dosyanın bilgilerini (başlangıç cluster'ı dahil
olmak üzere) not eder. Örneğimizde, ADRES.DBF'nin başlangıç cluster'ı 6000
numaralı cluster idi.
4) DOS,
6000 nolu cluster'ı okuyarak dosyanın içeriğine erişir. ADRES.DBF tek bir
cluster kapladığı için daha fazla bir okuma yapmaya gerek yoktur. Ama daha
büyük bir dosya söz konusu olsaydı dosya atama tablosunda cluster sırasını
izleyerek dosyanın geri kalan parçalarına erişimi de kolayca sağlanabilirdi.
Bir virüsün ya da kötü niyetli herhangi
bir programın bu dosya yapısı içinde nasıl bir tahribata yol açabileceğini
kolayca görebiliriz. Dosya atama tablosundaki bütün hücre içeriklerini
değiştiren bir virüs düşünün. Bu durumda ne bir dosyaya ne de bir alt dizine
erişmek mümkün olur (diski formatlamak gibi bir şey). Bu yüzden virüse karşı
önlem olarak FAT ve daha başka bölümlerin kopyasının alınması önerilir.