Bu yazıda Linux dosya sistemini inceleyeceğiz.
En üst seviyede
'root' dizinimiz var. Aslında ismi olmayan tek dizin 'root'tur. Çoğu insan bunun '/' olduğunu söylecektir ama aslında bu doğru değildir. Herhangi bir 'path' yazmaya çalıştığımızda '/' ile başlıyoruz ama root dizini söz konusu olduğunda yazacak başka birşey olmadığı için sadece bu yeterli oluyor.
Root'un altında
'/root' diye bir dizin göreceğiz. Bu biraz karışıklığa sebep verebilir ama bu root dizini olmayıp sadece root olarak adlandırılan bir dizindir. Sistem yöneticisine ait olan bu klasör süper kullanıcının ev dizinidir. Sıradan kullanıcıların bu dizini okuma hakları yoktur. Aslında Linux izinleri 'bak ama dokunma' prensibiyle oluşur. Bunun yegane istisnası 'home' dizinleridir. Kullanıcılar burada istediklerini yapabilirler.
Root Partisyonu: Dosya sistemi organizasyonunu oluşturan prensiplerden bir tanesi de dosya sisteminin birden fazla disk partisyonuna (ya da birden fazla diske) bölünebilmesine izin vermesidir. Bu fikrin özünde de root partisyonu yer alır. Linux sistemi başladığında, kernel tek bir dosya sistemi partisyonunu tek başına ekler. Buna root partisyonu adı verilir. Eklenmesi gereken diğer partisyonlar
mount komutuyla eklenir. Bu da genellikle /etc/fstab dosyasındaki girişlerin kontrolü altında yapılır. Başlangıç anının ilk aşamalarında sadece root dosya sistemi hazır olduğundan sistemin çalışabilmesi için gerekli olan herşeyi içermesi ve dosya sisteminin diğer parçalarını da eklemesi gerekir. Root partisyonundaki araçlar şunlardır:
init programı (bütün diğer prosesleri başlatır), bir kabuk (shell), mount ve '/etc/fstab' dosyası. Dosya Sistemi Hiyerarşisi standardı root partisyonu içinde bulunması gereken dizinleri belirlemiştir.
/boot. Burada 'vmlinuz-2.6.19' şeklinde veya benzeri bir dosya bulunmaktadır. Bu Linux kernel'inin sıkıştırılmış image halidir. Linux sistemi başlatıldığında 'boot loader' (genellikle bu Grub olmaktadır) bu dosyayı hafızaya yükler ve çalıştırır. /boot içinde ayrıca initrd-2.6.19.img şeklinde bir başka dosya daha görülmektedir. Bu da başlangıç RAM disk image'idir. Bu kernel'in başlangıç aşamasında dosya sistemine kendisi daha ulaşamazken ihtiyaç duyduğu modulleri içermektedir. Bu dosyalar silindiği takdirde işletim sistemi bir sonraki sefer başlatılamayacaktır.
lost+found : Bu adda bir dizine 'ext2' veya 'ext3' dosya sistemlerine sahip bütün partisyonlarda rastlanılır.
fsck dosya sistemi üzerine tutarlılık analizi yapan bir programdır.
fsck bir dosyanın bozulmamış fakat bir isme de sahip olmadığını tespit ederse bu dosya için lost+found'da bir giriş yapacaktır. Fakat artık bu gibi durumlarla pek karşılaşılmamaktadır. Bu yüzden lost+found büyük ihtimalle boş bir klasör olarak öylece duracaktır.
Konfigürasyon dizinleri:/etc : Tarihsel olarak bunun 'et cetera' (ve benzeri, ve diğerleri) kısaltması olduğu aşikar. Başka bir yere konulmayan dosyalar burada saklanırdı. Daha sonraları ve günümüzde kullanım şekli değişmiş ve büyük bir sistem konfigürasyon dosyaları ve scriptleri koleksiyonuna ev sahipliği yapmaktadır. Burada bulunan bazı dosyalar kritik öneme sahiptir. Örnek olarak: '/etc/passwd', lokal olarak tanımlanmış bütün loginlerin hesap bilgilerini (root dahil olmak üzere) tutar. '/etc/inittab',
init programına neyi yapmasını söyler.
init, çok özel bir programdır. Çünkü kernel tarafından otomatik olarak başlatılan tek programdır. Diğer bütün servislerin (login olmamıza izin verenler dahil) başlatılmasından sorumludur. '/etc/fstab', hangi diğer dosya sistemlerinin eklenmesi (mount) gerektiğini söyler. Bu dosyalarla ne yaptığınızı bilmiyorsanız oynamamanız iyi olacaktır, aksi takdirde bu dosyalardaki hatalar sistemin başlamasını veya sizin login olmanızı engelleyebilir. '/etc' içinde farklı ağ servisleri için konfigürasyon dosyalarına da rastlarız. '/etc/xinetd.conf',
xinetd'yi konfigüre eder. '/etc/syslog.conf',
syslog konfigürasyonunu içerir. Bütün bu dosyalar düz text dosyalarıdır. Dolayısıyla Linux'u konfigüre etmek için ihtiyacınız olan yegane araç bir text editörüdür. Bunun için de çok sayıda alternatif bulunmaktadır.
/home : Ayrı kullanıcıların home dizinleri burada bulunur. Örnek olarak "taha" kullanıcısı '/home/taha' dizinini kullanır. Default olarak '/home' altındaki permission'lar diğer kullanıcıların dosyalarını listelemenize ve incelemenize izin vermekle beraber değiştirmenize müsade etmez. Doğal olarak, kullanıcılar bu izinleri isterlerse daha zorlaştırıcı şekilde değiştirebilirler.
/mnt : Bu içinde diğer dosya sistemlerini mount etmek için kullanılan boş bir dizindir.
/media : Bu dizin, floppy sürücü veya CD-ROM'lar gibi çıkarılabilir medya için mount noktaları olarak kullanılacak alt-dizinleri içerir. 'Hotplug' sistemi media ünitesini bilgisayara takıldığı anda otomatik olarak buraya mount eder.
Sanal Kısımlar:/proc : Bu ilginç dizindeki dosyalar kernel'in kendi oluşturduğu bilgilerden oluşur. Ama disk üzerinde yer alan hiç bir bilgiye karşılık gelmemektedirler. Kernel, hafıza kullanımı ve proseslerle ilgili bir sürü şeyi takip edebilmek için ('environment' değişkenleri gibi) bu dahili data yapılarına sahiptir. Eskiden, ps benzeri komutlar (çalışmakta olan proseslerle ilgili bilgileri gösterir) kernel'in hafıza image'i içinde gerekli bilgileri ararlardı. Daha sonraları bu arama işlemleri dosyalar aracılığıyla yapılmaya başlandı. Böylece programlar ihtiyaç duydukları bilgileri bu hayali dosyaları herhangi bir başka dosya gibi açıp okuyarak elde ederler. '/proc' içinde eğer
ls -l komutunu verecek olursanız çoğu dosyanın sıfır büyüklükte olduğunu görürsünüz. Ama cat veya less ile dosya içeriklerine bakarsanız da boş olmadıklarını farkedeceksiniz. Yukarıda dediğimiz gibi bu sahte dosyalar dahili kernel data yapılarını düz text olarak gösterirler. Örnek olarak, cmdline kernel'in başlatıldığı argümanları gösterir. cpuinfo dosyası, kernel'in üzerinde çalışmakta olduğu CPU (ya da CPU'lar) hakkında ne bildiğini gösterir. 'meminfo' virtual memory hakkında bilgileri gösterecektir. '3412' ve benzeri isimde dizinlere dikkat edecek olursak, bunlar da proses ID'lere karşılık gelmektedir. Bu dizinlerin içinde ayrı proseslere ait bilgilere sanal dosyalar aracılığıyla erişebiliriz.
man 5 proc ile bu konu ile ilgili dökümantasyona ve detaylı bilgiye ulaşılabilir. Ama top ve ps ile her bir prosese ait bilgileri daha anlaşılabilir şekilde elde etmek faydalı olacaktır. /proc'u çoğu zaman salt-okunabilir bir dosya sistemi olarak düşünebiliriz. Fakat aslında '/proc/sys' altında bazı kernel'i ayarlayabileceğimiz parametreleri içeren ve bunları yazabileceğimiz dosyalar da bulunmaktadır. Örnek olarak, TCP FIN TIMEOUT adında bir parametreyi 60'tan 50'ye şu şekilde değiştirebiliriz:
# cd /proc/sys/inet/ipv4
# cat tcp_fin_timeout
60
# echo 50> tcp_fin_timeout
# cat tcp_fin_timeout
50
/sys : Bu da hayali dosya sistemlerinden bir diğeridir. 2.6 kernel'ine kernel-seviyesinde kodun kullanıcı boşluğunda (user space) çalışan programlarla olan data alışverişlerini kolaylaştırmak için eklenmiştir (aygıt sürücüleri gibi). '/sys' altındaki hiyerarşi kernel'in keşfettiği donanım environment'ını (bus'lar, aygıtlar ve diğerlerini) görmemize olanak sağlar. Linux hotplug sistemini yeniden yazmaya kalkmadığımız sürece burayla bir işimiz olmayacaktır.
Diğer Dizinler:/dev : 'Dev' 'devices' için bir kısaltmadır. Eğer burada
ls -l komutunu deneyecek olursak satır başlarında 'b' veya 'c' gibi karakterleri ilk sırada göreceğiz. b'ler blok aygıtlarını göstermektedir. Bu aygıtlar blok yapısındadır ve rastgele erişilebilirler. Genellikle disk partisyonlarını kapsar. '/dev/hda1', ilk sabit diskin ilk partisyonuna karşılık gelmektedir. Bu bir blok aygıtıdır. Bu sistemde hda1 root partisyonudur (Sizin sisteminizde kuruluma göre değişiklik gösterebilir.) Aslında şu ana kadar incelediğimiz herşey bu dizinle gösterilen partisyon üzerinde yer alıyordu. Ayrıca tty aygıtlarını da burada göreceğiz. Bunlar karakter aygıtlarıdı. Karakter temelli terminalleri temsil ederler. Örnek olarak, Linux 6 adet sanal terminali desteklemek üzere konfigüre edilmiştir. Grafik ekranınızdan Ctrl+Alt+F1 ike Ctrl+Alt+F6 arasındaki kombinasyonlar aracılığıyla bunlara erişebilirsiniz. (Masaüstüne geri gelebilmek için Ctrl+Alt+F7'yi kullanabilirsiniz.) Bu altı sanal terminal /dev/tty1 ile /dev/tty6 arasındakilerdir. 'tty' ismi orijinal olarak 'teletype'ın kısaltılmasıydı. Teletype'lar klavyeye sahip mekanik birer daktilo türü yazıcıydılar. Özellikle ASR33 adında bir model 1970'lerde mini-bilgisayarlar üzerinde son derece popülerdi. Bu esnada Unix daha yeni geliştiriliyordu ve Linux henüz yoktu. Teletype'lar çok uzun süre önce kalktı fakat isimleri kaldı. Artık tty denildiğinde bir tür karakter temelli ekran anlıyoruz.
/bin ve /sbin : 'bin' binary kısaltmasıdır ve burada göreceğimiz çoğu dosya çalıştırılabilirdir. Neden iki tane var? Sıradan kullanıcıların kullanabileceği programlar -
Vi,
tar,
rm,
date gibi- '/bin' içinde bulunur. Sadece süper kullanıcıların kullanabilecekleri de /sbin'de yer alır. 'sbin'deki 's'i süper-kullanıcı ya da sistem olarak alabiliriz. Örneğin, ifconfig (ağ kartı parametrelerini oluşturur) ve iptables (firewall kurallarını kurar) /sbin içindedir. Çünkü bu işlemleri yapma hakkı sadece root'a tanınmıştır. Çoğu Linux dağıtımlarında, /bin normal bir kullanıcı hesabının arama path'inde yer alırken /sbin bulunmaz. Elbette, sıradan kullanıcılar da bu komutlara path'in tamamını kullanarak örneğin
/sbin/iptables ile ulaşabilirler, ama bu komutların çoğu eğer root değilseniz herhangi bir şey yapmanıza izin vermeyeceğinden bir anlamı olmayacaktır.
/lib : 'lib' 'library' kısaltmasıdır. /bin ve /sbin içinde bulunan sistem programları tarafından ihtiyaç duyulan paylaşımlı kütüphaneler burada yer alır. (Windows'ta bunun karşılığı DLL kütüphaneleridir.) Hemen hemen herşey tarafından kullanılan kritik öneme sahip bir kütüphane standart C kütüphanesidir (libc.so). Bu dosyayı silecek olursak, çoğunlukla herşey çalışmasını durduracaktır.
/usr : Bu dizin genellikle başka bir partisyon üzerinde bulunur. Bu da başka bir 'mount' noktası anlamına gelmektedir. Bu dizini incelediğimizde, root dizininde bulunan diğer dizinlerin bazılarının tekrarlandığını görürürüz. Özel olarak, '/usr/bin', '/usr/sbin' ve '/usr/lib' dikkatimizi çekecektir. Gerçekten de, daha önce incelediğimiz dizinlerle benzer şeyleri barındırırlar. '/usr/bin' kullanıcı seviyesi komutları, '/usr/sbin' sistem yöneticisi komutlarını ce '/usr/lib' de kütüphaneleri içerir. Peki bu dosyalar neden iki ayrı dizin setine ayrılmıştır? Bunun cevabı partisyonlarda yatmaktadır. /usr içindekiler çoğu zaman ayrı bir partisyonda yer alır. Bu partisyon da dosya sistemine boot prosesi esnasında göreceli olarak geç bir evre gerçekleşinceye kadar eklenmez. Açılış esnasında gerçekten kritik öneme sahip komponentler root partisyonu içinde yer almalılar, /usr'de değil. Bu şekilde dosyalarımız bölmek, tek-kullanıcılı bir açılış yapmak için gerek duyacağımız eksiksiz dosya sistemi parçalarını minimumda tutmamızı sağlar. '/bin', '/sbin' ve '/lib' içindeki dosyalar gereklidir. /usr'dekiler ise değildir. /usr'yi dosya sistemine daha iyi bir güvenlik sağlamak için salt-okunur olarak mount etmek de mümkündür. Bir ağ üzerinde, /usr'yi tek bir dosya sunucusundan en azından ortak bir donanım yapısına sahip makineler arasında paylaştırmak da olasılık dahilindedir. Aslında, çalıştırılabilir dosyaların ve kütüphanelerin çok bir büyük bir çoğunluğunun '/usr' içinde yer aldığı görülmektedir. Çok azı da root partisyonundadır. Sistemin disk büyüklüğü kullanımına ilişkin bir araştırma şu şekilde sonuç veriyor:
$ du -sh /bin /sbin /lib /usr/bin /usr/sbin /usr/lib
4.9M /bin
6.3M /sbin
109M /lib
92M /usr/bin
5.7M /usr/sbin
625M /usr/lib
Kendi sisteminizde göreceğiniz sayılar elbette farklı olacaktır. Ama ana fikir aynı kalacaktır: çoğunluk /usr içinde, ve root partisyonu göreceli olarak küçük kalıyor.
Üzerinde durduğumuz dizinler dışında ayrıca '/var', '/tmp' ve '/opt' de bulunmaktadır ama şimdilik bu kadarı yeterli.
Dosya tipleri:Dosya sisteminde 7 farklı tür bulunmaktadır. 'ls -l' ile ekrana gelen bilgilerde her satırın ilk karakteri o dosyanın türünü gösterir. Aşağıdaki tabloda bu türleri ve Ubuntu sisteminde bulunabilecek sayıları (elbette her sistemde farklılık göstereceği dikkate alınarak) listelenmektedir:
| Tür | Sayısı | Tanım |
| - | 102,314 | Sıradan bir dosya. Açık ara en çok rastlanılan dosya türü. |
| d | 14,701 | Dizin. Bir dizin diğerleri için bir konteynerdir. Klasör de denilebilir. |
| l | 15,258 | Sembolik link. Bunlar içinde başka bir dosyanın adını taşıyan çok küçük dosyalardır. Windows'taki kısayollara benzetilebilir. Eğer /etc/motd'den /var/run/motd'ye bir sembolik linkimiz olsaydı, ve bir program /etc/motd'yi açsaydı, kernel /var/run/motd'yi açacaktı. Sembolik linklere 'symlink' ya da 'soft link' de denilmektedir. |
| c | 785 | Bir karakter aygıtı (ayrıca bazen 'raw device' veya karakter özel dosya da denilir). Bu girişler aygıtlara isim verme hizmetini görürler. /dev/console gibi bazıları gerçek fiziksel aygıtlara karşılık gelirler. Diğerleri sahte aygıtlara, örneğin /dev/random kernel'in rastgele sayı üretecine erişime izin verirler. |
| b | 65 | Bir blok aygıtı. Blok aygıtları çoğunlukla disklerdir. Örneğin /dev/hda2 hard disk a üzerinde 2.partisyonudur. Genel olarak, bir karakter aygıtı sıralı byte katarını okuyup yazmaya, ve bir blok aygıtı da rastgele erişime izin verir. Buna rağmen gerçek fark, kernel'in blok aygıtlar için tek seferde tam bir bloğu okuyup yazmaları için bir buffer layer'ı sağlamasıdır. Bunu karakter aygıtları için yapmaz. Pratik olarak bütün aygıt dosyaları /dev içinde yer alır. |
| s | 34 | Unix-domain'i soketleri. Bunlar dosya sisteminde haberleşme son-noktaları olarak adlandırılır. TCP ve UDP soketlerine çok yakın benzerlikte kullanılırlar. Farklı olarak, aynı makinede çalışan prosesler arasında inter-proses haberleşmeyi desteklerler. |
| p | 7 | İsimli pipe'lar. Artık çok nadirdirler. Unix-domain soketleri gibi, inter-proses haberleşme için kullanılan isimli son-noktalardır. |
Kaynak: "Take the Linux Filesystem Tour" adlı yazıdan çevrilmiş ve özetlenmiştir.