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.