Linux Dosya Sistemi Hiyerarşisi: FHS Rehberi

Linux sistemleri ilk kurduğumda her şeyin nerede olduğunu anlamak bana hep karmaşık gelirdi. /etc nedir, /var ne işe yarar, /usr ile /home arasındaki fark nedir? Yıllar içinde bunları öğrendikçe sistem yönetiminin ne kadar mantıklı bir yapı üzerine kurulu olduğunu gördüm. Bu yazıda Filesystem Hierarchy Standard (FHS) yani Linux Dosya Sistemi Hiyerarşisi’ni sysadmin gözüyle, gerçek dünya senaryolarıyla birlikte anlatacağım.

FHS Nedir ve Neden Önemlidir?

FHS, Linux ve Unix benzeri sistemlerde dizin yapısını standart hale getiren bir spesifikasyondur. Linux Foundation tarafından yönetilen bu standart, hangi dizinin ne amaçla kullanılacağını belirler. Peki neden bu kadar önemli?

Bir düşün: Bir sunucuya ilk kez bağlandığında hiç görmediğin bir sistemde bile log dosyalarının /var/log altında olduğunu biliyorsun. Yeni bir servis kurduğunda yapılandırma dosyasının /etc altında bir yerde olduğunu tahmin edebiliyorsun. İşte FHS bu tutarlılığı sağlıyor.

Gerçek dünyada FHS’yi bilmemenin bedeli ağır olabiliyor. Bir prodüksiyon sunucusunda disk dolunca /var partition’ının dolduğunu anlayamamak, log rotation yapmayı unutmak ya da /tmp ile /var/tmp arasındaki farkı bilmemek ciddi sorunlara yol açabiliyor.

# Mevcut dizin yapısını tek komutla görmek için
ls -la /

# Daha detaylı bir görünüm için
tree -L 1 / 2>/dev/null || find / -maxdepth 1 -type d | sort

Kök Dizin ve Temel Kavramlar

Her şey / yani kök dizininden başlar. Windows’taki C: gibi düşünebilirsin ama çok daha kapsamlı. Linux’ta tek bir kök dizin vardır ve her şey buraya bağlıdır. Harici diskler, USB sürücüler, ağ dosya sistemleri hepsi bu ağacın bir dalına mount edilir.

FHS’de dizinler iki temel eksen üzerinde sınıflandırılır:

  • Statik vs Dinamik: Statik içerik değişmez (binary dosyalar, kütüphaneler). Dinamik içerik sistem çalışırken değişir (log dosyaları, process ID dosyaları).
  • Paylaşılabilir vs Paylaşılamaz: Paylaşılabilir içerik NFS gibi mekanizmalarla ağdaki diğer sistemlerle paylaşılabilir. Paylaşılamaz içerik o makineye özgüdür (örneğin /etc/hostname).
# Hangi dosya sistemlerinin mount edildiğini görmek için
df -hT

# Belirli bir dizinin hangi partition'da olduğunu bulmak
df -h /var/log

Ana Dizinlerin Detaylı İncelemesi

/bin ve /sbin: Temel Komutlar

/bin dizini, sistemin çalışması için mutlaka gerekli olan temel kullanıcı komutlarını içerir. ls, cp, mv, cat, echo gibi komutlar burada yaşar. Modern dağıtımlarda /bin çoğunlukla /usr/bin‘e bir sembolik link haline gelmiştir.

/sbin ise sistem yöneticisi komutlarını içerir. fdisk, mkfs, ifconfig, reboot gibi root yetkisi gerektiren araçlar burada bulunur.

# /bin ve /sbin'in gerçekten semlink mi olduğunu kontrol et
ls -la / | grep -E "^l.*(bin|sbin|lib)"

# Hangi komutun nerede olduğunu bul
which ls
type ls
whereis bash

Gerçek dünya senaryosu: Sistemi kurtarma modunda başlattığında ya da minimal bir container image’ı incelediğinde hangi araçların temel, hangilerinin opsiyonel olduğunu anlamak kritik önem taşıyor.

/etc: Sistem Konfigürasyonlarının Kalbi

/etc muhtemelen en çok zaman geçirdiğin dizindir. Tüm sistem genelindeki yapılandırma dosyaları burada saklanır. Önemli olan şu: /etc içinde binary dosya bulunmaz, sadece konfigürasyon dosyaları ve scriptler vardır.

  • /etc/passwd: Kullanıcı hesap bilgileri
  • /etc/shadow: Şifrelenmiş parola bilgileri (sadece root okuyabilir)
  • /etc/fstab: Dosya sistemi mount noktaları
  • /etc/hosts: Statik hostname çözümlemeleri
  • /etc/crontab: Sistem geneli zamanlanmış görevler
  • /etc/sudoers: Sudo yetkilendirme kuralları
  • /etc/ssh/sshd_config: SSH sunucu yapılandırması
# /etc dizininde son 24 saatte değişen dosyaları bul
# Bu özellikle güvenlik audit'lerinde çok işe yarar
find /etc -mtime -1 -type f 2>/dev/null

# Bir konfigürasyon dosyasını düzenlemeden önce backup al
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup.$(date +%Y%m%d)

Sık yapılan hata: /etc/sudoers dosyasını direkt vi ile düzenlemek. Her zaman visudo kullan. Yanlış syntax girdiğinde visudo seni uyarır, aksi halde sudo erişimini kaybedebilirsin.

/var: Değişken Veriler

/var adını “variable” yani değişken kelimesinden alır. Sistem çalışırken sürekli değişen veriler burada tutulur. Disk yönetimi açısından en kritik dizinlerden biridir.

  • /var/log: Sistem log dosyaları
  • /var/spool: Mail, print kuyrukları gibi spool verileri
  • /var/cache: Uygulama cache verileri
  • /var/run (ya da /run): Çalışan process’lere ait PID dosyaları
  • /var/tmp: Reboot’lar arasında korunan geçici dosyalar
  • /var/lib: Uygulama durum bilgileri (örneğin MySQL, PostgreSQL verileri)
  • /var/www: Web sunucusu dosyaları (genellikle Apache için)
# /var/log altındaki en büyük dosyaları bul
du -sh /var/log/* | sort -rh | head -20

# Bugünkü auth loglarını takip et
tail -f /var/log/auth.log  # Debian/Ubuntu
tail -f /var/log/secure    # RHEL/CentOS

# /var disk kullanımını izle
watch -n 5 'df -h /var'

Gerçek dünya senaryosu: Prodüksiyon sunucusunda disk alarmı aldın. İlk baktığın yer /var olmalı. Log dosyaları şişmiş olabilir, bir uygulama hatalı çalışıyor ve sürekli log yazıyor olabilir ya da bir database transaction log’u kontrol edilmemiş büyümüş olabilir.

# Disk dolunca kimin suçlu olduğunu hızlıca bulmak için
du -sh /var/* 2>/dev/null | sort -rh | head -10
du -sh /var/log/* 2>/dev/null | sort -rh | head -10

/home: Kullanıcı Ev Dizinleri

Her kullanıcının kişisel dosyaları, shell konfigürasyonları ve uygulama ayarları /home/kullanici_adi altında saklanır. Gizli dosyalar (dotfiles) nokta ile başlar: .bashrc, .ssh, .config gibi.

# Ev dizinindeki gizli dosyaları görmek için
ls -la ~

# .bashrc'yi düzenleyip değişiklikleri hemen uygulamak
nano ~/.bashrc && source ~/.bashrc

# Bir kullanıcının ev dizini boyutunu kontrol et
du -sh /home/ahmet

# Tüm kullanıcı ev dizinlerinin boyutunu listele
du -sh /home/* | sort -rh

Dikkat: /home dizinini ayrı bir partition’a koymak iyi bir pratiktir. Böylece / partition’ı dolduğunda kullanıcılar birbirini etkilemez ve sistem kararlı çalışmaya devam eder.

/tmp: Geçici Dosyalar

/tmp geçici dosyalar için kullanılır ve reboot sonrası temizlenir. Çoğu modern sistemde /tmp bir tmpfs (RAM üzerinde sanal dosya sistemi) olarak mount edilir. Bu yüzden hem hızlıdır hem de disk yer kaplamaz.

/var/tmp ile farkı önemli: /var/tmp reboot’lar arasında korunur. Uzun süren bir işlem için geçici dosya oluşturuyorsan ve sistem restart alabilecekse /var/tmp daha güvenlidir.

# /tmp'nin nasıl mount edildiğini görmek için
mount | grep tmp
df -h /tmp

# Güvenli geçici dosya/dizin oluşturmak için
TMPFILE=$(mktemp)
TMPDIR=$(mktemp -d)
echo "Geçici dosya: $TMPFILE"
echo "Geçici dizin: $TMPDIR"

# İşin bitince temizle
rm -f "$TMPFILE"
rm -rf "$TMPDIR"

Güvenlik notu: Script yazarken geçici dosyaları mktemp ile oluştur, sabit isimler kullanma. Sabit isimli geçici dosyalar symlink saldırılarına açık olabilir.

/usr: Kullanıcı Programları ve Verileri

/usr tarihsel olarak “user” kısaltmasıydı ama günümüzde “Unix System Resources” anlamını taşıyor. Sistemin en büyük dizinlerinden biridir.

  • /usr/bin: Normal kullanıcı komutları (paket yöneticisi ile kurulanlar)
  • /usr/sbin: Sistem yöneticisi komutları
  • /usr/lib: Kütüphane dosyaları
  • /usr/local: Sisteme özel, paket yöneticisi dışında kurulan yazılımlar
  • /usr/share: Mimarlıktan bağımsız paylaşılan veriler (man sayfaları, dokümanlar)
  • /usr/include: C/C++ header dosyaları
# /usr/local altına manuel kurulum yapıldığında standart yapı şöyle olmalı
ls -la /usr/local/

# Paket yöneticisi dışında kurulan bir binary'i buraya koyabilirsin
# Örneğin özel bir monitoring aracı:
# sudo cp mymonitortool /usr/local/bin/
# sudo chmod +x /usr/local/bin/mymonitortool

# Hangi kütüphanenin nerede olduğunu bul
ldconfig -p | grep libssl

Önemli kural: Paket yöneticisi (apt, yum, dnf) ile kurulan yazılımlar /usr altına gider. Elle kurduğun, derleyip yüklediğin yazılımlar için /usr/local kullan. Bu iki alanı karıştırırsan paket yöneticisi güncellemeleri elle kurduğun dosyaların üzerine yazabilir.

/opt: Opsiyonel Yazılımlar

/opt büyük ticari yazılımlar veya bağımsız uygulama paketleri için kullanılır. Google Chrome, Oracle, bazı IDE’ler buraya kurulur. Her yazılım kendi alt dizinine sahiptir: /opt/google, /opt/oracle gibi.

# /opt dizin yapısını incele
ls -la /opt/

# Büyük enterprise yazılımlarının nerede kurulu olduğunu bul
find /opt -maxdepth 2 -name "*.sh" -o -name "bin" -type d 2>/dev/null | head -20

/proc ve /sys: Sanal Dosya Sistemleri

Bu iki dizin gerçek dosyalar içermez. Kernel ve process bilgilerine dosya arayüzü üzerinden erişim sağlarlar. Disk üzerinde yer kaplamaz, her şey RAM’de tutulur.

/proc Linux kernel tarafından oluşturulan sanal bir dosya sistemidir. Her çalışan process için /proc/PID altında bir dizin bulunur.

/sys (sysfs) donanım ve kernel parametrelerine erişim sağlar.

# Sistemin toplam RAM'ini /proc üzerinden oku
cat /proc/meminfo | head -5

# CPU bilgilerini görüntüle
cat /proc/cpuinfo | grep "model name" | uniq

# Çalışan bir process'in tam komutunu öğren (PID yerine gerçek PID yaz)
cat /proc/$(pgrep nginx | head -1)/cmdline | tr '' ' '

# Kernel parametrelerini /proc üzerinden anlık değiştir (reboot'ta kaybolur)
echo 1 > /proc/sys/net/ipv4/ip_forward

# Kalıcı kernel parametresi değişikliği için sysctl kullan
sysctl -w net.ipv4.ip_forward=1
# Kalıcı yapmak için /etc/sysctl.conf dosyasını düzenle

/dev: Cihaz Dosyaları

Linux’ta her şey bir dosyadır, donanım cihazları da dahil. /dev altında gerçek cihazlara erişim sağlayan özel dosyalar bulunur.

  • /dev/sda, /dev/sdb: SATA/SSD diskler
  • /dev/nvme0n1: NVMe diskler
  • /dev/tty: Terminal cihazları
  • /dev/null: Kara delik (her şeyi yutan, hiçbir şey döndürmeyen özel dosya)
  • /dev/zero: Sonsuz sıfır bayt üretir
  • /dev/random, /dev/urandom: Rastgele sayı üreticisi
# Block cihazları listele
lsblk

# /dev/null kullanımı (istenmeyen çıktıları bastırmak için)
komut > /dev/null 2>&1

# /dev/urandom ile güvenli rastgele şifre üret
cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 20 | head -1

# /dev/zero ile belirli boyutta test dosyası oluştur
dd if=/dev/zero of=/tmp/testfile bs=1M count=100

/boot: Önyükleme Dosyaları

Sistem başlatma için gerekli dosyalar burada bulunur. Kernel image’ları, initramfs ve bootloader konfigürasyonları bu dizinde yaşar.

  • /boot/vmlinuz: Sıkıştırılmış Linux kernel
  • /boot/initrd.img veya /boot/initramfs: Initial RAM disk
  • /boot/grub: GRUB bootloader dosyaları
# Mevcut kernel versiyonunu ve /boot içeriğini gör
uname -r
ls -lh /boot/

# Yüklü kernel'ları listele
dpkg --list | grep linux-image  # Debian/Ubuntu
rpm -qa | grep kernel           # RHEL/CentOS

/lib ve Kütüphane Dizinleri

/lib ve /lib64 temel sistem kütüphanelerini içerir. /bin ve /sbin içindeki programlar bu kütüphanelere bağımlıdır. Kernel modülleri de /lib/modules altında bulunur.

# Bir binary'nin hangi kütüphanelere bağımlı olduğunu görmek için
ldd /bin/ls

# Yüklü kernel modüllerini listele
lsmod

# Belirli bir modül hakkında bilgi al
modinfo ext4

Mount Noktaları ve Partition Stratejisi

FHS’yi anlamanın pratik yansıması doğru partition stratejisi oluşturmaktır. Kurumsal bir Linux sunucusu kurarken şu ayrımları yapmak iyi bir pratiktir:

  • /: Küçük tutulabilir, sadece temel sistem dosyaları
  • /var: Log ve dinamik veriler için ayrı partition (dolmaması kritik)
  • /home: Kullanıcı verileri için ayrı partition
  • /tmp: tmpfs olarak mount edilebilir (RAM kullanır, otomatik temizlenir)
  • /boot: Küçük, ayrı partition (500MB genellikle yeterli)
# Mevcut mount yapılandırmasını görüntüle
cat /etc/fstab

# Tüm mount noktalarını göster
findmnt

# Bir dizinin hangi cihazda mount edildiğini öğren
findmnt /var

Sembolik Linkler ve FHS

Modern Linux dağıtımları (özellikle systemd kullananlar) bazı dizinleri sembolik link haline getirmiştir:

# Günümüz sistemlerinde hangi dizinlerin semlink olduğunu gör
ls -la / | grep "^l"
# Örnek çıktı: /bin -> usr/bin, /lib -> usr/lib, /sbin -> usr/sbin

Bu birleştirme (UsrMerge olarak bilinen değişiklik) yazılım dağıtımını kolaylaştırmak ve tutarlılığı artırmak amacıyla yapılmıştır.

Güvenlik Perspektifinden FHS

FHS bilgisi güvenlik açısından da kritik önem taşıyor:

# SUID/SGID bit taşıyan dosyaları bul (güvenlik audit'i için)
find / -type f ( -perm -4000 -o -perm -2000 ) -exec ls -la {} ; 2>/dev/null

# World-writable dizinleri bul
find / -type d -perm -0002 -not -path "/proc/*" 2>/dev/null

# /tmp ve /var/tmp altındaki executable dosyaları kontrol et
find /tmp /var/tmp -type f -executable 2>/dev/null

Güvenlik hardening yaparken /tmp ve /var/tmp dizinlerini noexec, nosuid flagleriyle mount etmek yaygın bir pratiktir. Bu sayede bu dizinlere yazılıp execute edilmeye çalışılan zararlı dosyalar çalışamaz.

Sonuç

FHS’yi anlamak, Linux sistem yönetiminin temelini oluşturuyor. Bir sunucuya ilk bağlandığında nereye bakacağını bilmek, disk alarmı aldığında hangi dizini inceleyeceğini tahmin etmek, yeni bir yazılım kurarken dosyaları nereye koyacağına karar vermek hep bu bilgiye dayanıyor.

En önemli çıkarımları özetlemek gerekirse:

  • /etc değişmez konfigürasyonlar için, dokunmadan önce backup al
  • /var büyür ve dolar, ayrı partition’da tut ve log rotation yapılandır
  • /tmp uçucudur, kalıcı veriler için kullanma
  • /usr/local elle kurduğun yazılımlar için, paket yöneticisi ile çakışmaz
  • /proc ve /sys sanal dosya sistemleridir, kernel ile iletişim kanalın

Yıllar içinde FHS’yi içselleştirince yeni bir sisteme oturduğunda veya acil bir problem yaşadığında ne yapacağını bilmek çok daha doğal hale geliyor. Her dizin bir hikaye anlatıyor ve o hikayeyi okuyabilmek sysadmin’in en değerli becerileri arasında.

Yorum yapın