Dosya sistemi dosyaları nasıl saklar — 1?

Bu flood’da Linux’ta dosya sistemlerinin dosyaları nasıl tuttuğunu ve inode'un ne işe yaradığını anlatacağım.

Dosya sistemi işletim sisteminin bir parçası olarak sistem ve kullanıcı dosyalarının tutulmasını sağlar. Dosya ve klasörlerin metadata'larının (kime ait oldukları, son değiştirilme tarihleri vb) ve içerdikleri data'ların tutulması dosya sisteminin sorumluluğundadır.

Dosya sistemlerinin kurgulanmasında Windows, Linux ve Unix’te birbirinden oldukça farklı yaklaşımlar vardır. Biz bu flood’da kabaca Linux’taki ext2 ve ext3 dosya sistemlerindeki yapıyla kapsamı sınırlı tutacağız.

Daha önce, işletim sisteminin disk bölümlerini formatlarken disk alanını 4K — 64K’lık mantıksal bloklara böldüğünü, numaralandırdığını ve öyle yönettiğini söylemiştik. Bu bloklarda hem veriler hem de “veriler hakkındaki veriler” yani metadata'lar tutulur.

Linux’ta dosya metadata'ların tutulduğu veri yapısına inode adı verilir. Her bir disk bölümü için disk bölümünün formatlanması sırasında belirli sayıda inode üretilir ve disk bölümünün başındaki bloklara yazılır.

Her bir dosyanın metadata'sının tutulması için bir inode gerektiğinden bir disk bölümünde yaratılabilecek dosya sayısı o disk bölümündeki toplam inode sayısı ile sınırlıdır. Bu sebeple inode sayısı disk bölümünde ihtiyaç duyulan dosya sayısından fazla olmalıdır.

Aşağıda Linux’taki ext2 ve ext3 dosya sistemlerinde kullanılan inode'un yapısına yer verilmiştir. stat komutu ile görüntülenen dosya ve klasörler ile ilgili bütün metadata bilgileri bu bölümde tutulmaktadır.

Dosya ve klasör içeriklerini tutan disk bloklarının hangi dosya ve klasöre ait olduğu da yine inode'larda tutulur. ext2 ve ext3 dosya sistemlerinde inode Pointer Structure adı verilen bu mekanizma çok akıllıca kurulmuştur.

inode Pointer Structure aşağıda resmedilmiştir. Görüldüğü üzere inodeüzerindeki direkt ve endirekt pointer’lar ile dosya içeriğinin bulunduğu disk blok adresleri tutulmaktadır.

Direkt olarak inode üzerinde data bloklarını tutmak üzere Direct Block adı verilen 12 adet alan vardır. 4K'lık bloklardan oluşan bir disk bölümünde, boyutu 4K x 12 = 48K'dan küçük olan dosyaların bloklarını tutmak için bu Direct Block'lar yeterli olacaktır.

Boyutu 48K’dan büyük olan dosyaları tutmak içinse Indirect Block'lar kullanılır. Diskten bir data blok ödünç alınarak bu data blok içerisine alabildiği kadar (4K / sizeof(block number)) = 1024 blok numarası doldurulur ve böylece 1024 x 4K = 4M'lık dosyalar da kapsanır.

4M + 48K'dan büyük olan dosyalar için inode'daki Double Indirect Block alanı kullanılır. Diskten 1 + 1024 data blok ödünç alınarak ilk bloğa diğer 1024 bloğun numarası, 1024 bloğa ise 1024'er tane data blok adresi doldurulur ve büyük dosyalar da böylece saklanabilir.

Double Indirect Block'un da dosya büyüklüğünü karşılayamadığı durumlarda Triple Indirect Block kullanılır. Disk bölümündeki blok büyüklüğünün 4K olduğu bir dosya sisteminde tutulabilecek en büyük dosya anlaşılacağı üzere 4TB civarında olacaktır.

Görüldüğü üzere inode akıllı yapısı sayesinde sadece ihtiyaç olduğunda (büyük dosyalarda) endirekt ekstra bir blok yaratmakta bunun dışında sabit bir disk alanında hızlı erişimle dosyanın disk üzerinde hangi bloklarda bulunduğunu tutabilmektedir.

Disk bölümünün blok büyüklüğü artırılırsa (örneğin 4K yerine 16K), dosyanın içeriğini tutmak için daha az blok kullanılacak, dosyaya daha hızlı erişilecek ve 4TB’dan daha büyük dosyaları tutmak mümkün olacaktır fakat küçük dosyalar (1KB) tutulurken 3K yerine 15K boşa gidecektir.

Dosya sistemleri ustaca tasarlanmış basit sistemlerdir. Siz de C, Go veya Python ile artık kullanmadığınız bir flask diski ext2/ext3 ile formatlayıp bu sistemlerin detaylarını araştırarak kendi ro veya rw dosya sisteminizi kodlayarak bilinç düzeyinizi artırabilirsiniz.

Bir sonraki flood’da dosya sisteminin nasıl çalıştığı konusuna devam ederek dosya sisteminin bir dosyaya nasıl eriştiğini, dosya isimlerinin ve klasörlerin nasıl tutulduğunu örneklerle inceleyeceğiz.