Disk Kullanımı Analizi: df ve du Komutları

Disk doldu uyarısı aldığında paniğe kapılmak yerine terminali açıp birkaç komut çalıştırmanın ne kadar hayat kurtarıcı olduğunu bilen biri olarak şunu söyleyebilirim: df ve du komutlarını gerçekten öğrenmek, sysadmin kariyerinin en iyi yatırımlarından biridir. Her gece 3’te gelen “disk full, uygulama çöktü” alarmlarını bu iki komut sayesinde öngörmeye ve önlemeye başladım. Gelin bu komutları derinlemesine inceleyelim.

df Komutu: Dosya Sistemi Kullanım Özeti

df (disk free) komutu, sisteminizde mount edilmiş tüm dosya sistemlerinin disk kullanım bilgilerini gösterir. Partition bazlı çalışır ve genel bir bakış açısı sunar.

Temel Kullanım

df

Bu komut çıktısı varsayılan olarak 1KB bloklar halinde gelir ve okunması biraz zordur. Gerçek hayatta neredeyse hiç bu şekilde kullanmam.

df -h

-h parametresi (human-readable) çıktıyı GB, MB, KB gibi okunabilir formatlara çevirir. Günlük kullanımda hep bu şekilde çalışırım.

Örnek çıktı:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        50G   38G  9.2G  80% /
/dev/sdb1       200G  145G   45G  73% /data
tmpfs           3.9G  1.2G  2.7G  31% /dev/shm

df Parametreleri

-h: Boyutları insan tarafından okunabilir formatta gösterir (K, M, G, T)

-H: -h gibi çalışır ama 1024 yerine 1000 bazlı hesaplar

-T: Dosya sistemi tipini gösterir (ext4, xfs, tmpfs vb.)

-i: Inode kullanımını gösterir, bu çok kritik bir parametre

-a: Tüm dosya sistemlerini gösterir, sanal olanlar dahil

–total: Tüm satırların toplamını en alta ekler

-x tmpfs: Belirli dosya sistemi tipini hariç tutar

-t ext4: Sadece belirtilen tipte dosya sistemlerini gösterir

Inode Sorunu: Gizli Disk Doluluğu

Disk kullanımı analizinde sık atlanan kritik bir konu var: inode tükenmesi. Bir partition’da fiziksel alan kalmış olsa bile inode’lar bittiğinde yeni dosya oluşturamazsınız. Bu durumu yaşayanlar bilir, debug etmesi oldukça kafa karıştırıcıdır.

df -i
Filesystem      Inodes  IUsed   IFree IUse% Mounted on
/dev/sda1      3276800  890234 2386566   28% /
/dev/sdb1     13107200 9876543  230657   98% /var

Yukarıdaki örnekte /var partition’ının inode kullanımı %98’e ulaşmış. Bu genellikle çok sayıda küçük dosya oluşturan uygulamalarda görülür: mail spool dizinleri, PHP session dosyaları, temp dosyaları, log rotate edemeyen servisler.

# Belirli bir dizindeki inode kullanımını analiz et
df -i /var

Dosya Sistemi Tipini Görmek

df -Th

Bu komut hem tipi hem de okunabilir boyutları gösterir. Özellikle NFS mount noktalarını, tmpfs alanlarını ve farklı partition tiplerini ayırt etmek istediğimde kullanırım.

du Komutu: Dizin Bazlı Kullanım Analizi

du (disk usage) komutu df‘ten farklı olarak dosya ve dizin bazında disk kullanımını gösterir. Asıl sorunun nerede olduğunu bulmak için du şarttır. “Disk doldu, kim kullanıyor?” sorusunun cevabı burada.

Temel Kullanım

du /home/kullanici

Bu komut /home/kullanici altındaki her dizini ve alt dizini listeler, 1KB bloklar halinde. Çıktı genellikle çok uzun olur.

du -h /home/kullanici

-h parametresiyle okunabilir format elde ederiz.

du Parametreleri

-h: Human-readable format (K, M, G)

-s: Sadece toplamı gösterir, her alt dizini değil

-a: Dizinlerin yanı sıra dosyaları da listeler

-c: Sonuna genel toplam ekler

–max-depth=N: Kaç seviye derinliğe ineceğini belirler, N=1 sadece birinci seviye

-x: Farklı dosya sistemlerine geçmez, mount noktalarını atlar

–exclude=PATTERN: Belirtilen desene uyan dosyaları hariç tutar

–apparent-size: Gerçek disk bloğu yerine dosyanın görünen boyutunu kullanır

-L: Sembolik linkleri takip eder

–time: Her dizin için son değişiklik zamanını gösterir

Pratik du Kullanımları

Bir dizinin toplam boyutunu öğrenmek:

du -sh /var/log

Bir dizinin birinci seviye alt dizinlerini boyuta göre listelemek:

du -h --max-depth=1 /var | sort -rh

Bu komut kombinasyonu gerçek anlamda hayat kurtarır. /var altında hangi dizinin ne kadar yer kapladığını sıralı şekilde görürsünüz:

4.2G    /var
2.1G    /var/log
980M    /var/lib
450M    /var/cache
380M    /var/spool

Home dizinlerinde kimin ne kadar yer kapladığını görmek:

du -sh /home/* | sort -rh

Gerçek Dünya Senaryoları

Senaryo 1: “Disk Doldu” Alarmı

Sabah 6’da monitoring’den alarm geldi, production sunucuda / partition’ı %95’e ulaşmış. Şu sırayla ilerlerim:

# Önce genel duruma bak
df -h

# Hangi partition sorunlu?
# /var doluysa oraya gir
du -h --max-depth=1 /var | sort -rh

# Log dizini şüpheli görünüyorsa
du -h --max-depth=2 /var/log | sort -rh

# En büyük dosyaları bul
find /var/log -type f -size +100M -exec ls -lh {} ;

Bu yaklaşımla genellikle 5 dakika içinde suçluyu buluyorum. Çoğunlukla şunlardan biri çıkar:

  • Rotate edilmemiş uygulama logları
  • Core dump dosyaları
  • Yedek scriptlerinin bıraktığı geçici dosyalar
  • MySQL/PostgreSQL binary log’ları

Senaryo 2: Inode Tükenmesi Debug

Bir uygulama “No space left on device” hatası veriyor ama df -h gayet güzel görünüyor. Hemen inode kontrolüne geçiyorum:

df -i

# Hangi dizinde çok sayıda küçük dosya var?
find /var -xdev -printf '%hn' | sort | uniq -c | sort -rn | head -20

Bu find komutu her dosyanın bulunduğu dizini yazdırır, ardından hangi dizinde kaç dosya olduğunu sayarız. PHP session dizinleri, Postfix mail kuyrukları ve /tmp dizinleri bu analizde genellikle birinci çıkar.

Senaryo 3: Büyük Dosyaları Bulma

Bazen belirli büyüklüğün üzerindeki dosyaları bulmak gerekir:

# 500MB'dan büyük dosyaları bul
find / -xdev -type f -size +500M -exec ls -lh {} ; 2>/dev/null

# 1GB'dan büyük dosyaları bul ve boyuta göre sırala
find / -xdev -type f -size +1G 2>/dev/null | xargs ls -lh | sort -k5 -rh

-xdev parametresi kritik: farklı dosya sistemlerine, özellikle NFS mount noktalarına geçmesini engeller. Aksi halde uzak sunucularda da arama yapabilir ve ciddi performans sorununa yol açabilir.

Senaryo 4: Disk Kullanım Raporu Hazırlama

Haftalık kapasiteli planlama için kullanıcı bazlı disk kullanım raporu:

#!/bin/bash
echo "=== Disk Kullanim Raporu - $(date) ==="
echo ""
echo "--- Dosya Sistemi Ozeti ---"
df -h --total

echo ""
echo "--- Kullanici Bazli Home Dizin Kullanimi ---"
du -sh /home/* 2>/dev/null | sort -rh

echo ""
echo "--- En Buyuk 10 Dizin (root altinda) ---"
du -h --max-depth=2 / 2>/dev/null | sort -rh | head -10

echo ""
echo "--- Inode Kullanimi ---"
df -i

Bu scripti cron’a ekleyip haftalık mail olarak almak, kapasite planlamasını çok daha kolay hale getirir.

df ve du Kombinasyonu: Gelişmiş Kullanım

Belirli Dosya Sistemlerini Hariç Tutma

Sistemde çok sayıda tmpfs, devtmpfs gibi sanal dosya sistemi varsa çıktı karmaşık görünür:

df -h -x tmpfs -x devtmpfs -x squashfs

Bu parametre kombinasyonu özellikle Ubuntu/Snap kullanan sistemlerde çok sayıda squashfs mount noktasını filtreler, çıktıyı çok daha temiz yapar.

NFS ve Network Dosya Sistemleri

NFS mount noktalarında du çalıştırmak hem yavaş hem de remote sunucuya yük bindirir. du kullanırken -x parametresini ihmal etmeyin:

# Sadece local dosya sistemlerinde çalış
du -sh --exclude-from=/proc/mounts -x /

Veya daha pratik:

# Mount noktalarını atla
du -sx /*

ncdu: Terminal’de Görsel Disk Analizi

du çıktılarını okumak bazen zahmetli olabilir. ncdu (ncurses du) kurulu olan sistemlerde çok daha kullanışlı bir arayüz sunar:

# ncdu kur
apt install ncdu    # Debian/Ubuntu
yum install ncdu    # CentOS/RHEL

# Kullan
ncdu /var

ncdu interaktif bir arayüz sunar, ok tuşlarıyla dizinler arasında gezebilir, hangi dizinin ne kadar kapladığını anında görebilirsiniz. Production dışı sistemlerde kesinlikle tavsiye ederim.

Disk Kullanımını İzleme: watch ile Kombinasyon

Bir backup işlemi veya büyük dosya kopyalama sırasında disk kullanımını canlı izlemek için:

watch -n 5 df -h

Her 5 saniyede bir df -h çıktısını günceller. Büyük veri taşıma operasyonlarında ne zaman biteceğini tahmin etmek için kullanışlıdır.

# Belirli bir dizinin büyümesini izle
watch -n 10 'du -sh /var/log'

Sık Yapılan Hatalar ve İpuçları

Hata 1: du’yu Root Dizininde -x Olmadan Çalıştırmak

# YANLIS - NFS mount'larına da girer, çok yavaş olabilir
du -sh /

# DOGRU - Sadece local filesystem
du -sx /

Hata 2: Silinmiş ama Açık Dosyaları Gözden Kaçırmak

Bu klasik bir tuzak: Bir dosyayı sildiniz, du ile de kontrol ettiniz, alan hala dolmuş görünüyor. Sebebi şu: Bir process o dosyayı hala açık tutuyor olabilir ve kernel alan serbest bırakmıyor.

# Silinmiş ama hala açık olan dosyaları göster
lsof | grep deleted

# Daha temiz görünüm
lsof | grep "(deleted)" | awk '{print $1, $2, $7, $8, $9}'

Genellikle log rotate sonrası servisi yeniden başlatmak çözüm olur:

# Nginx örneği
nginx -s reopen
# veya
kill -HUP $(cat /var/run/nginx.pid)

Hata 3: Symbolic Link’lerin Boyutunu Yanlış Okumak

Sembolik linkler gerçek dosya boyutunu göstermez. du varsayılan olarak linklerin işaret ettiği yere gitmeye çalışmaz ama dikkatli olmak gerekir:

# Symlink boyutunu görmezden gel (varsayılan)
du -h /path/to/dir

# Symlink'lerin işaret ettiği dosyaları da say (-L ile)
du -hL /path/to/dir

İpucu: Quota Kontrolü

Kullanıcı bazlı disk kotası yönetiyorsanız quota komutlarıyla birlikte kullanmak daha sağlıklı sonuç verir, ama hızlı bir bakış için:

# Belirli kullanıcının tüm dosyalarının toplam boyutu
find / -user kullanici_adi -xdev 2>/dev/null | du -sh --files0-from=- 2>/dev/null

Disk Kullanımı İçin Monitoring ve Alerting

Manuel kontrol yetmez, otomatize etmek şart. Basit bir bash scripti:

#!/bin/bash
ESIK=85
HOSTNAME=$(hostname)

df -h | grep -vE '^Filesystem|tmpfs|cdrom|udev' | awk '{ print $5 " " $6 }' | while read output;
do
  KULLANIM=$(echo $output | awk '{ print $1}' | cut -d'%' -f1)
  PARTITION=$(echo $output | awk '{ print $2 }')
  
  if [ $KULLANIM -ge $ESIK ]; then
    echo "UYARI: $HOSTNAME sunucusunda $PARTITION partition'i $KULLANIM% dolu!" | 
    mail -s "Disk Uyarisi: $HOSTNAME" [email protected]
  fi
done

Bu scripti /etc/cron.d/disk-check olarak her saat başı çalıştırın. Gece 3’teki alarmlardan bu şekilde kaçının.

Sonuç

df ve du komutları sysadmin’in temel alet çantasının vazgeçilmez parçaları. df ile sisteme kuşbakışı bakıp hangi partition’ın dolduğunu görürsünüz, ardından du ile cerrahi hassasiyette aşağı inerek asıl sorunu tespit edersiniz. Bu iki komutun parametrelerini ve özellikle sort -rh kombinasyonunu ezberlemek, disk sorunlarını çözme sürenizi dramatik şekilde kısaltır.

Pratik önerim şu: Bu komutları gerçek sunucularda, gerçek senaryolarda kullanın. du -h --max-depth=1 / | sort -rh komutunu her disk alarmında refleks olarak çalıştırır hale gelmek için biraz pratik yeterli. Bir de silinmiş ama açık tutulan dosyaların sorununu yaşadıktan sonra lsof | grep deleted komutunu asla unutmayacaksınız, bunu garanti ederim.

Son olarak, inode tükenmesini de gözden kaçırmayın. Disk doluymuş gibi davranan ama aslında inode bitmiş bir sistemi ilk kez debuglarken kafa karıştırıcı olabiliyor. df -i komutu bu kontrolün standart rutinine dahil edilmeli.

Yorum yapın