df Komutu ile Disk Kullanımını İzleme ve Analiz
Sysadmin hayatında “disk doldu” alarmından daha sinir bozucu çok az şey vardır. Özellikle gece 2’de çalan bir PagerDuty bildirimi ile uyanıp, production sunucusunda hangi partition’ın dolduğunu bulmaya çalışmak… İşte tam bu yüzden df komutunu iyi tanımak şart. Basit görünen bu araç, doğru kullanıldığında disk yönetiminin temel taşı haline gelir.
Bu yazıda df komutunu baştan sona ele alacağız. Temel kullanımdan ileri seviye senaryolara, monitoring script’lerinden troubleshooting ipuçlarına kadar her şeyi kapsayacağız.
df Nedir ve Ne İşe Yarar?
df (disk free) komutu, Linux ve Unix sistemlerinde mount edilmiş dosya sistemlerinin disk kullanım bilgilerini gösterir. Komut, /proc/mounts veya /etc/mtab dosyasından mount bilgilerini okur ve her dosya sistemi için kullanılan/boş alan, toplam boyut ve kullanım yüzdesi gibi bilgileri raporlar.
Temel olarak şu soruların cevabını verir:
- Hangi partition ne kadar dolu?
- Toplam kapasite ne kadar?
- Hangi dosya sistemi nereye mount edilmiş?
- Inode kullanımı nasıl?
Temel Kullanım
En basit haliyle df komutunu doğrudan çalıştırabilirsiniz:
df
Bu çıktı kilobayt cinsinden verileri gösterir ve okunması pek kolay değildir. Neredeyse her zaman -h (human-readable) flag’i ile kullanmak daha mantıklıdır:
df -h
Tipik bir çıktı şöyle görünür:
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 32G 16G 67% /
/dev/sdb1 200G 145G 45G 73% /data
tmpfs 3.9G 1.2G 2.7G 31% /dev/shm
/dev/sdc1 500G 489G 2.1G 99% /backup
Burada /backup partition’ının %99 dolu olduğunu hemen görüyoruz. İşte bu bilgi hayat kurtarır.
Önemli Flag’ler ve Parametreler
-h ve -H: Human-Readable Format
# 1024 tabanlı (KB, MB, GB)
df -h
# 1000 tabanlı (SI birimleri)
df -H
Çoğu zaman -h yeterlidir. -H ise SI standartlarını tercih edenler için uygundur. İkisi arasındaki fark küçük ama raporlama tutarlılığı açısından önemlidir.
-T: Dosya Sistemi Tipini Gösterme
Bir sunucuda hangi dosya sistemlerinin kullanıldığını görmek için:
df -Th
Çıktı:
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda1 ext4 50G 32G 16G 67% /
/dev/sdb1 xfs 200G 145G 45G 73% /data
tmpfs tmpfs 3.9G 1.2G 2.7G 31% /dev/shm
/dev/sdc1 ext4 500G 489G 2.1G 99% /backup
Bu özellikle NFS, tmpfs, overlay (Docker) gibi farklı tipte dosya sistemlerinin olduğu ortamlarda çok işe yarar.
-i: Inode Kullanımını Gösterme
Disk alanı dolmamış ama dosya oluşturamıyorsunuz? Suçlu muhtemelen inode’lar:
df -ih
Çıktı:
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 3.2M 890K 2.3M 28% /
/dev/sdb1 6.4M 6.4M 0 100% /var/mail
/var/mail partition’ında inode %100 dolu. Bu durumda fiziksel disk alanı olsa bile yeni dosya oluşturamazsınız. Mail server’larda ve çok sayıda küçük dosya barındıran sistemlerde bu sorunla sık karşılaşılır.
Belirli Bir Dosya veya Dizini Kontrol Etme
Hangi partition’da olduğunu bilmediğiniz bir dizini kontrol etmek için:
df -h /var/log
df -h /home/kullanici
Bu komut, belirtilen path’in hangi dosya sisteminde bulunduğunu ve o dosya sisteminin durumunu gösterir.
Gercek Dunya Senaryolari
Senaryo 1: Production Sunucusu Alarm Veriyor
Gece alarmı geldi, sunucu disk dolu diyor. Hızlıca şunları yaparsınız:
# Genel durumu gör
df -h
# Sadece fiziksel disk ve NFS'leri goster, tmpfs gibi sanal dosya sistemlerini atla
df -hT | grep -v tmpfs | grep -v devtmpfs | grep -v udev
# En dolu partition'ları bul
df -h | sort -k5 -rn | head -10
Hangi partition’ın dolu olduğunu bulduktan sonra du komutu ile detaya inebilirsiniz. Ama bu yazının konusu df olduğu için orada duralım.
Senaryo 2: Docker Ortamında Disk Takibi
Docker kullanan sistemlerde overlay dosya sistemleri df çıktısını karmaştırır:
# Sadece gercek dosya sistemlerini goster
df -hT | grep -E "ext4|xfs|btrfs|vfat"
# Docker'a ait overlay'leri ayirt et
df -hT | grep overlay
Docker environment’larda çıktı onlarca satır olabilir. Filtrelemek hayat kurtarır.
Senaryo 3: Monitoring Script’i Yazma
Disk kullanımını periyodik olarak kontrol eden ve belirli bir eşiği geçtiğinde uyaran basit bir script:
#!/bin/bash
# Disk kullanim uyari scripti
ESIK=80
KRITIK=90
EPOSTA="[email protected]"
HOSTNAME=$(hostname)
# Her mount point'i kontrol et
df -h | grep -vE "^Filesystem|tmpfs|devtmpfs|udev" | while read satir; do
KULLANIM=$(echo "$satir" | awk '{print $5}' | sed 's/%//')
PARTITION=$(echo "$satir" | awk '{print $6}')
if [ "$KULLANIM" -ge "$KRITIK" ]; then
echo "KRITIK: $HOSTNAME - $PARTITION kullanimi %$KULLANIM" |
mail -s "[KRITIK] Disk Dolu: $PARTITION" "$EPOSTA"
elif [ "$KULLANIM" -ge "$ESIK" ]; then
echo "UYARI: $HOSTNAME - $PARTITION kullanimi %$KULLANIM" |
mail -s "[UYARI] Disk Dolmak Uzere: $PARTITION" "$EPOSTA"
fi
done
Bu script’i crontab’a ekleyerek her 15 dakikada bir çalıştırabilirsiniz:
*/15 * * * * /opt/scripts/disk-kontrol.sh
Senaryo 4: Birden Fazla Sunucuyu Toplu Kontrol
Birçok sunucuyu yönetiyorsanız ve hepsinin disk durumunu görmek istiyorsanız:
#!/bin/bash
SUNUCULAR="web01 web02 db01 db02 app01"
for sunucu in $SUNUCULAR; do
echo "=== $sunucu ==="
ssh "$sunucu" "df -h | grep -vE 'tmpfs|devtmpfs'" 2>/dev/null
echo ""
done
Daha detaylı bir versiyon için çıktıyı CSV’ye de alabilirsiniz:
#!/bin/bash
SUNUCULAR="web01 web02 db01 db02"
TARIH=$(date +%Y%m%d)
CIKTI="/var/log/disk-rapor-$TARIH.csv"
echo "Sunucu,Dosya Sistemi,Boyut,Kullanilan,Bos,Yuzde,Mount" > "$CIKTI"
for sunucu in $SUNUCULAR; do
ssh "$sunucu" "df -h | grep -v Filesystem" 2>/dev/null |
grep -vE "tmpfs|devtmpfs" |
awk -v srv="$sunucu" '{print srv","$1","$2","$3","$4","$5","$6}' >> "$CIKTI"
done
echo "Rapor olusturuldu: $CIKTI"
df Ciktisini Anlamak
Sutunların Anlamı
df çıktısındaki her sütun önemlidir:
- Filesystem: Dosya sisteminin adı veya cihaz yolu
- Size: Toplam alan (1K-blocks veya human-readable)
- Used: Kullanılan alan
- Avail: Kullanılabilir alan (rezerv alan dahil degil)
- Use%: Kullanım yüzdesi
- Mounted on: Mount point
Neden “Available” + “Used” her zaman “Size”‘a esit degil?
Bu sıkça sorulan bir sorudur. ext4 ve benzeri dosya sistemleri, varsayılan olarak toplam alanın %5’ini root kullanıcısı için rezerve eder. Bu sayede sistem dolduğunda root kullanıcısı hala işlem yapabilir.
# Rezerv bloklari gormek icin tune2fs kullan
tune2fs -l /dev/sda1 | grep "Reserved block"
# Rezervi degistirmek icin (dikkatli kullan!)
tune2fs -m 1 /dev/sda1
Ileri Seviye Kullanım
Belirli Dosya Sistemlerini Dahil veya Hariç Tutma
# Sadece ext4 dosya sistemlerini goster
df -t ext4 -h
# ext4 haricindeki herseyi goster
df -x ext4 -h
# NFS mount'larini goster
df -t nfs -h
df -t nfs4 -h
Toplam Disk Kullanımını Hesaplama
# Tum dosya sistemlerinin toplamini goster
df -h --total
# Sadece fiziksel disklerin toplamini hesapla
df -hT | grep -E "ext4|xfs" | awk '{sum += $3} END {print "Toplam Kullanilan: " sum}'
Watch ile Gercek Zamanli Takip
# Her 2 saniyede bir guncelle
watch -n 2 'df -h | grep -vE "tmpfs|devtmpfs"'
# Renkli ve daha okunaklı
watch -n 2 -d 'df -Th | grep -vE "tmpfs|devtmpfs|udev"'
-d flag’i ile watch değişen değerleri vurgular, bu da aktif bir kopyalama veya silme işlemi sırasında disk değişimini takip etmek için çok kullanışlıdır.
Sık Yapılan Hatalar ve Çözümleri
Hata 1: df Takılı Kalıyor
Bazen df komutu yanıt vermez. Bu genellikle ölü bir NFS mount’ından kaynaklanır:
# Hangi mount'ın takıldığını bul
df -h &
# Bir sure bekle, sonra
strace -p [df_pid]
# Sorunlu NFS mount'ini force unmount et
umount -l /sorunlu/mount/noktasi
Hata 2: Silinen Dosyalar Hala Yer Kaplanıyor Gibi Görünüyor
Dosyayı sildiniz ama disk doluluk oranı değişmedi mi? Açık file handle sorunu:
# Silindigi halde hala acik olan dosyalari bul
lsof | grep deleted | awk '{print $1, $2, $7, $9}' | sort -k3 -rn | head -20
Çözüm için o dosyayı kullanan process’i yeniden başlatmak genellikle yeterlidir.
Hata 3: Inode Bitti Ama Nerede?
# Inode dolulugunu goster
df -i
# En cok inode kullanan dizini bul
find /var -xdev -printf '%hn' | sort | uniq -c | sort -k 1 -rn | head -20
df vs du: Ne Zaman Hangisini Kullan?
Bu iki komut sık karıştırılır:
- df: Dosya sistemi seviyesinde bilgi verir. Hızlıdır, anlık snapshot alır. “Hangi partition ne kadar dolu?” sorusunun cevabı.
- du: Dizin ve dosya seviyesinde bilgi verir. Yavaştır ama detaylıdır. “Bu dolulugu kim yapıyor?” sorusunun cevabı.
Tipik workflow:
# Once df ile hangi partition dolu bul
df -h
# Sonra du ile o partition'da kimin doldurdugunu bul
du -sh /data/* | sort -rh | head -20
Monitoring Entegrasyonu
Modern ortamlarda df çıktısını Prometheus, Grafana veya Zabbix gibi araçlara besleyebilirsiniz. Ama basit bir log tabanlı monitoring için:
#!/bin/bash
# /etc/cron.d/disk-log dosyasina ekle
TARIH=$(date '+%Y-%m-%d %H:%M:%S')
LOG="/var/log/disk-kullanim.log"
echo "[$TARIH]" >> "$LOG"
df -h | grep -vE "tmpfs|devtmpfs|udev" >> "$LOG"
echo "---" >> "$LOG"
Bu log’ları logrotate ile yönetmeyi de unutmayın:
# /etc/logrotate.d/disk-kullanim
/var/log/disk-kullanim.log {
weekly
rotate 8
compress
missingok
notifempty
}
Sonuç
df komutu sade görünümünün arkasında çok güçlü bir araçtır. Temel -h kullanımından başlayarak, inode takibine, script entegrasyonuna, çoklu sunucu monitoringine kadar geniş bir kullanım alanı sunar.
Bir sysadmin olarak disk yönetimi rutininize şunları eklemenizi öneririm:
- Sunuculara her bağlandığınızda refleks olarak
df -hçalıştırın - Kritik sistemlerde %80 uyarı, %90 kritik eşiği ile otomatik alarm kurun
- Inode kullanımını da fiziksel disk kullanımı kadar ciddiye alın
dfile genel resmi görün,duile detaya inin- Docker ve container ortamlarında
tmpfsveoverlayfiltrelerini kullanın
Disk yönetimi proaktif bir iştir. Sorun çıktıktan sonra koşturmak yerine, düzenli monitoring ile önlemek hem sizi hem de kullanıcıları mutlu eder. Ve gece 2’deki alarmlar azalır, bu da her sysadmin’in hayalidir.