Dosya Sistemi
Genel olarak UNIX tabanlı sistemler için şöyle bir özdeyiş vardır: UNIX sistemlerinde her şey birer dosyadır; eğer bir şey dosya değilse o zaman process'dir.
Bu yaklaşım Linux için de geçerlidir. Bazı dosyaların diğerlerinden daha özel anlamlarının da olabilmesiyle birlikte (aygıt dosyaları, domain soketler, pipe, link vb.), pek çok işlem dosya sistematiği içerisinde kalınarak gerçekleşmektedir.
Dosya sistemi arayüzüne verilen önem, proc yalancı dosya sistemi gibi (pseudo file system) örneklerde de kendini gösterir. Bu dosya sistemini bir dizine bağlayıp (mount) kullanmaya başladığınızda içerisinde görülen dizin ve dosyalar, çalışan kernel içeriğinin bir yansımasından başka bir şey değildir.
Aygıt Dosyaları
Unix sistemlerde fiziksel aygıtlara erişmek için aygıt dosyaları (device files) kullanılır. Aygıt dosyaları sayesinde çekirdek içerisinde hangi aygıt sürücüsünün kullanılacağı belirlenmiş olur.
Bu yöntemle disk, seri port gibi fiziksel aygıtlara erişilebildiği gibi, /dev/random gibi fiziksel bir karşılığı olmayan, sanal aygıt dosyaları üzerinden erişimler de mümkündür.
Aygıt dosyalarının ilişkili olduğu aygıt sürücüleri, çekirdek içerisindeki belirli bir kod kümesinden ibarettir. Örnek olarak SCSI veriyolu üzerindeki birinci disk üzerinde işlem yapmak için /dev/sda dosyası kullanıldığında çekirdek içerisinde SCSI katmanıyla ilgili bir agıt sürücüsü devreye girerken, sisteme takılan ilk USB Seri Çevirici cihazına erişim için /dev/ttyUSB0 dosyası kullanıldığında USB - Seri çeviricilere ait sürücü kodları devreye girecektir. Peki acaba çekirdek içerisinde, erişilen aygıt dosyasının ismini metin karşılaştırma yöntemiyle kontrol edip, sda ise şu fonksiyonu çalıştır şeklinde bir tablo mu bulunmaktadır?
Yukarıdaki sorumuza vereceğimiz yanıt hayır olacaktır. Esasen /dev dizini altındaki aygıt dosyalarının isminin ne olduğunun hiç bir önemi bulunmamaktadır. Aşağıdaki komutun çıktısını inceleyelim:
$ ls -l /dev/sda
brw-rw---- 1 root disk 8, 0 Mar 7 21:52 /dev/sda
Yukarıdaki çıktıda normal bir dosyadan farklı olarak 3 farklı bilgi daha yer almaktadır. Bunlar:
- Satırın ilk karakteri olan b, blok tabanlı bir aygıt dosyası olduğunu gösterir. Karakter tabanlı aygıt dosyaları için c kullanılır.
- İlgili aygıta ait Major numarası olarak 8 rakamı görünmektedir.
- İlgili aygıta ait Minor numarası olarak 0 rakamı görünmektedir.
Özetle aygıt dosyaları üzerindeki bu ek bilgilerle, dosyanın karakter tabanlı mı yoksa blok tabanlı erişim gerektirdiği, çekirdek içerisinde kullanılacak Major ve Minor numaralarının neler olduğu bilgisi saklanır.
Çekirdek açısından bu 3 bilginin aynı olduğu tüm aygıt dosyaları üzerinden kullanıcı kipinden yapılan her türlü erişim, çekirdek içerisinde aynı sürücü tarafından karşılanır. Yani aygıt tipi, major ve minor numarası /dev/sda ile aynı olacak şekilde /dev/birinci-scsi-disk, /etc/sda, /mnt/disk vb. herhangi isimlerde aygıt dosyaları üretsek de bu dosyalar üzerinden yapılacak erişimler hep aynı etkiyi üretir.
Peki çekirdek için aygıt dosya isimlerinin bir anlam taşımadığını öğrendiğimize göre isimlendirme kurallarına hatta aygıt dosyalarına neden ihtiyaç vardır?