Linux Filesystem: Bu Dizinler Bize Aslında Ne Anlatıyor?

★ featured

Linux sistemlerle bir süre vakit geçirdikten sonra fark edilen şeylerden biri şudur: filesystem yalnızca dosyaların tutulduğu bir yapı değildir. Daha doğru bir ifadeyle sistemin nasıl çalıştığını anlatan bir modeldir.

İlk bakışta /etc, /var, /proc gibi dizinler sadece birer klasör gibi görünür. Bu dizinlerin ne işe yaradığını ezberlemek mümkündür ve çoğu kaynak da bu şekilde öğretir ancak bu yaklaşım gerçek bir sistemle karşılaşıldığında yetersiz kalır. Zamanla sorular değişir. “Bu dosya nerede?” sorusu yerini “Bu dosya neden burada?” sorusuna bırakır. Bu ikinci soruya cevap veremeyen bir bakış açısı özellikle troubleshooting sırasında yanlış yerlere bakmaya ve zaman kaybına neden olur.

Filesystem’i anlamak dizinleri ezberlemekten çok onların neyi temsil ettiğini kavramaktır. Bu yazıda her dizini tek tek tanımlamak yerine her birinin sistem içinde hangi katmana karşılık geldiğini anlamaya çalışacağız.


/ - Tek bir ağaç yapısı

Linux’ta her şey / altında başlar. Windows sistemlerde olduğu gibi C:\, D:\ gibi ayrı disk yapıları yoktur. Bunun yerine tek bir ağaç yapısı vardır ve bu yapının kökü /’dür. Sisteme bağlı olan tüm diskler, partition’lar ve network filesystem’ler bu ağacın bir noktasına bağlanır.

Bu yapı önemli bir şeyi beraberinde getirir: / fiziksel bir diski temsil etmez. Erişilebilir olan her şeyin birleştiği mantıksal noktadır.

Bu yüzden / altındaki dizinleri “klasör” olarak görmek eksik bir yaklaşımdır. Daha doğru bir yaklaşım her dizini sistemin belirli bir ihtiyacını karşılayan bir katman olarak görmektir. Bu katmanları anlamaya başladığınızda filesystem anlam kazanmaya başlar.

/etc — Sistem nasıl davranmalı?

/etc sistemin konfigürasyon katmanıdır. Burada programların kendisi değil, nasıl çalışacaklarına dair kurallar bulunur.

Örnek olarak:

  • /etc/ssh/sshd_config -> SSH nasıl davranacak
  • /etc/nginx/nginx.conf -> Web server nasıl çalışacak
  • /etc/fstab -> Hangi filesystem’ler mount edilecek

Bu dosyalar küçük gibi görünebilir ama etkileri olduça büyüktür. Tek bir parametre değişikliği servisin tamamen farklı davranmasına neden olabilir.

Buradaki kritik nokta şu: /etc altında genellikle executable binary bulunmaz. Çünkü bu dizin bir şeyi çalıştırmak için değil, çalışan şeyin nasıl davranacağını belirlemek için vardır.

Gerçek sistemlerde sık yapılan hatalardan biri problemi yanlış katmanda aramaktır. Bir servis beklenildiği gibi çalışmıyorsa çoğu zaman binary’ye odaklanılır. Oysa sorun genellikle konfigürasyondadır. Yani /etc tarafındadır.

Bu yüzden /etc yalnızca config dosyalarının olduğu bir yer değil, sistemin “nasıl davranması gerektiğini” tanımlayan katmandır.

/var - Sistem ne yaptı?

Sistem davranışını tanımladıktan sonra geriye şu soru kalır: sistem çalışırken oluşan veriler nerede tutulur?

Cevap: /var.

İsmi “variable” kelimesinden gelir. Sistem çalıştığı sürece oluşan ve sürekli değişen her şey burada tutulur.

  • /var/log -> Loglar
  • /var/lib -> Uygulamaların state bilgileri
  • /var/cache -> Cache verileri
  • /var/spool -> Kuyruklanan işler

/var sistemin geçmişidir. Bir şeyin neden bozulduğunu anlamaya çalışırken çoğu zaman cevap burada bulunur. Sistemin ne yaptığını, hangi hataları verdiğini ve hangi işlemlerden geçtiğini burada görürüz.

Özellikle /var/log, troubleshooting sırasında ilk bakılması gereken yerlerden biridir. Ancak asıl kritik dizin çoğu zaman /var/lib’tir. Birçok uygulama için burası doğrudan uygulamanın kalıcı durumudur. Container’lar, paket yöneticileri ve çeşitli servisler state bilgilerini burada tutar.

Bu dizinin önemi genelde bir şeyler silindiğinde anlaşılır. /var/lib altındaki veriler bilinçsizce silindiğinde uygulama “resetlenmiş” gibi davranır çünkü hafızasını kaybetmiştir.

Bu yüzden /var yalnızca logların olduğu bir yer değil, sistemin geçmişini ve durumunu taşıyan katmandır.

/proc - Kernel şu an ne durumda?

/var bize sistemin geçmişini gösterir. /proc ise sistemin o anki durumunu.

Ancak /proc klasik bir filesystem değildir. Disk üzerinde bulunmaz, kernel tarafından runtime sırasında oluşturulan bir arayüzdür. Buradaki dosyalar saklanan veri değil, okunduğu anda üretilen bilgilerdir.

Örnekler:

  • /proc/cpuinfo -> CPU bilgileri
  • /proc/meminfo -> Bellek durumu
  • /proc/loadavg -> Load average
  • /proc/uptime -> Sistem çalışma süresi

Bu dosyaların her okunduğunda farklı değer döndürmesi onların statik olmadığını gösterir.

/proc’un en önemli özelliklerinden biri process bazlı bilgi sunmasıdır. Her process kendi PID’si altında temsil edilir:

  • /proc/<pid>/fd -> Açık file descriptor’lar
  • /proc/<pid>/cmdline -> Process nasıl başlatılmış

Birçok araç bu bilgileri doğrudan buradan okur. ps, top gibi araçlar aslında /proc’un sunduğu veriyi yorumlayarak gösterir.

Bu katmanı anlamamak bazı durumlarda yanlış yorumlara neden olur. Örneğin load average değeri yüksekken CPU kullanımı düşük olabilir. Bu durum CPU problemi değil, IO bekleyen process’lerin artmış olabileceğini gösterir. Bu ayrımı doğru yapabilmek için /proc’un sunduğu verinin ne anlama geldiğini bilmek gerekir.

/dev - Donanım ile iletişim

Linux’ta donanım bileşenleri doğrudan erişilen yapılar değildir. Kernel, donanım ile kullanıcı alanı arasında bir katman oluşturur ve bu katmanı /dev altında dosyalar olarak sunar. Yani /dev altındaki yapılar donanımın kendisi değil, donanıma erişmek için kullanılan arayüzlerdir.

Örneğin:

  • /dev/sda -> Disk
  • /dev/sda1 -> Partition
  • /dev/null -> Yazılan veriyi yok eder
  • /dev/zero -> Sürekli sıfır üretir
  • /dev/tty -> Terminal

Bu dosyalar veri saklamaz. Kernel ile donanım arasında bir arayüz görevi görür.

/dev dizini genellikle dinamik olarak oluşturulur. Sistem açıldığında udev gibi mekanizmalar tarafından mevcut donanıma göre yeniden şekillenir. Bu da sistemdeki değişikliklerin doğrudan filesystem’e yansımasını sağlar.

Bu katmanda yapılan hatalar genellikle ciddi sonuçlar doğurur. Yanlış bir device’a yazmak doğrudan veri kaybına neden olabilir. Bu yüzden /dev ile çalışırken yapılan işlemin hedefi net olarak bilinmelidir.

/usr - Sistem bileşenleri

İsmi kullanıcıyı çağrıştırsa da /usr dizini kullanıcı verilerinden çok sistem bileşenlerini içerir.

  • /usr/bin -> Kullanıcı komutları
  • /usr/sbin -> Sistem araçları
  • /usr/lib -> Kütüphaneler
  • /usr/share -> Architecture bağımsız dosyalar

Geçmişte /bin ve /usr/bin arasında işlevsel bir ayrım vardı. /bin sistemin erken aşamada ihtiyaç duyduğu temel komutları içerirken, /usr/bin daha sonra kullanılan araçları barındırırdı. Bunun sebebi /usr dizininin ayrı bir partition olabilmesi ve boot sırasında henüz mount edilmemiş olabilmesiydi.

Modern sistemlerde bu ayrım büyük ölçüde ortadan kalkmıştır. Çoğu dağıtımda /bin, /sbin gibi dizinler /usr altına taşınmış ve geriye yalnızca sembolik bağlantılar bırakılmıştır.

Bu yaklaşım sistemin daha sade ve tutarlı hale gelmesini sağlar. Artık bir binary’nin hangi aşamada kullanılacağı filesystem üzerinden değil, sistemin boot süreci tarafından belirlenir.

/usr dizini bu nedenle sistemin büyük kısmının bulunduğu katman haline gelmiştir ve genellikle paket yöneticisi tarafından yönetilir. Bu da manuel müdahalelerin minimumda tutulmasını gerektirir.

/home - Kullanıcı alanı

/home kullanıcıya ait verilerin bulunduğu dizindir. Her kullanıcı için ayrı bir dizin oluşturulur.

  • /home/kullanici -> Kullanıcı dosyaları
  • .bashrc, .profile, .ssh/ -> Kullanıcı ayarları

Bu dizin yalnızca dosyaların tutulduğu bir yer değildir. Aynı zamanda kullanıcının sistemle nasıl etkileşime girdiğini belirler.

Root kullanıcısı bu yapının dışında yer alır ve onun home dizini /root altındadır. Bu ayrım, root’un sistemdeki ayrıcalıklı konumunu yansıtır.

/run - Anlık runtime durumu

/run sistem çalıştığı sürece gerekli olan geçici verileri tutar. Genellikle RAM üzerinde bulunur ve sistem yeniden başlatıldığında temizlenir.

Bu dizin altında:

  • PID dosyaları
  • Socket’lar
  • Geçici servis bilgileri

bulunur.

Bu dizin küçük görünse de pratikte oldukça önemlidir. Bir servisin gerçekten çalışıp çalışmadığını anlamak için kullanılan bilgiler çoğu zaman burada tutulur. Örneğin bir servis çalışmıyor olabilir ancak /run altında eski bir PID dosyası kaldığı için sistem servisi çalışıyor sanabilir.

Bu tür durumlarda problem binary’de ya da config’te değil, runtime state’tedir. Yani /run katmanındadır.

/tmp - Geçici alan

/tmp uygulamaların geçici dosyalar oluşturduğu dizindir. Genellikle tüm kullanıcılar tarafından yazılabilir durumdadır ve çoğu sistemde reboot sonrası temizlenir.

Bu dizinde sticky bit bulunur. Bu sayede bir kullanıcı başka bir kullanıcının dosyasını silemez.

/tmp çoğu zaman göz ardı edilir ancak dolduğunda sistemde beklenmedik hatalara neden olabilir. Uygulamaların dosya oluşturamaması, installer’ların başarısız olması veya bazı servislerin başlatılamaması gibi durumlar çoğu zaman bu dizinle ilişkilidir.

/boot - Başlangıç noktası

/boot sistem henüz çalışmaya başlamadan önce devreye giren dizindir. Kernel image’ları, initramfs ve bootloader ile ilgili dosyalar burada bulunur.

Sistem açılırken ilk okunan veriler bu dizindedir. Kernel yüklendikten sonra diğer filesystem’ler mount edilir ve sistem normal çalışma moduna geçer.

Bu dizinle günlük kullanımda çok fazla etkileşim olmaz ancak burada yapılacak hatalar sistemin hiç açılmamasına neden olabilir.


Filesystem’i katman olarak okumak

Linux filesystem’i yalnızca dizinlerin ne işe yaradığını bilmekten ibaret değildir. Daha anlamlı bir yaklaşım, bu dizinleri sistemin farklı katmanları olarak değerlendirmektir.

  • /usr -> Sistem neyden oluşuyor
  • /etc -> Sistem nasıl davranmalı
  • /var -> Sistem ne yaptı
  • /run -> Sistem şu an ne yapıyor
  • /proc -> Kernel şu an ne durumda
  • /dev -> Donanıma nasıl erişiliyor

Bu ayrım ilk bakışta teorik gibi görünebilir ama pratikte doğrudan karşılığı vardır. Bir problemle karşılaşıldığında asıl soru “hangi dosya nerede?” değil, “hangi katmanda sorun var?” sorusudur.

Servis çalışıyor ama beklenen davranışı göstermiyorsa /etc tarafına bakılır.
Bir şeylerin neden bozulduğunu anlamak için /var incelenir.
Sistem şu an ne yapıyor sorusu /run ve /proc üzerinden cevaplanır.
Donanım ile ilgili bir problemde /dev devreye girer.

Filesystem bu şekilde okunduğunda bir klasör yapısından çok, sistemin nasıl organize edildiğini anlatan bir haritaya dönüşür. Bu harita anlaşıldığında daha önce hiç görülmemiş bir sistemde bile nereden başlanacağı genelde bellidir.

Linux’ta zaten çoğu şey rastgele değildir. Filesystem de buna dahil.