12 Aralık 2011 Pazartesi

UNIX ve Dosya Sistemi


Satın aldığınız bir sabit diski veya USB flash belleği kullanabilmek için üzerinde bir dosya sistemi oluşturulması gerekir. Donanım üreticileri özellikle de USB flash diskleri genellikle Windows işletim sistemi ailesi ile kullanılmak üzere hazır olarak sunarlar. Bu diskler genellikle FAT16, FAT32 bazen de NTFS olarak sunulur. MAc OS kullanıcıları için kutuların üzerinde her zaman sabit diskin nasıl formatlanacağına dair kısa bir açıklama bulunur. Mac OS kullanıcılarını bu diskleri doğrudan bilgisayarlarına takıp kullanabilmeleri olanaklı değildir. Benzer olarak da UNIX/BSD kullanıcısı iseniz disk üzerinde UNIX/BSD sisteminizin erişebileceği, okuyup yazabileceği bir dosya sistemi oluşturmanız zorunludur.


USB üzerinden bilgisayara bağlanan sabit diskler için yapacağınız işlemleri fabrikadan çıkıp size kadar gelen sabit diskler içinde yapmanız gereklidir. Fabrika çıkışında sabit disk “low-level format” olarak adlandırılan bir işlem uygulanmış olarak size ulaşır. “low-lewel format” işlemi ile sabit disk üzerinde iz (track) ve sektör (sectors) hazırlar. İz ve sektörün kesişimi ile de depolama birimleri ortaya çıkar. Bu depolama birimleri 512 byte büyüklüğündedir.

Sabit diskin low-level format işlemine tutulmuş hali ile kullanılması söz konusu olmadığından üzerinde bir dosya sisteminin oluşturulması gereklidir. Bu dosya sistemi oluşturma işlemine high-level format veya DOS'tan dilimize yerleşen tabiri ile formatlama işleminin yapılması zorunludur. Bir UNIX/BSD sistemde bu işlem newfs ile ile gerçekleştirilir. Formatlama işlemi ile oluşturulan dosya sistemi NTFS, HPFS veya UFS/FFS vs olabilir ancak tüm dosya sistemlerinin temel de işlevleri aynı olduğu için şu özellikleri ortaktır:

  • Depola birimi içerisindeki dosyaların kayıtlarını tutan bir kayıt tablosuna sahip olmak
  • Diskte saklanan verinin okuma/yazma performansını iyileştirecek bir mantıksal depolama adresi sistemine sahip olmak

Bir dosya sistemin veriyi çabuk bir şekilde yazıp okurken sabit diskin fiziksel özelliklerinden kaynaklanan kısıtlamalar ile karşı karşıya kalacaktır. Sabit disk üzerinde iz ve sektörlerin kesişimi ile ortaya çıkan bloklardan oluşan silindirler bulunmaktadır. Silindirlerin her birisini 255 adet yatay (iz) ve 63 adet düşey (sektör) çizgi kesmektedir. Bunların kesiştikleri noktalarda 512 byte büyüklüğünde bir depolama birimi bulunmaktadır. Bu durumda basit bir hesapla bir silindirin 255x63 = 16065 depolama birimine sahip olacağı görülür.

Eğer her bir depolama birimine bir dosya koyacak olursak bir silindirde 16065 adet dosya saklayabiliriz. Bu dosyaların her birinin erişimini kolaylaştırmak ve arandığında daha kolay bulunabilmesini sağlamak için her birisine 1'den başlayarak 16065'e dek bir numara verebileceğimiz bir kayıt tablosu hazırlayabiliriz. Böylelikle bir dosyayı sildiğimizde kayıt tablosundan adını kaldırarak işlemi gerçekleştirebiliriz. Bir dosyayı başka bir yere taşımak için ise yapılması gerek sadece dosyanın yeni konumunu kayıt tablosunda güncellemek olacaktır. Bu şekilde dosyaların silinmesi, oluşturulması veya taşınması gibi işlemler için doyanın konumunu bildiren tabloda düzenlemeler yapmak dosyayı fiziksel olarak silmek, taşımak vb göre daha kolaydır.

Bu dosya kayıtlarını tutulmakta olduğunu dosya sistemini UNIX/BSD sistemde oluşturulduğunda dosya kayıtlarını sakladığımız tabloya inode – index node ablosu adını alır. Türkçe kaynaklarda inode için düğüm karşılığı verilmektedir.

Dosya sisteminin bu basit yapısı beraberinde disk alanının kullanımını verimsizleştirmektedir. 512 btye'lık depolma birimleri her bir dosyanın 512 byte büyüklüğünde olması durumuna mükemmel bir çözüm olacaktır. Ancak gerçek dünyada durum bunun tersidir. Dosya boyutları bir kaç byte olabileceği gibi 512 byte'ten daha büyük de olabilmektedir.

Örneğin 10 byte büyüklüğünde bir dosyayı sabit disk kayıt edecek olursak kullanılmayan 502 byte depolama alanı atıl halde kalacaktır. Benzer biçimde bir çok küçük dosya kayıt etmeniz durumunda depolama alanınız verimsiz bir şekilde kullanılmış olacaktır. Tersine olarak tek bir 16065 byte büyüklünde bir dosya kayıt ettiğinizde de tek bir dosya tüm depolama alanını tüketecektir. Aslında diskin depolama kapasitesi bundan fazla olmakla birlikte tek bir dosya ile bir tek silindirdeki inode tamamını tüketmiş olunacaktır. Bu da istenmeyen bir durumdur.

Dosya sisteminde küçüklü büyüklü bir çok dosya saklanacağı için depolama alanının daha etkin ve verimli kullanılması zorunludur. Bu nedenle tek bir fiziksel depolama biriminin yani bir 512 byte büyüklüğündeki blokun tek bir dosya ile tüketilmemesi için faklı bir çözüme gereksinim vardır. Depolama birimine bir tek değilde bir çok küçük dosya saklanabilir. Örneğin 512 byte depolama biriminde bir çok farklı boyutta dosya bulunurken bunların içerisinden 12 byte uzunluğundaki bir dosyayı siler ve yerine daha küçük olan 7 byte büyüklüğündeki bir dosyayı koyarsak boşta kalan 5 byte alanı nasıl adresleyebiliriz? Bu çözüm ise beraberinde bir depolama biriminde saklanan dosyaların kayıtlarının nasıl tutulacağı sorununu getirir.

Bu yaklaşım sorunları çözmeyip, tersine daha başka sorunlar yaratmaktadır. Bu sorunu çözmek için bir çok dosya sistemi “fragment – parçalanma” kavramınından yararlanır. Bir parça bir 512 byte büyüklüğündeki blokun daha küçük parçalara ayrılmasıdır. Böylelikle her bir parçaya bir adres verilerek dosya sisteminde tabloda yer alır. Dosya sistemi bir bloku dört parçaya bölebilir. Bu durumda blok büyüklüğü dörtte bir küçülürken depolama alanı dört kat artar. 16065 blok böylelikle 64260 bloka dönüşürken blok boyutu da 128 byte büyüklüğüne iner. Bu küçük parçalar bağımsız bir blok gibi işlenir ve tanımlanır. Böylelikle indeks numaraları tablosu – index node yani inode sayısı 64260 adete çıkar. Dosya boyutlarından kaynaklanan kayıt sorunu mantıksal parçalar sayesinde ortadan kalkmış olur.

Öte yandan saklanacak olan dosyanın boyutlarının mantıksal veya fiziksel blok büyüklüğünden büyük olması durumunda başka problemler ortaya çıkmaktadır. Kayıt edilecek olan dosyanın boyutu 1000 byte ise fiziksel blok olarak 2 tane 512 byte büyüklüğünde blok kullanılacaktır. Dosyanın ilk 512 byte büyüklüğündeki kısmı bir blok üzerinde saklanırken, geri kalanı izleyen blok üzerinde saklanacaktır. Buna ek olarak her bir blok içeriğini sakladığını index numarası tablosunda da bu bilginin saklanırken nasıl tanımlanacağı sorunu ortaya çıkar. Dosya sistemi 4 adet fragment/parçalanmayı kullanıyorsa bu durumda 1000 byte büyüklüğündeki dosya için en az 8 adet kayıt kullanılması gerekir. Ayrıca bu sekiz kaydın doğru sıra ile saklanması da zorunludur.

Dosya sistemi için bilginin saklanabilmesi için kayıt edilmesi öncelikli olarak çözülmesi gereken problemdir. Kayıt işlemi kadar diğer önemli olan diğer problem de kayıt edilmiş bilginin erişilebilmesi yani okunabilmesidir. Kullanıcı tarafından oluşturulan ve kayıt edilmesindeki amaç öncelikli olarak gerektiğinde kullanıcı tarafından yeniden erişilebilir olmasıdır. Dosya sisteminin bunu yapabilmesi için dosyanın hangi blok veya bloklarda olduğunu bilmesi gereklidir. Bu bilgi ile dosya sistemi dosyayı sabit diskten okuyup RAM'a aktarabilir.

Bir dosya sisteminin dosya okuma performansını iyileştirebilmek için bir çok seçeneği vardır. İlk olarak mantıksal blok büyüklüğünü arttırabilir. Böylelikle bir çok fiziksel blok bir araya gelerek gruplandırılarak tek bir sanal bloka dönüştürülebilir. Böylelikle dosya bir sefere tek bir sanal bloktan okunarak RAM aktarılabilir. Böylelikle birde çok blokun sabit diskten RAM'a ve tekrar RAM'dan sabit diske aktarılması kolaylaşır, tek seferde gerçekleşir.

Bu görevlerin yerine getirilebilmesi için dosya sisteminin oluşturulmasını sağlayan araç UNIX/BSD sistemlerde newfs aracıdır. Kılavuz sayfasına bakacak olursak dosya sisteminin işleyişi hakkında daha fazla bilgi edinebiliriz. Aşağıdaki seçenekler FreeBSD 8.2 AMD64 ve OpenBSD 5.0 AMD64 kılavuz sayfalarından yararlanılarak hazırlanmıştır. newfs(8) kılavuz sayfasına man 8 newfs ile ulaşabilirsiniz.

-b block-size Dosya sisteminin blok büyüklüğüdür. FreeBSD ve OpenBSD için varsayılan değeri 16 KB – 16384 byte'tır. Değer her zaman için 2'nin katları olarak belirlenir. Fragmanet/block size – parçalanma/blok büyüklüğü oranı her iki sistem içinde 8:1'dir. OpenBSD 16 KB veya parçalanma boyutunun 8 katı olarak tanımlanmadıysa otomatik olarak bu iki değerden küçük olanı seçer.

-f frag-size parçaların büyülüğünü tanımlar. FreeBSD ve OpenBSD için varsayılan değer 2048 byte'tır. FreeBSD bu değeri blok büyüklüğü/8 veya blok büyüklüğü kadar belirler. OpenBSD için bu eğer bsdlabel(8) ile önceden tanımlanır ve newfs(8) tarafından okunur.

-i bytes dosya sistemindeki indeks numarası tablosunun – index node/inode – yoğunluğunu belirler. FreeBSD ve OpenBSD için bu değer parça/fragment sayısının dört katı olacak şekilde otomatik olarak belirler. Ancak sistem yöneticisi tarafından bu seçenek ile bir sayısal değer verilirse newfs(8) bu değeri kullanacaktır. Gereksinimlere göre bu sayı daha küçük seçilerek daha fazla indeks numarası elde edilebilir. Sayı daha büyük seçilirse tersi yani daha az sayıda indeks numarası elde edilir.

Bunların yanında dosya sisteminin okuma/yazma performansı üzerinde etkili olan iki seçeneğe daha göz atmakta yarar var.

-m free-space (%) Normal kullanıcılar için gerekli olan serbest disk alanının yüzdesidir. Bir diğer deyişle eşik değeridir. FreeBSD için bu değer %8 ve OpenBSD için ise bu değer %5'tir. FreeBSD ve OpenBSD için söz konusu değerler src/sys/ufs/ffs/fs.h dosyasında tanımlıdır. tunefs(8) kılavuz sayfasında bu değerin nasıl belirlenebileceğine ilişkin bilgi bulabilirsiniz.

Boş disk alanı yüzdesinin önemi boş blok sayısının büyüklüğünü belirlemesidir. Dosya sistemleri genel olarak bir dosyası ilk boş bloktan başlamak üzere ardışık bloklara yazmayı tercih eder. Bu durum boş blok sayısının azalması durumunda gerçekleşmez ve dosya sistemi dosyayı disk üzerindeki boş bloklara atamak durumunda kalır. Özellikle de dosya sisteminin doluluğu %90 civarına ulaştığında performansında büyük değişimler gözlenir. FreeBSD sistemde doluluk oranı %92 ve OpenBSD sistemde aynı şekilde doluluk oranı %95'e ulaştığında dosyaların kayıt edilmesine izin verilmez. Süper kullanıcı – root – bu durumdan bağışıktır. Kullanıcılar doluluk oranı eşik değerden aşağı indiğinde dosyalarını kayıt edebilir. Dolayısıyla dosya sisteminin çabuk dolması olasılığı var ise sistem hizmete konulmadan önce gereken önlemlerin alınması gereklidir.

-o optimization optimizasyon Dosya sistemininde -m seçeneği ile belirtilen eşik değerin büyüklüğüne göre dosya sistemi ya okuma/yazma süresini veya disk üzerindeki boşlukları/parçaları optimize edecek şekilde davranacaktır. Eşik değer – FreeBSD için %8 ve OpenBSD için %5 – ve daha büyük büyük bir değer seçilirse okuma/yazma performansını iyileştirecek şekilde davranacaktır. Tersi durumda ise disk alnını en etkin ve verimli şekilde kullanacak şekilde davranır. Bu değişken tunefs(8) ile yapılandırılabilir.

Dosya sistemlerinin büyük bir bölümünde hangi dosyaların hangi bloklarda saklanacağını belirleyen algoritmalar kullanılır. Bu seçenek dosya sistemine hangi algoritmanın kullanılarak dosya sisteminin nasıl optimize edileceğini belirtilmesini sağlar. Dosya sisteminin serbest alan eşik değerine yaklaştığında veya aştığında boş blokların bulunabilmesi okuma/yazma performansından daha çok önemli olacaktır.

Dosya sistemine ait olan seçeneklerin ön tanımlı değerlerine bakıldığında hızın – okuma/yazma performansının – öncelikle dikkate alındığı kolaylıkla görülebilir. Okuma/yazma performansı önemli olmakla birlikte dosyaların saklanması için yeterince inode oluşturulmaktadır. Standart bir kurulum için dosya sisteminin ön tanımlı ayarları fazlasıyla yeterli olmaktadır. Gerektiğinde özelleştirilmiş kurulumlar için dosya sistemi farklı seçenekler ile oluşturulabilir.