Dosya sistemi dosyaları nasıl saklar — 2?

Bu flood’da Linux’ta dosya sistemlerinin dosyaları nasıl tuttuğunu ve sunduğunu anlatmaya devam edeceğim.

ext2 ve ext3 dosya sistemlerinin içerdiği verilerin tutulduğu inode Pointer Structure'a önceki flood'da detaylı olarak değinmiştik. Bir disk bölümünde kullanılan dosya sistemi hakkındaki bilgiler superblock adı verilen disk bloğunda bulunur.

superblock'ta dosya sisteminde kaç blok olduğu, bu bloklarının kaçının boş olduğu, kaç inode olduğu, dosya sisteminin blok büyüklüğü (1K, 2K, 4K, vb) ve tipi (ext3, ext4, vb) gibi bilgiler bulunur.

superblock'taki bilgiler dumpe2fs programı -h parametresi ile çalıştırılarak ekrana döktürülebilir. Aşağıdaki örnekte dumpe2fs programı /dev/sdb1 adlı disk bölümü için çalıştırılmıştır.

Önceki flood’da, inode'larda dosyaların metadata'larının, disk üzerideki data bloklarında ise dosyaların içeriklerinin tutulduğundan bahsetmiştik fakat dosya isimlerinin nerede tutulduğuna değinmemiştik. Klasörlerin metadata'sı da dosyalarda olduğu gibi inode'da tutulur. Klasör içerikleri de dosya içerikleri gibi data bloklarinda tutulur. Dolayısıyla klasörlerin data bloklarında, içlerindeki dosyaların isimleri ve inode numaraları tutulur. Bütün klasörlerdeki ilk iki dosya . yani o anda bulunulan klasör ve .. yani bir üst klasördür.

Aşağıdaki resimde bir klasörde bulunan dosyaların klasörün data bloğunda nasıl tutulduğu gösterilmiştir.

Klasörlerin içerisindeki dosya ve klasörleri yukarıda gösterildiği gibi dosya ismi - inode numarası şeklinde tutması sayesinde dosya sisteminde hard link ve soft link oluşturmak görüleceği üzere oldukça kolaylaşmıştır.

Bütün bu bilgilerden hareketle kabuktan verilen cat /mnt/data/test-file komutunda, dosya sisteminin test-file dosyasına erişmek için hangi yolu izlediğini anlamaya çalışalım. Öncelikle en üstteki klasörden başlanarak bir mount point bulununcaya kadar /mnt, /mnt/data yollarına bakılır. Eğer bir mount point yoksa dosya root - / dosya sisteminin bulunduğu disk bölümünde aranır. Bir mount point bulunduğunda ise o disk bölümünde aranır. Bizim örneğimizde /dev/sdb1 disk bölümü /mnt/data klasörüne bağlanmıştır ve /dev/sdb1'de aranır.

Yukarıdaki işlemle dosyanın hangi disk bölümünde dolayısıyla hangi dosya sistemine bulunduğu belirlendikten sonra o disk bölümündeki ana klasör ve alt klasörlerin data blokları okunarak dosya yolunda geçen klasör ve dosya isimleri ile eşleştirilerek gidilir ve dosyaya erişilir.

Şimdi Linux’ta bir disk bölümü oluşturalım. Diski ext3 ile formatlarken blok büyüklüğünü 4K, içereceği inode sayısını da daha kolay deney yapmamıza olanak tanıyacak şekilde 2048 olarak belirleyelim.

Diski /mnt/data klasörüne bağlayalım, içerisinde bir dosya oluşturarak o dosya için verilen inode numarasına bakalım.

Şimdi de df -i /mnt/data komutu ile /dev/sdb1 disk bölümünde kalan inode sayısını ekrana bastırıp /mnt/data altında o sayıda dosya oluşturarak disk bölümündeki inode'ları tüketelim. Data sonra yeni bir dosya oluşturmaya çalışarak neler olduğuna bakalım.

Son olarak çok faydalı debugfs programını tanıtarak bitirelim. Aşağıda gösterildiği gibi debugfs komutu ile bir dosyanın data blokları bulunabilir ve dd yardımıyla okunabilir. debugfs özellikle silinmiş dosyalar kurtarılırken çok faydalı olmaktadır.

Aşağıdaki ekran çıktısında ise içerisinde 5 dosya bulunan bir klasörün disk üzerindeki data blokları debugfs, dd ve hexdump programları yardımıyla ekrana döktürülmüş ve bu data bloklarında dosya isimleri ile inode numaraları bulunduğu gösterilmiştir.

Like what you read? Give Gökhan Şengün a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.