05- Dosya Sistemi Hiyerarşisi
Linux sistemlerde belirli dizinler, belirli amaçlar için kullanılmalıdır. Bu referans modeli, Filesystem Hierarchy Standard olarak bilinmektedir. Bu standart, günümüzde Linux Foundation tarafından yönetilmektedir.
Tabii bu çerçeveye uymayacak şekilde bir Linux dağıtımı çıkarmak da mümkün. Fakat yaygın kullanılan Linux dağıtımlarının çok büyük kısmı, bu çerçeveyi benimsemiştir ve ona göre hareket etmektedir.
Doğru Dokümanı Okuma
Linux'ta dosya sistemi hiyerarşisi için en sağlıklı kaynak, Filesystem Hierarchy Standard dokümanıdır. Bu yazıda, elimden geldiğince doğru şekilde özetlemeye çalışşacağım. Ancak en doğru kaynak, orijinal dokümanın kendisidir. Özellikle LinkedIn'de sıklıkla karşımıza çıkan ve "Wow! Great insight!" gibi yorumlar alan saçma sapan diyagramlara aldırış etmeyiniz. Bu yazıda yazdıklarımı da boşveriniz ve standardın kendisini okuyunuz.
Bu standarda göre, dosyalar arasında 2 bağımsız ayrım yapılabilir: paylaşılabilir (shareable) vs. paylaşılamaz (unshareable) ve değişken (variable) vs. statik (static). Bu farklılıklara sahip dosyalar, farklı dizinlerde yer almalıdır. Bu sayede, farklı karakteristik özelliklere sahip dosyaları saklamak daha kolay olacaktır.
Shareable ile kast edilen dosyalar, bir makinede depolanıp, başka makinelerde kullanılabilecek dosyalardır. Unshareable dosyalar ise, bu duruma uygun olmayan dosyalardır.
Static dosyalar; programlar, kütüphaneler, kılavuz sayfaları gibi, sistem yöneticisinin müdahalesi olmadan değişmeyecek olan dosyalardır. Variable dosyalar ise, static olmayan dosyalardır.
Örneğin, kullanıcıların ev dizinleri, shareable olarak nitelendirilir. Ev dizinlerinde, kullanıcıların kişisel dosyaları bulunur. Tüm bu dosyalar, network üzerinde bir dosya sisteminde tutulabilir ve her makineye ayrı ayrı kopyalarının atılmasına gerek kalmaz. Static dosyalar ise, read-only (salt-okunur) bir dosya sistemi üzerinde saklanabilir ve oradan herkesin kullanımına sunulabilir. Bu ve bunun gibi farklı dosyaları yönetmek için, FHS takip edilir.
Rationale
Shareable files can be stored on one host and used on several others. Typically, however, not all files in the filesystem hierarchy are shareable and so each system has local storage containing at least its unshareable files. It is convenient if all the files a system requires that are stored on a foreign host can be made available by mounting one or a few directories from the foreign host.
Aşağıda, FHS'de yer alan örnek tabloyu bulabilirsiniz.
| paylaşılabilir | paylaşılamaz | |
|---|---|---|
| statik | /usr | /etc |
| /opt | /boot | |
| değişken | /var/mail | /var/run |
| /var/spool/news | /var/lock |
Şimdi dosya sistemlerini ayrı ayrı ele almaya çalışalım.
Root filesystem (/)
Sistemin başlatılması, diğer dosya sistemlerinin sisteme eklenmesi (mount edilmesi), sistem kurtarma ve tamir araçları gibi zorunlu bileşenlerin burada bulunması beklenir. Mümkün mertebe - yeterli alan verildiğinden emin olunarak - küçük tutulması beklenir. Bunun temel sebeplerini şu şekilde sıralayabiliriz:
- Sisteme göre değişkenlik gösterebilecek bir veridir. Dolayısıyla birebir aynı yapıyı farklı makinelerde kullanmak pek de mümkün olmayabilir. Bu alanı küçük tutarak, makinelere spesifik kalacak alanı daraltmış ve atıl alanı azaltmış oluruz.
- Çok küçük boyutlu bir medyaya taşınabilir ve farklı yerlerde rahatlıkla kullanılabilir.
- Diskin büyük kısmını ayırırsak ve bu alanda bir problem çıkarsa, root filesystem için bu kritik bir sorun olur. Alanı dar tutarak, sorunla karşılaşma ihtimalimizi azaltabiliriz.
Kurulum Sırasında Partitioning
Önceki dokümanlarda Linux dağıtımlarını kurarken, bütün disk alanımızı yalnızca root partition'a (/) vermiştik. Ve bunun yanlış olduğundan bahsetmiştik. Bu yazıda, nasıl büyük bir yanlış yaptığımızı tekrar tekrar göreceksiniz. Fakat kurulum sayfalarında bahsettiğimiz gibi, biz sadece deneme amaçlı makineler kurmuştuk ve bu makinelerin hiçbir önemli işi olmayacak.
/bin
Sistemdeki tüm kullanıcılar tarafından kullanılabilecek binary'leri barındıran alandır.
/boot
Bu dizin, sistemin başlatılması için gerekli olan her şeyi içerir. Kernel'ın kullanıcı-modu (user-mode) programlarını çalıştırmaya başlamasınadan önce kullanılan verileri depolar.
/dev
Device (aygıt) dosyalarını barındırır. Bunun yanı sıra bazı özel dosyaları da barındırabilir.
/etc
Sisteme özgü yapılandırma dosyalarının bulunduğu dizindir. "Yapılandırma dosyası", bir programın çalışmasını kontrol etmek için kullanılan dosya(lar)dır. Dosyaların, doğrudan /etc dizininde değil, /etc alt dizinlerinde saklanması önerilir. İşletim sistemine özgü yapılandırma dosyaları - /etc/passwd - gibi, bunu takip etmeyebilir. Fakat 3. parti yazılımların yapılandırma dosyaları, /etc/ altında ayrı birer dizin olarak yer alır. "/etc/apache2", "/etc/ansible" gibi.
/home
Kullanıcıların ev dizinlerini barındırır. Kullanıcının bireysel dosyaları - yapılandırma dosyaları da dâhil - hiyerarşide yer almalıdır. Veriler, doğrudan /home dizini altına atılmaz. Bunun yerine, kullanıcıların ev dizinleri için alt dizinler açılır. Örneğin "/home/kullanici1", "/home/ali" gibi.
Kullanıcı Dosyaları
Biz Ubuntu Server kurulumu yaparken, 25 GB'lik alanın tamamını "/" dizini olarak vermiştik. "/home" dizini de burada. Dolayısıyla "ali" kullanıcısının ev dizini olan "/home/ali" dizini de... Her şey tek bir partition'da yer alıyor. Şu durumda "ali" kullanıcısı, kendi ev dizininde büyük dosyalar oluşturarak ya da bu dosyaları indirerek 25 GB'lik tüm alanı tüketebilir. Makinenin diskini doldurabilir ve makinenin çalışmasını engelleyebilir. Her şeyi tek bir partition'da toplamanın dezavantajlarından birini daha görmüş olduk.
/lib
/lib dizini, sistemi başlatmak ve root dosya sistemindeki komutları çalıştırmak için gerekli kütüphaneleri içerir.
/media
Çıkarılabilir medyalar için bağlantı noktası olarak kullanılır. Örneğin, cihazınıza bir CD taktığınızda, "/media/cdrom" dizini altından erişebilirsiniz. Bu tarz durumlar için günümüzde çoğu zaman "/mnt" dizini kullanılıyor olmasına rağmen, bu yaklaşım geçmiş geleneklerle çatışmaktadır.
/mnt
Bu dizin, sistem yöneticisinin gerektiğinde geçici olarak bir dosya sistemi bağlayabilmesi için sağlanmıştır. Geçici olarak bağlanacak bir flash bellek, harici disk gibi düşünebilirsiniz.
/opt
/opt, ek yazılım paketlerinin kurulumu için ayrılmıştır. /opt dizinine kurulacak bir paketin statik dosyaları ayrı bir /opt/
/root
Sistemdeki en yetkili kullanıcı olan "root" kullanıcısının ev dizinidir. root kullanıcısının ev dizini, diğer standart kullanıcılarda olduğu gibi /home dizininde tutulmaz.
Root'un Evi
/home dizinini 10 GB'lik bir bölüm yaptığınızı düşünün. Standart kullanıcılar, bu 10 GB'lik alana hapsolmuş durumdadır. Bu alanı kullanmak için birbirleriyle yarışabilirler. Bu sırada root kullanıcısı, kendine ayrılmış "/root" bölümünü dilediği gibi kullanmaya devam edebilir.
/run
Bu dizin, sistemin önyüklenmesinden itibaren sistem hakkında bilgi veren verileri içerir. Sistemdeki process'ler ile ilgili bilgiler, çalışma zamanı (runtime) verileri bu dizin altında tutulur.
Programlar, /run dizininde bir alt dizin oluşturabilir. Kullanıcılar da /run dizininde bir alt dizine sahip olabilir, ancak /run ve diğer alt dizinlere yetkisiz erişimi engellemek için erişim haklarının uygun şekilde sınırlandırılmasına dikkat edilmelidir.
/sbin
System binaries. Yalnızca root kullanıcısı tarafından çalıştırılabilecek programlar, /bin yerine burada tutulur.
/srv
/srv, sistem tarafından sunulan siteye özgü verileri içerir.
Bunun belirtilmesinin ana amacı, kullanıcıların belirli bir hizmetin veri dosyalarının bulunduğu yeri rahatlıkla bulabilmesi ve verilerin yalnızca okunabilir, yazılabilir veri ve script'ler için tek bir ağaç yapısına ihtiyaç duyan hizmetlerin mantıklı bir şekilde yerleştirilebilmesidir.
/tmp
Geçici dosyalar. Herhangi bir programın çalışması sırasında ya da bir kullanıcının birtakım işleri gerçekleştirmesi sırasında geçici olarak dosya oluşturması gerektiğinde, bu dizin kullanılır. Burada yer alan veriler, sistem yeniden başlatıldığında veya farklı şekillerde (belirli bir boyuta ulaşma, belirli bir sürenin geçmesi gibi) otomatik olarak silinir.
/var
Bu dizin, günlük verileri (log) ya da kullanıcıların lokal mail kutuları gibi değişken veri dosyalarını içerir.
/usr Hiyerarşisi
Dosya sistemindeki ikinci en büyük ağaç yapısı, /usr altında karşımıza çıkar.
İçinde - tıpkı root filesystem'da olduğu gibi - bin, lib, sbin gibi dizinler bulunur. Günümüz sistemlerinde /bin, /lib, /sbin dizinleri; /usr/bin, /usr/lib, /usr/sbin dizinlerine "linklenmiş" durumdadır. Yani aynı yeri gösterirler. Geriye dönük uyumluluğu sağlamaya devam edebilmek adına, bu linklemeler yapılmıştır.
/usr ağacında yer alan dizinler bunlarla sınırlı değildir.
/usr/include
Sistemin genelinde kullanılacak C programlama dili dosyaları bu dizinde yer alır.
/usr/share
/usr/share hiyerarşisi, tüm salt-okunur, mimariden bağımsız veri dosyalarını içindir. Herhangi bir program veya paket, değiştirilmeye ihtiyaç duymayan verileri içeriyor veya gerektiriyorsa, bu veriyi /usr/share dizininde saklamalıdır.
root
Linux dünyasında "root" kelimesi sıklıkla karşınıza çıkacak. "Kök" anlamına gelen bu ifade, farklı anlamlarda karşımıza çıkacak.
- root: Kullanıcı olan root. Sistemin en yetkili kullanıcısı.
- /: Dosya sisteminin başlangıç noktası (kökü) olan root. "/" karakteri ile ifade edilir.
- /root: root kullanıcısının ev dizini.