df Komutu ile Linux’ta Disk Kullanımını İzleme ve Analiz

Disk doldu mu? Sistem yavaşladı mı? Bir uygulama log dosyalarını patlatıp her şeyi çökertti mi? Bunların hepsinin cevabı genellikle aynı yerde başlıyor: df komutu. Linux sistem yöneticiliğinde df, sabah kahvesi gibidir. Güne onunla başlarsın, sorun çıktığında ona dönersin. Basit görünür ama derinlerine indikçe ne kadar güçlü bir araç olduğunu anlarsın.

df Komutu Nedir ve Ne İşe Yarar?

df, “disk free” kelimelerinin kısaltmasıdır ve sisteminizdeki dosya sistemlerinin disk kullanım bilgilerini gösterir. Hangi bölümde ne kadar alan var, ne kadarı kullanılıyor, ne kadarı boş, yüzde kaç doluluk oranı var gibi kritik bilgilere saniyeler içinde ulaşırsınız.

GNU coreutils paketinin bir parçası olan df, neredeyse her Linux dağıtımında varsayılan olarak gelir. Debian, Ubuntu, CentOS, RHEL, Arch fark etmez; df her yerde aynı temel işlevi görür.

Komutun temel sözdizimi şu şekildedir:

df [SEÇENEKLER] [DOSYA/BÖLÜM]

Argüman vermeden çalıştırdığınızda tüm bağlı dosya sistemlerini listeler. Belirli bir dosya veya dizin verirseniz, o dosyanın bulunduğu dosya sistemini gösterir.

Temel Kullanım

En basit haliyle df komutunu çalıştıralım:

df

Bu komutun çıktısı şöyle görünür:

Filesystem     1K-blocks    Used Available Use% Mounted on
udev             3987284       0   3987284   0% /dev
tmpfs             803832    1872    801960   1% /run
/dev/sda1       51475068 8234512  40586268  17% /
tmpfs            4019148  145236   3873912   4% /dev/shm
/dev/sdb1      103081248 75643128  22155636  78% /data

Görüldüğü gibi çıktı kilobayt cinsinden geliyor ve okunması biraz zor. İşte bu noktada -h parametresi devreye giriyor.

En Sık Kullanılan Parametreler

-h (human-readable): Boyutları okunabilir formatta gösterir (KB, MB, GB, TB)

-H: Büyük H, 1024 yerine 1000’in kuvvetlerini kullanır (megabyte yerine megabyte gibi ama farklı hesaplama)

-T: Dosya sistemi tipini gösterir (ext4, xfs, tmpfs, btrfs gibi)

-i: İnode kullanım bilgilerini gösterir, bayt değil

-a: Tüm dosya sistemlerini gösterir, sözde dosya sistemleri dahil

-l: Sadece yerel dosya sistemlerini listeler, NFS gibi uzak sistemleri dahil etmez

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

-x TYPE: Belirtilen dosya sistemi tipini dışarıda bırakır

-t TYPE: Sadece belirtilen tipe ait dosya sistemlerini gösterir

–output=FIELD: Gösterilecek sütunları seçer (source, size, used, avail, pcent, target gibi)

Pratik Kullanım Örnekleri

İnsan Tarafından Okunabilir Format

Günlük kullanımda en çok bu komutu kullanırsınız:

df -h

Çıktı artık çok daha anlaşılır olacaktır:

Filesystem      Size  Used Avail Use% Mounted on
udev            3.8G     0  3.8G   0% /dev
tmpfs           785M  1.9M  783M   1% /run
/dev/sda1        50G  7.9G   39G  17% /
tmpfs           3.8G  142M  3.7G   4% /dev/shm
/dev/sdb1        99G   73G   22G  78% /data

Dosya Sistemi Tipini Görmek

Özellikle karışık ortamlarda (ext4, xfs, btrfs, nfs hepsi bir arada) çalışıyorsanız:

df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
udev           devtmpfs  3.8G     0  3.8G   0% /dev
/dev/sda1      ext4       50G  7.9G   39G  17% /
/dev/sdb1      xfs        99G   73G   22G  78% /data
nfs-server:/backup nfs  500G  320G  180G  65% /mnt/backup

Belirli Bir Dizini Kontrol Etmek

Bir uygulamanın hangi dosya sisteminde çalıştığını öğrenmek için:

df -h /var/log

Bu komut sadece /var/log dizininin bulunduğu bölümü gösterir. Özellikle log şişmesinden şüphelendiğinizde hızlıca kontrol için kullanışlıdır.

df -h /home /var /tmp /opt

Birden fazla dizini aynı anda kontrol edebilirsiniz. Farklı bölümlerde mount edilmiş dizinleri tek hamlede görmek için idealdir.

Toplam Kullanımı Görmek

df -h --total

En alta eklenen “total” satırı tüm dosya sistemlerinin toplamını verir. Kapasite planlaması yaparken işe yarar.

İnode Kullanımını Kontrol Etmek

Disk dolu görünmese bile sistem “no space left on device” hatası veriyorsa, inode tükenmiş olabilir. Bu durumda:

df -i
Filesystem       Inodes  IUsed   IFree IUse% Mounted on
/dev/sda1       3276800 287432 2989368    9% /
/dev/sdb1      13107200 9845234 3261966   76% /data

Yüksek inode kullanımı genellikle çok sayıda küçük dosyadan kaynaklanır. Mail sunucuları, cache sistemleri, PHP session dosyaları bu durumun baş sorumlularıdır.

Gerçek Dünya Senaryoları

Senaryo 1: Production Sunucusu Alarm Verdi

Gece 2’de alarm geliyor, uygulama loglarına yazamıyor. SSH ile bağlanıyorsunuz ve ilk çalıştırdığınız komut:

df -h

Çıktıda /var bölümünün %99 dolu olduğunu görüyorsunuz. Hangi dizinin yer kapladığını bulmak için du komutuyla kombinliyorsunuz ama önce hangi bölümün sorunlu olduğunu df ile tespit ettiniz. Bu, kritik dakikalarda zaman kazandırır.

Senaryo 2: Dosya Sistemi Tipine Göre Filtreleme

Sadece ext4 dosya sistemlerini görmek istiyorsunuz:

df -hT -t ext4

Ya da NFS bağlantılarını hariç tutmak istiyorsunuz, çünkü NFS sunucusu yavaş yanıt veriyor ve komutun çıktısını bekletmesin:

df -hT -x nfs -x nfs4

Senaryo 3: Özelleştirilmiş Çıktı Formatı

Monitoring scriptleri yazarken ya da başka bir araçla parse etmek için çıktıyı özelleştirmek isteyebilirsiniz:

df --output=source,size,used,avail,pcent,target -h

Sadece doluluk oranı ve bağlantı noktasını görmek için:

df -h --output=pcent,target

Bu çıktıyı bir script’e besleyebilir, yüzde değeri 80’i geçen bölümleri otomatik olarak tespit edebilirsiniz.

df ile Monitoring Script Yazmak

Sistem yöneticilerinin en çok kullandığı pratiklerden biri basit disk kullanım monitör scriptleri yazmaktır. İşte gerçekçi bir örnek:

#!/bin/bash
# Disk kullanimi kontrol scripti
# Crontab ile her saat calistirmak icin uygundur

ESIK=85
EMAIL="[email protected]"
HOSTNAME=$(hostname)

df -h --output=pcent,target | tail -n +2 | while read satir; do
    yuzde=$(echo "$satir" | awk '{print $1}' | tr -d '%')
    mount_noktasi=$(echo "$satir" | awk '{print $2}')

    if [ "$yuzde" -ge "$ESIK" ]; then
        echo "UYARI: $HOSTNAME sunucusunda $mount_noktasi bölümü %$yuzde dolu!" 
        | mail -s "Disk Uyarisi - $HOSTNAME" "$EMAIL"
    fi
done

Bu scripti crontab’a ekleyerek düzenli aralıklarla çalıştırabilirsiniz:

# Her saat basinda calistir
0 * * * * /usr/local/bin/disk_kontrol.sh

Daha gelişmiş bir versiyon için threshold’ları farklı bölümler için ayrı ayrı ayarlayabilir, Slack webhook’u ile entegre edebilirsiniz.

df Çıktısını Parse Etmek

Bazen df çıktısını işlemek için awk veya grep ile kombinlemeniz gerekir. İşte yaygın kullanılan birkaç kombinasyon:

# Sadece yuzde 80'in uzerindeki bolümleri goster
df -h | awk 'NR==1 || int($5) > 80 {print}'

# Root bölümünün doluluk yuzdesini saf sayi olarak al
df / | tail -1 | awk '{print $5}' | tr -d '%'

# Tüm bölümlerin kullanim yüzdelerini sirala
df -h | tail -n +2 | sort -t'%' -k1 -rn

Sık Yapılan Hatalar ve Dikkat Edilmesi Gerekenler

tmpfs ve devtmpfs Kalabalığı

Varsayılan df -h çıktısında çok sayıda tmpfs satırı görürsünüz. Bunlar gerçek disk alanı değil, RAM’de tutulan geçici dosya sistemleridir. Analiz yaparken bunları aklınızda bulundurun. Sadece gerçek disk bölümlerini görmek için:

df -hT -x tmpfs -x devtmpfs -x squashfs

Ubuntu sistemlerde snap paketleri yüzünden onlarca squashfs girişi görürsünüz. Bunları -x squashfs ile temizlediğinizde çıktı çok daha okunabilir hale gelir.

Bind Mount Kargaşası

Docker kullanan sistemlerde ya da bind mount yapılan ortamlarda aynı fiziksel disk alanı birden fazla satırda görünebilir. Bu durum toplam hesabı yanıltıcı hale getirebilir. --total ile elde ettiğiniz rakama körü körüne güvenmeyin.

NFS Zaman Aşımı Sorunu

NFS bağlantısı olan sistemlerde df komutu, NFS sunucusunun yanıt vermesini beklediği için askıya gidebilir. Eğer böyle bir durumda kalırsanız:

df -l

-l parametresi sadece yerel dosya sistemlerini listeler, NFS ve diğer uzak bağlantıları pas geçer. Sorunlu bir NFS bağlantısında bile anında sonuç alırsınız.

Silinen Ama Açık Tutulan Dosyalar

df komutunun gösterdiği kullanılan alan ile du komutunun hesapladığı toplam bazen uyuşmaz. Bunun en yaygın nedeni şudur: Bir dosya silinmiş ama hala çalışan bir process tarafından açık tutulmaktadır. Dosya silindi ama alan serbest bırakılmadı.

Bu durumu tespit etmek için:

# Silindi ama hala acik tutulan dosyalari bul
lsof | grep '(deleted)'

# Ya da daha hedefli arama
lsof +L1

Sorunu çözmek için ilgili process’i yeniden başlatmanız veya durdurup başlatmanız gerekir. Bu klasik bir “disk dolu ama du farkli söylüyor” senaryosunun arkasındaki en yaygın sebeptir.

df ile Kapasite Planlaması

Uzun vadeli kapasite planlaması için df çıktılarını zaman serisi olarak kaydetmek iyi bir alışkanlıktır:

# Her gun disk durumunu log dosyasina kaydet
echo "=== $(date) ===" >> /var/log/disk_kullanim.log
df -h >> /var/log/disk_kullanim.log
echo "" >> /var/log/disk_kullanim.log

Bu basit yaklaşım sayesinde 3 ay önce /data bölümü ne kadardı, bugün ne kadar gibi soruları cevaplayabilirsiniz. Büyük ortamlarda Prometheus + Grafana ile node_exporter‘ın zaten bu verileri topladığını biliyorsunuzdur ama küçük ortamlarda bu basit log yaklaşımı kurtarıcı olabilir.

df vs du: Hangisi Ne Zaman?

Bu iki komut sıkça karıştırılır. Kısaca fark şudur:

df dosya sistemi düzeyinde çalışır. Bölümün toplam boyutu, kullanılan alan, boş alan gibi meta verileri dosya sisteminin kendisinden okur. Bu yüzden çok hızlıdır.

du ise dizin ve dosya düzeyinde çalışır. Gerçekten her dosyayı gezip boyutunu toplar. Bu yüzden yavaştır ama “bu dizin ne kadar yer kaplıyor” sorusunu cevaplar.

Pratikte her ikisini birlikte kullanırsınız. df ile hangi bölümün dolduğunu tespit edersiniz, du ile o bölümde hangi dizinin şiştiğini bulursunuz:

# Önce hangi bölüm dolu?
df -h

# /data doluysa, içinde ne var?
du -sh /data/* | sort -rh | head -20

Alias ve Fonksiyonlarla Hızlandırma

Günde onlarca kez kullandığınız komutlar için alias tanımlamak verimliliği artırır. .bashrc veya .bash_profile dosyanıza ekleyebilecekleriniz:

# Okunabilir, squashfs ve tmpfs olmadan
alias dff='df -hT -x tmpfs -x devtmpfs -x squashfs'

# Sadece gercek diskler, toplam ile
alias dfft='df -hT -x tmpfs -x devtmpfs -x squashfs --total'

# Inode kullanimi
alias dfi='df -i -x tmpfs -x devtmpfs'

Bu alias’ları tanımladıktan sonra source ~/.bashrc ile aktif hale getirmeyi unutmayın.

Renklendirme ve Okunabilirliği Artırma

Standart df çıktısı düz metin olarak gelir. Yüksek doluluk oranlarını renklendirmek için awk ile birleştirme yapabilirsiniz:

df -h | awk '
NR==1 {print; next}
{
    yuzde = int($5)
    if (yuzde >= 90)
        printf "33[0;31m" $0 "33[0mn"
    else if (yuzde >= 75)
        printf "33[0;33m" $0 "33[0mn"
    else
        print
}'

Bu script %90 ve üzerini kırmızı, %75-89 arasını sarı, altını ise normal renkte gösterir. Terminalde çalışırken kritik bölümleri anında görürsünüz.

Sonuç

df komutu basit görünür ama doğru parametrelerle ve doğru senaryolarda kullanıldığında sistem yöneticisinin en güvenilir arkadaşlarından biri haline gelir. Günlük rutin kontrollerde, acil müdahalelerde, kapasite planlamasında ve otomatik izleme scriptlerinde sürekli karşınıza çıkacak.

Şunu aklınızda tutun: df size hızlı bir genel bakış sunar. Ne zaman boş kalana bakarsınız, ne zaman inode’lara bakarsınız, ne zaman -x ile gereksiz satırları temizlersiniz, bunu öğrendikçe kullanım alışkanlıklarınız oturur.

Bir sonraki adım olarak du komutunu öğrenmek, ardından lsof ile silinen ama açık dosya sorunlarını çözmeyi pratiklemek mantıklı olur. Bu üçlü birlikte öğrenildiğinde disk sorunlarını kör olmadan, paniklemeden yönetebilirsiniz. Sabah kahvenizi alın, df -hT -x tmpfs -x devtmpfs -x squashfs --total komutunu bir kenara not edin ve günlük rutininize ekleyin.

Yorum yapın