df Komutu ile Disk Kullanımını İzleme ve Analiz
Sysadmin hayatında en sık karşılaşılan problemlerden biri disk doluluğudur. Sabahın üçünde seni uyandıran alert’in arkasında çoğunlukla patlamış bir disk bölümü vardır. İşte bu yüzden df komutu, günlük araç kutunuzun vazgeçilmez bir parçası olmalı. Basit görünüyor, ama doğru kullanıldığında çok güçlü bir araç.
Bu yazıda df komutunu her açısıyla ele alacağız. Temel kullanımdan ileri seviye senaryolara, script entegrasyonundan monitoring sistemlerine kadar geniş bir perspektif sunacağım.
df Nedir ve Ne İşe Yarar?
df (disk free) komutu, Linux ve Unix tabanlı sistemlerde bağlı dosya sistemlerinin disk kullanım bilgilerini gösterir. Komutu çalıştırdığınızda şu bilgileri alırsınız:
- Toplam alan
- Kullanılan alan
- Kullanılabilir alan
- Kullanım yüzdesi
- Bağlama noktası (mount point)
Komutun temel mantığı, statfs() sistem çağrısına dayanır. Yani doğrudan dosya sisteminden bilgi alır, disk üzerindeki dosyaları tek tek saymaz. Bu yüzden son derece hızlıdır.
Temel Kullanım
En basit haliyle sadece df yazıp çalıştırabilirsiniz:
df
Çıktı şöyle görünür:
Filesystem 1K-blocks Used Available Use% Mounted on
udev 4018236 0 4018236 0% /dev
tmpfs 806776 1892 804884 1% /run
/dev/sda1 51343360 8234512 40474716 17% /
/dev/sdb1 206290904 45234512 150478716 24% /data
Bu çıktı kilobayt cinsinden olduğu için okunması biraz zor. İşte burada -h bayrağı devreye giriyor.
En Çok Kullandığım Bayraklar
İnsan Okunabilir Format: -h
df -h
Filesystem Size Used Avail Use% Mounted on
udev 3.9G 0 3.9G 0% /dev
tmpfs 788M 1.9M 787M 1% /run
/dev/sda1 49G 7.9G 39G 17% /
/dev/sdb1 197G 44G 144G 24% /data
Bu format çok daha okunaklı. GB, MB, TB gibi otomatik birim kullanır.
Belirli Bir Dizinin Disk Bilgisi
Hangi dosya sisteminde olduğunu bilmediğiniz bir dizinin disk kullanımını görmek için:
df -h /var/log
df -h /home
df -h /tmp
Bu özellikle NFS bağlantıları ve birden fazla bölümleme yapısı olan sistemlerde çok işe yarıyor. /home ayrı bir partition’daysa direk oraya ait bilgiyi görürsünüz.
Dosya Sistemi Tipini Gösterme: -T
df -hT
Filesystem Type Size Used Avail Use% Mounted on
udev devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs tmpfs 788M 1.9M 787M 1% /run
/dev/sda1 ext4 49G 7.9G 39G 17% /
/dev/sdb1 xfs 197G 44G 144G 24% /data
/dev/sdc1 btrfs 500G 120G 380G 24% /backup
ext4, xfs, btrfs, tmpfs, nfs gibi dosya sistemi tiplerini görmek, özellikle performans sorunlarını debug ederken kritik bilgi sağlar.
Sadece Belirli Tip Dosya Sistemlerini Gösterme: -t ve -x
# Sadece ext4 dosya sistemlerini göster
df -h -t ext4
# tmpfs ve devtmpfs hariç hepsini göster
df -h -x tmpfs -x devtmpfs
İkinci kullanım çok pratik. Sanal dosya sistemlerini ekrandan atar, sadece gerçek disk bölümlerini görürsünüz. Monitoring script’lerinde sıkça kullanılan bir pattern.
Inode Kullanımını Gösterme: -i
df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 3276800 234567 3042233 8% /
/dev/sdb1 13107200 891234 12215966 7% /data
Inode dolulugu cok gozden kacirilan bir problemdir. Disk alanınız bolca olduğu halde “No space left on device” hatası alıyorsanız, inode tükenmiş olabilir. Çok sayıda küçük dosya üreten uygulamalar (mail sunucuları, cache sistemleri, log rotasyon problemleri) inode havuzunu bitirebilir.
Gercek Dunya Senaryolari
Senaryo 1: Disk Doluluk Alarmı Geldi, Ne Yapıyorum?
Gecenin bir yarısı Slack’e alarm düştü: /var partition'u %95 dolu. İşte tam bu anda izlediğim adımlar:
# Önce genel duruma bak
df -h
# /var özelinde bak
df -h /var
# Hangi dosya sistemi tipinde olduğunu anla
df -hT /var
# Inode durumunu da kontrol et
df -i /var
Disk doluluk problemlerinde df sadece başlangıç noktası. Hangi dizinin ne kadar yer kapladığını bulmak için du komutuna geçersiniz. Ama df ile önce hangi partition’ın problemli olduğunu tespit edersiniz.
Senaryo 2: NFS Mount Kontrolü
Kurumsal ortamlarda NFS bağlantıları sık kullanılır. NFS’in gerçekten bağlanıp bağlanmadığını ve ne kadar yer kaldığını kontrol etmek için:
# NFS mount noktalarını filtrele
df -h -t nfs -t nfs4
# Tüm network dosya sistemleri
df -h -t nfs -t nfs4 -t cifs -t smbfs
Eğer NFS bağlantısı kopuksa bu komut donabilir. Bunun için --no-sync veya timeout ile birlikte kullanmak gerekebilir. Production’da dikkatli olun.
Senaryo 3: Capacity Planning İçin Anlık Rapor
Aylık kapasite raporlaması yapıyorsanız şu script işinizi görür:
#!/bin/bash
# Basit disk kapasite raporu
echo "=== Disk Kapasite Raporu - $(date) ==="
echo ""
echo "Kritik Durumlar (>80% dolu):"
df -h -x tmpfs -x devtmpfs | awk 'NR==1 || int($5) > 80 {print}'
echo ""
echo "Tum Disk Kullanimi:"
df -h -x tmpfs -x devtmpfs
Bu script’i cron’a eklersiniz ve her gün sabah mail olarak alırsınız.
Ileri Seviye Kullanım
Özel Blok Boyutu ile Gösterim
Bazen GB veya MB cinsinden sabit blok boyutu isteyebilirsiniz:
# Megabyte cinsinden
df -m
# Gigabyte cinsinden (GNU df'de)
df --block-size=G
# Terabyte cinsinden
df --block-size=T
Bu özellikle büyük depolama sistemlerini raporlarken tutarlı birim kullanmak için işe yarar.
Sadece Yerel Dosya Sistemleri: -l
df -hl
NFS, CIFS gibi uzak bağlantıları hariç tutar. Sadece yerel diskleri listeler. Timeout riski olan ortamlarda güvenli bir seçenek.
Çıktıyı Parçalamak ve İşlemek
df çıktısını awk, grep, sort ile birleştirerek çok güçlü sorgular yazabilirsiniz:
# Sadece kullanım yüzdesini ve mount point'i göster
df -h | awk 'NR>1 {print $5, $6}' | sort -rn
# %70 üzeri dolu olanları listele
df -h | awk 'NR>1 && int($5) >= 70 {printf "%-30s %s dolun", $6, $5}'
# En dolu partition'ı bul
df -h | grep -v Filesystem | sort -k5 -rn | head -1
Monitoring Script’i: Disk Alarm Sistemi
İşte production ortamlarda kullandığım, e-posta bildirimi de yapan basit bir alarm scripti:
#!/bin/bash
# disk_monitor.sh - Disk doluluk alarm script'i
# Cron'a ekle: */30 * * * * /usr/local/bin/disk_monitor.sh
ESIK_UYARI=75
ESIK_KRITIK=90
MAIL_ALICI="[email protected]"
SUNUCU=$(hostname)
while IFS= read -r satir; do
# Yuzdeyi al, % isaretini kaldir
yuzde=$(echo "$satir" | awk '{print $5}' | tr -d '%')
mount=$(echo "$satir" | awk '{print $6}')
kullanilan=$(echo "$satir" | awk '{print $3}')
toplam=$(echo "$satir" | awk '{print $2}')
# Sayi kontrolu
if ! [[ "$yuzde" =~ ^[0-9]+$ ]]; then
continue
fi
if [ "$yuzde" -ge "$ESIK_KRITIK" ]; then
mesaj="KRITIK: $SUNUCU sunucusunda $mount bolumu %$yuzde dolu! ($kullanilan / $toplam)"
echo "$mesaj" | mail -s "[KRITIK] Disk Alami - $SUNUCU" "$MAIL_ALICI"
echo "$(date): $mesaj" >> /var/log/disk_alarm.log
elif [ "$yuzde" -ge "$ESIK_UYARI" ]; then
mesaj="UYARI: $SUNUCU sunucusunda $mount bolumu %$yuzde dolu ($kullanilan / $toplam)"
echo "$mesaj" | mail -s "[UYARI] Disk Kullanimi - $SUNUCU" "$MAIL_ALICI"
echo "$(date): $mesaj" >> /var/log/disk_alarm.log
fi
done < <(df -h -x tmpfs -x devtmpfs | grep -v Filesystem)
echo "$(date): Disk kontrolu tamamlandi" >> /var/log/disk_alarm.log
Bu script 30 dakikada bir çalışır, eşik değerleri aştığında mail atar ve log dosyasına yazar. İhtiyacınıza göre Slack webhook veya Teams entegrasyonu da ekleyebilirsiniz.
df ve du Arasindaki Fark
Sıkça karıştırılan bir konu: df ve du farklı şeyler yapar.
df: Dosya sistemi seviyesinde bilgi verir. Kernel’dan alır. Hızlıdır.du: Dizin içindeki dosyaları gezerek toplam boyutu hesaplar. Yavaştır ama hangi dizinin ne kadar yer kapladığını gösterir.
Örneğin df ile / partition’unun %90 dolu olduğunu görürsünüz. Hangi dizinin suçlu olduğunu bulmak için:
du -sh /* 2>/dev/null | sort -rh | head -10
Bu iki komut birbirini tamamlar. df ile problemi tespit edersiniz, du ile kaynağı bulursunuz.
Bazi Dikkat Edilmesi Gereken Noktalar
Rezerv alan meselesi: df çıktısında “Used + Available = Total” yapmaz. ext4 gibi dosya sistemleri default olarak toplam alanın %5’ini root kullanıcısı için ayırır. Bu yüzden aritmetik tutmaz. Bunu görmek için:
df -h /
# Toplam: 49G, Kullanilan: 7.9G, Musait: 39G
# 7.9 + 39 = 46.9G, 49G degil. Fark rezerv alan.
tmpfs ve sanal dosya sistemleri: Varsayılan df çıktısunda çok sayıda tmpfs, udev, cgroupfs gibi sanal dosya sistemi görürsünüz. Bunlar RAM’de yaşar. Kalabalık göründüklerinde -x tmpfs -x devtmpfs ile filtreleyebilirsiniz.
Silinen ama açık dosyalar: Büyük bir log dosyasını rm ile sildikten sonra df‘in hala eski değeri gösterdiğini fark edebilirsiniz. Bu, o dosyanın hala açık bir process tarafından tutulduğu anlamına gelir. Gerçek disk alanı ancak process kapandıktan sonra serbest kalır. Bu durumu tespit etmek için:
lsof | grep deleted | awk '{print $7, $1, $2}' | sort -rn | head -20
Windows Muadili
Windows’ta çalışıyorsanız, PowerShell’de benzer bilgileri şöyle alabilirsiniz:
# PowerShell ile disk kullanimi
Get-PSDrive -PSProvider FileSystem
# Daha detayli format
Get-WmiObject -Class Win32_LogicalDisk |
Select-Object DeviceID,
@{n='Toplam(GB)';e={[math]::Round($_.Size/1GB,2)}},
@{n='Bos(GB)';e={[math]::Round($_.FreeSpace/1GB,2)}},
@{n='Doluluk(%)';e={[math]::Round(($_.Size-$_.FreeSpace)/$_.Size*100,1)}}
Hizli Referans Tablosu
| Komut | Ne Yapar | |—|—| | df -h | İnsan okunabilir format | | df -hT | Dosya sistemi tipiyle birlikte | | df -i | Inode kullanimi | | df -hl | Sadece yerel dosya sistemleri | | df -h /path | Belirli dizinin bulundugu partition | | df -x tmpfs | tmpfs hariç tut | | df -t ext4 | Sadece ext4 göster |
Sonuc
df komutu, görünüşte basit ama doğru kullanıldığında son derece değerli bir araç. Günlük sistem yönetiminde disk sorunlarına müdahalenin ilk adımı her zaman df -h ile başlar.
Özetlemek gerekirse:
- Günlük rutin kontrol için
df -h -x tmpfs -x devtmpfskullanın - Inode problemlerini unutmayın,
df -ialışkanlık haline getirin - Alarm mekanizması kurun, disk dolulukları çoğunlukla yavaş yavaş gerçekleşir ve önceden önlem alınabilir
df+dukombinasyonunu öğrenin, biri olmadan diğeri eksik kalır- Silinen ama açık dosya tuzağına dikkat edin
Disk yönetimi reaktif değil proaktif yapılması gereken bir iş. Monitoring sisteminize df tabanlı kontroller ekleyin, kapasite planlamasını ihmal etmeyin, kritik partition’larınız için alert eşiklerini belirleyin. Gece üçte Slack alarmıyla uyanmak yerine, gündüz vakti sakin kafayla önlem almak her zaman daha iyidir.
Bir sonraki yazıda du komutunu ve disk space analiz araçlarını (ncdu, duf) ele alacağım. Takipte kalın.