UNIX/Linux Sistemlerinin Disk Organizasyonunun Temelleri
AT&T tabanlı UNIX işletim sistemlerinin dosya sistemi s5fs (System 5 File System) ismiyle
anılır. Berkeley (BSD) sistemleri klasik UNIX dosya sistemine bazı yenilikler getirmiştir.
Berkeley tabanlı bu dosya sistemine FFS/UFS (Fast File System / UNIX File System)
denilmektedir. Linux sistemlerinde çeşitli eklentiler yapılmıştır. Şu anda Linux sistemlerinin
yaygın olarak kullandığı dosya sistemi ext2 (Second Extention File System) denir.
DOS ve Win32 Sistem Programcıları için Not: Klasik DOS'un dosya sistemi FAT ismiyle ile
anılır. Win95 ile birlikte bu sistem uzun dosya isimlerini içerecek biçimde genişletilmiştir. Bu
dosya sistemi VFAT biçiminde isimlendirilmiştir. OS/2 sistemleri HPFS isimli farklı bir
dosya sistemi kullanırlar. Nihayet Windows NT'lere özgü ayrıntılı bir dosya sistemi de
kullanılmaktadır. Bu sistemler NTFS ismi ile anılır.
Dosya sistemlerinin incelenmesi iki aşamada yapılmalıdır.
1) Kullanıcı gözüyle incelenmesi: Bu inceleme dosya sisteminin kullanıcılar tarafından nasıl
kullanılacağını anlamak ile ilgilidir. Yani dosya sisteminin dış dünyadan nasıl gözüktüğünün
anlaşılmasıdır. İşletim sisteminin dışsal görüntüsünün tamamı resmi olarak sunduğu dosya
sistem fonksiyonları kadardır.
2) Dosya sisteminin disk organizasyonunun incelenmesi: Dosya sistemi aslında aşağı
seviyeli bir disk organizasyonuna dayanır. Bu inceleme klasik kullanıcı ya da programcılar
için önemli değildir. Ancak aşağı seviyeli programlama ile uğraşan sistem programcıları için
disk organizasyonunun bilinmesi önemlidir. Disk organizasyonu bilinmeden bazı kavramların
anlaşılması da zor olmaktadır.
Bilindiği gibi tipik bir FAT sisteminin disk organizasyonu aşağıdaki gibidir.
Boot Sector
FAT(1)
FAT(2)
ROOTDIR
DATA
FAT dosya sisteminde boot sektör içerisindeki BPB alanı diskin kritik bilgilerini tutmaktadır.
Dosya içerikleri DATA bölümünde cluster'larda saklanmaktadır. Bir cluster ardışık n sektör
uzunluğundadır n sayısı BPB bloğunda yazmaktadır.
Yukarıda sözü edilen UNIX/Linux dosya sistemlerinin disk organizasyonu birbirlerine çok
benzerdir. Tipik UNIX/Linux dosya sistemlerinin dosya organizasyonu diski dört bölüme
ayrıdır.
C ve Sistem Programcıları Derneği 19
Boot Sector
Super Block
i-node Block
Data Block
Boot sektör işletim sisteminin yüklenmesinde kullanılan sektördür. Boot sektörü hemen süper
blok sektörleri izler Süper blok içerisinde disk organizasyonuna ilişkin kritik bilgiler
tutulmaktadır. Süper blok görev bakımından tamamen FAT dosya sistemindeki boot sektör
BPB bloğu gibidir. UNIX/Linux dosya sistemlerinde de dosyanın parçaları ardışık sektörlerde
tutulur. Ancak FAT sistemindeki gibi "cluster" biçiminde değil "block" biçiminde
isimlendirilmektedir. i-node blokları i-node elemanlarından oluşur. Her i-node elemanı bir
dosya bilgisini tutar.
Yararlı POSIX komutları: df komutu dosya sistemindeki toplam blok sayısını, ne kadar
bloğun kullanıldığını ve ne kadar bloğun boş olduğunu görmek amacı ile kullanılır.
Bir i-node elemanı içerisinde hangi bilgiler vardır? Dosyaya ilişkin dosyanın ismi dışındaki
bütün bilgiler i-node elemanında saklanır. Örneğin dosyanın erişim bilgileri, zaman bilgileri,
hangi kullanıcıya ve gruba ilişkin olduğu, dosyanın datalarının hangi bloklarda olduğu
bilgileri burada tutulmaktadır. stat ve fstat fonksiyonları dosya bilgilerini i-node
elemanlarından almaktadırlar. i-node elemanlarında dosyanın ismi tutulmaz. Bir dosyanın inode
numarası dosyanın en önemli bilgilerindendir. Bilindiği gibi stat fonksiyonu dosyanın inode
numarasını da vermektedir. POSIX standartlarında dosyanın i-node numarasına kısaca
dosya numarası denilmektedir. Dosya seri numarası POSIX fonksiyonlarında kullanılan bir
kavramdır. POSIX standartları yalnızca UNIX/Linux türevi olan sistemler için
düşünülmemiştir. Herhangi bir sistem bir POSIX ara yüzü sağlayabilir. Bu durumda bu
sistemler farklı disk organizasyonları kullanabilecekleri için dosya numarası kavramını nasıl
üretirler? İşte bu sistemler sırf POSIX uyumunu sağlamak için dosyalar için birer dosya
numarası uydurabilmektedir. i-node bloğunda ilki sıfırdan başlamak üzere her i-node
elemanına bir numara verilmiştir. Dosya numarası ya da dosyanın i-node numarası demekle o
dosyanın bilgilerinin kaçıncı i-node elemanında saklandığı anlaşılmaktadır.
UNIX/Linux sistemlerinde de tıpkı FAT dosya sisteminde olduğu gibi dizin ile dosya
kavramlarının organizasyonları arasında fark yoktur. Normal dosyaların içerisinde bizim
oluşturduğumuz bilgiler vardır. Dizin dosyaların içerisinde de dizin içerisindeki dosyaların
bilgileri bulunur. Bir dizin dosyasının içeriği iki elemanlı kayıtlar biçimindedir.
i-node no Dosya ismi
Bu durumda bir dizin dosyasının içerisi tipik olarak şöyle olacaktır:
i-node Dosya ismi
i-node no Dosya ismi
i-node no Dosya ismi
Burada her bir kayıt kaç byte uzunluktadır? Bu durum sistemden sisteme değişebilmektedir. inode
numarası için genellikle 4 byte yer ayrılır. Klasik UNIX sistemlerinde dosya ismi 14
karakter uzunluğundaydı. Ancak bu gün pek çok sistemde dosya isimleri 256 karakter
olabilmektedir. Bu sistemde bir dosyanın içeriğine erişilebilmesi için önce o dosya dizin
girişlerinde aranmalı ve i-node numarası elde edilmeli sonra i-node bloklarına gidilerek iC
ve Sistem Programcıları Derneği 20
node bilgileri ele geçirilmeli. Tabii bu sistemde root dizininin yeri bilinmek zorundadır.
Gerçekten de POSIX sistemlerinde root dizininin i-node numarası sıfırdır. Örneğin stat
fonksiyonu ile C/D/E/F/g.dat dosyasının bilgilerini alacak olalım. Burada stat fonksiyonu root
dizininden hareketle sırasıyla dizinlerin içerisinden geçecek ve en sonunda dosyayı bulacaktır.
Tasarımda bu işlem kendi kendini çağıran fonksiyonlarla kolayca yapılabilir.
UNIX/Linux sistemlerindeki en önemli özelliklerden birisi link kavramıdır. Link bir dosyaya
farklı bir dizinden farklı bir isimle erişmek anlamına gelir. Şöyle ki, farklı dizinlerdeki farklı
isimli iki dosyanın i-node elemanları aynı olursa bu iki dosya aslında aynı dosyalardır. İsimler
yalnızca bir semboldür. Bir dosyanın yeni bir linkinden oluşturmak için link sistem
fonksiyonu kullanılır.
int link(const char *oldname, const char *newname);
Fonksiyonun prototipi unistd.h içerisindedir. Başarı durumunda 0, başarısızlık durumunda -1
değerine geri döner. Bir dosyanın bir link'i oluşturulduğunda artık orijinali ile linki arasında
ayırt edici hiç bir özellik kalmaz. Yani orijinal kopya ve link kavramları yoktur, iki bilgi
tamamen eş değer düzeyde tutulmaktadır. Bir dosyanın kaç link'e sahip olduğu dosyaya
ilişkin i-node elemanında da tutulmaktadır. Bilindiği gibi bu bilgi stat ya da fstat fonksiyonları
ile alınabilir. Dosyanın linklerinin sayısı ls -l shell komutuyla da alınabilir. Bir dosyayı silmek
için yalnızca unlink isimli bir fonksiyon vardır. unlink fonksiyonu silinmek istenen dosyanın
i-node elemanına bakar, onun link sayısını bir eksiltir. Link sayısı sıfıra düşmedikten sonra
unlink fonksiyonu yalnızca dizin girişini silmektedir. Ancak link sayısı sıfıra düştüğünde
unlink gerçek silmeyi yapar. Dizinler için link sayısı dizin yaratıldığında ikiden başlar. Çünkü
aslında link sayısı ilgili i-node elamanına referans eden dizin girişlerinin sayısıdır. Bir dizin
yaratıldığında hem yaratılan dizinin içerisinde referans oluşacak hem de yaratılmış olan
dizinde oluşturulan '.' dosyası için bir referans oluşacaktır. Yeni yaratılan dizin içerisinde
yaratılan her dizin için dizinin link sayısı bir artar. Çünkü alt dizinlerin '..' isimli dosyaları da
üst dizinin i-node elemanına referans etmektedir.
Bir dosyanın toplam link sayısı i-node elemanında yazar. Zaten bu nedenle stat fonksiyonu ile
elde edilebilmektedir. Ancak bir dosyanın bütün linklerinin isimleri pratik bir biçimde
bulunamaz. Bunun için bütün dizin ağacının dolaşılması gerekir.