Dolup Taşan Disk Alanını Tespit Etme ve Temizleme

Gece 2’de çalan telefon, hepimizin korkulu rüyasıdır. “Disk doldu, uygulama çöktü” mesajı aldığında ne yapacağını bilmek, iyi bir sistem yöneticisini ortalamadan ayıran şeydir. Disk alanı yönetimi kulağa basit gelse de pratikte onlarca farklı senaryo, onlarca farklı sebep ve onlarca farklı çözüm yolu var. Bu yazıda baştan sona gerçek dünya deneyimleriyle disk alanı sorunlarını nasıl tespit edip temizleyeceğini anlatacağım.

Durumu Hızla Anlamak: İlk Adımlar

Bir sunucuya bağlandığında ilk yapman gereken şey genel durumu görmek. Paniklemeden, sakin bir şekilde aşağıdaki komutları sırayla çalıştır.

df -hT

Bu komut tüm mount noktalarını, dosya sistemi tiplerini ve doluluk oranlarını gösterir. Çıktıda %100 veya %95 üzeri gördüğün her satır potansiyel sorun demektir. -T parametresi dosya sistemi tipini gösterir, tmpfs gibi sanal dosya sistemlerini gerçek disklerden ayırt etmeni sağlar.

df -hi

Burada inode kullanımına bakıyoruz. Çok sık karşılaşılan ve çok az akla gelen bir sorun var: disk alanı olmasına rağmen inode dolduğunda da dosya yazamazsın. Küçük boyutlu milyonlarca dosya oluşturan uygulamalar (mail sunucuları, önbellek sistemleri) inode’u bitirebilir. Eğer IUse% sütununda %100 görüyorsan sorun inode dolması demektir.

lsblk -f

Bu komut disk bölümleme yapısını ağaç şeklinde gösterir. Hangi diskin nereye mount edildiğini, UUID bilgilerini ve dosya sistemi tipini tek bakışta görebilirsin.

Yer Kaplayanı Bulmak: du ile Derinlemesine Analiz

df genel durumu gösterir, ama asıl iş du ile başlar. Hangi dizin ne kadar yer kaplıyor, bunu bulmadan temizlik yapamazsın.

du -sh /* 2>/dev/null | sort -rh | head -20

Bu komut kök dizindeki her klasörün boyutunu hesaplar, büyükten küçüğe sıralar ve ilk 20’yi gösterir. 2>/dev/null kısmı “Permission denied” hatalarını susturur. Çıktıda /var veya /home gibi bir dizin olağandışı büyük görünüyorsa oraya dalacağız.

Diyelim ki /var şüpheli göründü:

du -sh /var/* 2>/dev/null | sort -rh | head -20

Aynı mantıkla dalıyoruz. /var/log büyük çıktıysa:

du -sh /var/log/* 2>/dev/null | sort -rh | head -20

Bu şekilde suçluyu bulana kadar kazıyorsun. Gerçek bir deneyimden bahsedeyim: bir üretim sunucusunda /var/lib/docker 200 GB’ı aşmıştı. Docker imajları, durmuş konteynerler ve kullanılmayan volume’ler birikmiş, kimse fark etmemişti. Üç aylık ihmal, üç saatlik temizlik gerektirdi.

ncdu ile Görsel Analiz

Eğer sunucuda ncdu kuruluysa veya kurabileceksen, hayatın çok daha kolaylaşır:

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

# Çalıştırma
ncdu /

ncdu interaktif bir arayüz sunar. Ok tuşlarıyla gezebilir, d ile silme yapabilir, n ile isme göre, s ile boyuta göre sıralayabilirsin. Özellikle remote sunucularda SSH üzerinden çok kullanışlıdır.

Log Dosyaları: En Büyük Suçlu

Deneyimlerime göre disk dolmalarının %60’ından fazlasında log dosyaları suçludur. Uygulama hata ayıklaması için debug modu açılmış ve unutulmuş, logrotate düzgün yapılandırılmamış veya bir uygulama aynı hatayı saniyede yüzlerce kez logluyor olabilir.

# En büyük log dosyalarını bul
find /var/log -type f -name "*.log" -exec du -sh {} ; 2>/dev/null | sort -rh | head -20

# Son 1 saatte değişen log dosyalarını bul (aktif olarak büyüyenleri)
find /var/log -type f -name "*.log" -newer /tmp/timestamp_check 2>/dev/null

Aktif olarak büyüyen bir log dosyası bulduysan içine bakman gerekiyor:

tail -f /var/log/uygulama/error.log

Eğer aynı hata satırı sürekli tekrarlanıyorsa, önce uygulamadaki sorunu çöz, sonra log dosyasını temizle. Sıralamayı karıştırma, aksi halde log dolmaya devam eder.

Güvenli log temizleme şu şekilde yapılır. Dosyayı silmek yerine içini boşalt, çünkü çalışan bir process dosyayı tutuyorsa silmek disk alanını gerçekten boşaltmaz:

# Doğru yöntem: dosyayı truncate et
> /var/log/uygulama/error.log

# veya
truncate -s 0 /var/log/uygulama/error.log

# Yanlış yöntem (process dosyayı tutuyorsa boşaltmaz):
# rm /var/log/uygulama/error.log

Logrotate Kontrolü

Logrotate düzgün çalışıyor mu kontrol et:

# Logrotate durumunu gör
cat /var/lib/logrotate/status

# Manuel olarak çalıştır
logrotate -f /etc/logrotate.conf

# Spesifik bir konfigürasyonu test et
logrotate -d /etc/logrotate.d/nginx

Silinmiş ama Hala Yer Kaplayan Dosyalar

Bu durum birçok sysadmin’i şaşırtır. df disk doldu gösteriyor ama du ile toplayınca rakamlar tutmuyor. Bunun sebebi, çalışan bir process tarafından açık tutulan dosyaların silinmesi. Dosya dizinden kaldırılır ama process kapatılana kadar inode ve disk bloğu serbest bırakılmaz.

# Silinmiş ama hala açık tutulan dosyaları bul
lsof +L1 2>/dev/null

# Sadece büyük olanları göster
lsof +L1 2>/dev/null | awk 'NR>1 {print $7, $1, $2, $9}' | sort -rn | head -20

Çıktıda (deleted) ile işaretlenmiş büyük dosyalar görüyorsan, o process’i restart etmek disk alanını geri kazandırır:

# Process'i bul ve yeniden başlat
systemctl restart nginx
# veya
kill -HUP <PID>

Geçici Dosyalar ve Cache Temizliği

/tmp Dizini

# /tmp boyutunu kontrol et
du -sh /tmp

# 7 günden eski geçici dosyaları temizle
find /tmp -type f -atime +7 -delete
find /tmp -type d -empty -delete

Modern sistemlerde /tmp için systemd-tmpfiles kullanılır:

# Geçici dosya temizleme kurallarını çalıştır
systemd-tmpfiles --clean

# Konfigürasyonları gör
ls /etc/tmpfiles.d/
cat /usr/lib/tmpfiles.d/tmp.conf

Paket Yöneticisi Cache

Paket yöneticilerinin cache dizinleri zamanla ciddi boyutlara ulaşır.

# Debian/Ubuntu için
apt clean          # Cache'i tamamen temizle
apt autoclean      # Eski paket versiyonlarını sil
apt autoremove     # Kullanılmayan bağımlılıkları kaldır

# Cache boyutunu görmek için
du -sh /var/cache/apt/

# RHEL/CentOS/Rocky için
yum clean all
dnf clean all
du -sh /var/cache/yum/
du -sh /var/cache/dnf/

Bir müşteri ortamında /var/cache/apt dizini 8 GB’ı aşmıştı. Yıllardır apt clean çalıştırılmamıştı. Tek komutla 8 GB geri kazanıldı.

Docker: Gizli Disk Canavarı

Docker kullanan sistemlerde disk yönetimi ayrı bir uzmanlık gerektirir. Kullanılmayan imajlar, durmuş konteynerler ve anonim volume’ler hızla birikerek ciddi yer kaplar.

# Docker disk kullanım özeti
docker system df

# Ayrıntılı görünüm
docker system df -v

# Kullanılmayan her şeyi temizle (konteynerler, imajlar, ağlar, build cache)
docker system prune -a

# Sadece durmuş konteynerleri temizle
docker container prune

# Kullanılmayan imajları temizle
docker image prune -a

# Kullanılmayan volume'leri temizle (DİKKATLİ OL, veri kaybı olabilir)
docker volume prune

docker system prune -a komutunu çalıştırmadan önce hangi imajların kullanımda olduğunu kontrol et. Özellikle üretim ortamında bu komutu dikkatli kullanmalısın.

Büyük Dosyaları Sistematik Olarak Bulmak

Bazen log veya cache dışında beklenmedik yerlerde dev dosyalar olabilir. Core dump dosyaları, eski yedekler, geliştirici tarafından bırakılan test verileri bunların başında gelir.

# 100 MB'dan büyük tüm dosyaları bul
find / -type f -size +100M -exec ls -lh {} ; 2>/dev/null | sort -k5 -rh | head -30

# Hem boyutu hem konumu düzgün görüntüle
find / -type f -size +500M 2>/dev/null -exec du -sh {} ; | sort -rh

# Core dump dosyalarını bul
find / -name "core" -o -name "core.*" -type f 2>/dev/null | xargs du -sh 2>/dev/null

# Belirli bir süreden eski büyük dosyaları bul (30 günden eski, 50 MB'dan büyük)
find /home -type f -size +50M -mtime +30 2>/dev/null -exec ls -lh {} ;

/home Dizini ve Kullanıcı Kotaları

Çok kullanıcılı sistemlerde /home dizini beklenmedik biçimde dolabilir.

# Kullanıcı bazında disk kullanımı
du -sh /home/* 2>/dev/null | sort -rh

# Her kullanıcının en büyük dosyalarını bul
for user in $(ls /home); do
    echo "=== $user ==="
    find /home/$user -type f -size +100M 2>/dev/null -exec du -sh {} ;
done

# Quota kontrolü
quota -u kullanici_adi
repquota -a

Eski Kernel ve Sistem Dosyaları

Özellikle Ubuntu sistemlerinde eski kernel dosyaları /boot dizinini doldurabilir. Bu çok yaygın bir sorundur.

# Mevcut kernel'i göster
uname -r

# Kurulu tüm kernel'leri listele (Debian/Ubuntu)
dpkg --list | grep linux-image

# Kullanılmayan eski kernel'leri temizle
apt autoremove --purge

# /boot boyutunu kontrol et
df -h /boot
du -sh /boot/*

/boot disk dolduğunda sistem yeni kernel güncellemelerini uygulayamaz ve bu ciddi bir güvenlik riskidir. Bu durumu monitoring ile takip etmek önemlidir.

Yedek ve Arşiv Dosyaları

Sistem yöneticileri çoğu zaman yedekleri uygunsuz yerlere atar veya eski yedekleri silmeyi unutur.

# Sıkıştırılmış arşiv dosyalarını bul
find / -type f ( -name "*.tar.gz" -o -name "*.zip" -o -name "*.tar.bz2" -o -name "*.tgz" ) 2>/dev/null -exec du -sh {} ; | sort -rh | head -20

# SQL dump dosyalarını bul
find / -type f -name "*.sql" -o -name "*.sql.gz" 2>/dev/null | xargs du -sh 2>/dev/null | sort -rh | head -10

# Belirli bir günden eski yedekleri bul
find /backup -type f -mtime +90 2>/dev/null | xargs ls -lh | head -20

Proaktif Monitoring: Bir Daha Uyanma

Sorunu çözdükten sonra asıl önemli kısım tekrar yaşanmamasını sağlamak. İzleme olmadan yönetim olmaz.

Basit bir disk doluluk alarm scripti:

#!/bin/bash
# /usr/local/bin/disk-monitor.sh

ESIK=85
EMAIL="[email protected]"
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
        MESAJ="UYARI: $HOSTNAME sunucusunda $PARTITION bölümü %$KULLANIM doluluk oranına ulaştı!"
        echo "$MESAJ" | mail -s "Disk Doluluk Uyarısı - $HOSTNAME" $EMAIL
        logger -t disk-monitor "$MESAJ"
    fi
done

Bu scripti cron’a ekle:

# Her 30 dakikada bir çalıştır
*/30 * * * * /usr/local/bin/disk-monitor.sh

# Crontab'a ekle
crontab -e

Eğer Prometheus veya Zabbix gibi bir monitoring sisteminiz varsa disk metriklerini oraya entegre etmek çok daha sağlıklıdır. node_exporter kullanıyorsan disk metrikleri zaten otomatik olarak toplanıyor demektir.

Dosya Sistemi Boyutunu Artırma

Temizlik yapıldı ama yetmiyorsa veya kalıcı çözüm gerekiyorsa dosya sistemi boyutunu artırman gerekebilir. LVM kullanıyorsan bu oldukça kolay:

# LVM durumunu göster
lvdisplay
vgdisplay

# Volume group'ta boş alan varsa logical volume'ü genişlet
lvextend -L +20G /dev/mapper/vg0-var

# Dosya sistemini yeniden boyutlandır (ext4 için)
resize2fs /dev/mapper/vg0-var

# XFS için (XFS küçültemezsin, sadece büyütebilirsin)
xfs_growfs /var

Bu işlemi canlı sistemde, unmount etmeden yapabilirsin. Ama yine de önemli adımlar öncesinde snapshot almayı unutma.

Sonuç

Disk yönetimi reaktif değil, proaktif bir iş olmalı. Sorun çıkınca koşturmak yerine düzenli monitoring, otomatik log rotasyonu ve periyodik temizlik prosedürleri hayatını çok kolaylaştırır.

Özetlemek gerekirse; df -hT ile genel durumu gör, du -sh ile suçluyu bul, log dosyalarını ve package cache’i temizle, silinmiş ama açık tutulan dosyaları kontrol et, Docker varsa düzenli olarak prune yap. Bunları bir checklist olarak haftaya bir çalıştırmanı öneririm.

Bir de şunu söyleyeyim: temizlemeden önce mutlaka ne sildiğini bil. “Hızlı temizlik” yaparken kritik bir veritabanı dosyasını veya konfigürasyonu silen sistem yöneticileri maalesef az değil. Şüphe ettiğin her şeyi önce bir yere yedekle, sonra sil. Disk alanı kurtarmak, kaybettiğin veriyi geri getirmekten her zaman daha kolaydır.

Yorum yapın