İçindekiler
Bir Linux programı /home/ada/notlar.txt dosyasını açarken diskin Ext4, FAT32, NFS veya başka bir dosya sistemiyle biçimlendirilmiş olup olmadığını genellikle bilmez. Program yalnızca yol, dosya ve dizin kavramlarını görür. Bu etkileyici illüzyonu oluşturan katman, çekirdekteki VFS (Virtual File System) yapısıdır. VFS, farklı kurallara sahip depolama sistemlerini ortak bir arayüzün arkasında buluşturan evrensel bir tercüman gibi çalışır.
``
Neden bir soyutlama katmanı gerekiyor?
Ext4; Unix izinleri, sembolik bağlantılar ve günlükleme gibi özellikleri doğal olarak destekler. FAT32 ise daha basit bir yapıya sahiptir; Unix tarzı sahiplik bilgilerini diskte aynı biçimde saklamaz. NFS gibi ağ dosya sistemlerinde veriye ulaşmak için fiziksel diske değil, ağ üzerinden başka bir makineye istek gönderilir.
Buna rağmen kullanıcı programları çoğunlukla aynı sistem çağrılarını kullanır:
int fd = open("/mnt/veri/rapor.txt", O_RDONLY);
char buffer[128];
ssize_t n = read(fd, buffer, sizeof(buffer));
close(fd);
Bu kod, dosyanın türünü sorgulamadan onu açar, okur ve kapatır. open() çağrısını karşılayan çekirdek, yolun hangi bağlama noktasına ait olduğunu bulur; ardından işlemi ilgili dosya sistemi sürücüsüne yönlendirir.
| Özellik | Ext4 | FAT32 | NFS | VFS’nin sunduğu görünüm |
|---|---|---|---|---|
| Veri konumu | Yerel disk | Yerel/çıkarılabilir disk | Uzak sunucu | Dosya yolu |
| Unix izinleri | Doğal | Sınırlı/türetilmiş | Sunucuya bağlı | Ortak izin API’si |
| Sembolik bağlantı | Var | Doğal olarak yok | Genellikle var | Destekleniyorsa standart işlem |
| Erişim yöntemi | Blok aygıtı | Blok aygıtı | Ağ protokolü | open, read, write |
VFS’nin temel nesneleri
VFS, her şeyi tek bir dev nesneye dönüştürmez. Bunun yerine birkaç çekirdek veri yapısı arasında görev dağıtır:
- Superblock: Bağlanmış dosya sisteminin genel bilgisini temsil eder.
- Inode: Bir dosyanın türü, izinleri, sahibi ve boyutu gibi metadata bilgisini taşır.
- Dentry: Dosya adlarını inode’larla ilişkilendirir ve yol çözümlemeyi hızlandırır.
- File: Açılmış dosyanın süreç açısından durumunu, konumunu ve bayraklarını tutar.
Basitleştirilmiş olarak bir yol çözümleme maliyeti şöyle düşünülebilir:
\[T_{erişim} = T_{yol} + T_{VFS} + T_{sürücü} + T_{depolama}\]Yerel Ext4 kullanımında son terim disk veya önbellek gecikmesidir. NFS kullanımında ise buna ağ gecikmesi de eklenir. VFS aynı arayüzü sağlasa da bütün dosya sistemlerini aynı hızda veya aynı yeteneklerde yapmaz.
İşlem yönlendirme nasıl gerçekleşiyor?
Her dosya sistemi, VFS’nin beklediği operasyon tablolarını doldurur. Mantık kabaca şöyledir:
struct file_operations ornek_islemler = {
.read = ornek_read,
.write = ornek_write,
.open = ornek_open,
.release = ornek_close
};
Bu yapı temsili bir örnektir. VFS, genel read() isteğini aldığında açık dosyayla ilişkili operasyon tablosundaki uygun fonksiyonu çağırır. Böylece Ext4 kendi blok eşleme mantığını, NFS ise ağ isteği oluşturma mekanizmasını çalıştırabilir.
Tek ağaç illüzyonu
Windows dünyasındaki ayrı sürücü harflerinin aksine Linux, dosya sistemlerini tek bir kök ağaca bağlar:
mount /dev/sdb1 /mnt/fat32
mount -t nfs sunucu:/paylasim /mnt/ag
Bu komutlardan sonra /mnt/fat32 ve /mnt/ag, / ile başlayan aynı ağacın dalları gibi görünür. Bağlama noktası geçildiğinde VFS, yol çözümlemeye başka bir superblock üzerinden devam eder. Kullanıcı açısından yalnızca dizin değiştirilmiştir; çekirdek açısından ise bambaşka bir depolama dünyasına geçilmiştir.
VFS’nin asıl başarısı farklılıkları yok etmek değil, onları kontrollü biçimde saklamaktır. FAT32’de bulunmayan izinlerin bağlama seçenekleriyle taklit edilmesi veya ağ bağlantısı kopunca NFS işleminin hata vermesi bunun sınırlarını gösterir. Yine de programcıya sunulan homojen dosya ağacı, işletim sistemlerinin en güçlü soyutlamalarından biridir: Alt katta türlü motorlar çalışırken üst katta herkes aynı direksiyonu kullanır.
Yorumlar