Disk doldu uyarısı aldığınızda ya da sistemin yavaşladığını fark ettiğinizde ilk yapmanız gereken şey, hangi dosyaların ne kadar yer kapladığını anlamaktır. Linux’ta bu işi yapmak için onlarca araç ve yöntem var ama hangisini ne zaman kullanacağınızı bilmek, işi gerçekten hızlandırıyor. Bu yazıda büyük dosyaları bulma, analiz etme ve güvenli şekilde temizleme konusunda sahada işe yarayan teknikleri paylaşacağım.
Disk Kullanımını Anlamak: İlk Adım
Büyük dosyaları aramadan önce genel resmi görmek gerekiyor. df ve du komutları bu noktada en temel silahlarınız.
# Disk kullanımına genel bakış
df -h
# Belirli bir dizinin toplam boyutunu görmek
du -sh /var
# Bir dizin altındaki her klasörün boyutunu sıralı görmek
du -h --max-depth=1 /var | sort -rh
du -h --max-depth=1 /var | sort -rh komutu pratikte çok işe yarıyor. Örneğin /var altında /var/log mu yoksa /var/lib mi daha fazla yer kaplıyor, bunu saniyeler içinde anlıyorsunuz. sort -rh kısmındaki -r büyükten küçüğe sıralıyor, -h ise “human readable” yani GB, MB gibi boyutları doğru karşılaştırıyor.
Bir prodüksiyon sunucusunda /var/log‘un 80 GB’a ulaştığını gördüğümde tam olarak bu komutu kullanmıştım. Sorun, bir servisin hata logu yazarken log rotasyonunun devreye girmemesiydi. Ama o noktaya nasıl geldiğimizi anlamak için önce du ile hangi dizinin şiştiğini tespit etmek gerekiyordu.
find Komutu ile Büyük Dosyaları Bulmak
find komutu, büyük dosya avında en güçlü araçtır. Boyut, tarih, tür ve sahiplik gibi onlarca kriter kombinasyonuyla arama yapabilirsiniz.
# 100 MB'dan büyük tüm dosyaları bul
find / -type f -size +100M 2>/dev/null
# Belirli bir dizinde 500 MB'dan büyük dosyaları bul ve boyutlarıyla listele
find /var -type f -size +500M -exec ls -lh {} ; 2>/dev/null
# 1 GB'dan büyük dosyaları bul ve sıralı göster
find / -type f -size +1G -exec du -h {} ; 2>/dev/null | sort -rh
2>/dev/null kısmını es geçmeyin. Özellikle /proc ve /sys gibi sanal dosya sistemlerine erişim hatası aldığınızda terminal çıktısını hata mesajlarıyla doldurmamak için bunu ekliyoruz. Gereksiz hataları bastırıyor ve temiz bir çıktı elde ediyorsunuz.
find Parametrelerini Doğru Kullanmak
-size parametresinde kullandığınız birimler önemli:
- +100M: 100 Megabyte’tan büyük
- +1G: 1 Gigabyte’tan büyük
- +500k: 500 Kilobyte’tan büyük
- -size 0: Boş dosyalar (0 byte)
Boyut filtresiyle birlikte zaman filtresini de kullanabilirsiniz:
# Son 7 gün içinde değiştirilmiş ve 50 MB'dan büyük dosyalar
find /home -type f -size +50M -mtime -7 2>/dev/null
# 30 günden uzun süredir erişilmemiş büyük log dosyaları
find /var/log -type f -size +10M -atime +30 2>/dev/null
# Belirli uzantıya sahip büyük dosyaları bul
find / -type f -name "*.log" -size +50M 2>/dev/null | head -20
-mtime -7 son 7 gün içinde değiştirilenleri, +30 ise 30 günden daha eski dosyaları gösteriyor. Bu farkı bilmek önemli çünkü yanlış kullanınca tam tersi sonuç alırsınız.
ncdu: Görsel ve İnteraktif Disk Analizi
Komut satırında disk analizi için ncdu (NCurses Disk Usage) adeta oyun değiştirici bir araç. Standart dağıtımlarda gelmeyebilir ama kurulumu dakikalar alıyor.
# Ubuntu/Debian
apt install ncdu
# CentOS/RHEL/Rocky Linux
yum install ncdu
# veya
dnf install ncdu
# ncdu ile belirli bir dizini analiz etmek
ncdu /var
# Tüm sistemi analiz etmek (sanal dosya sistemlerini hariç tut)
ncdu -x /
-x parametresi çok önemli. Bu parametre, ncdu‘nun sadece mevcut dosya sisteminde kalmasını sağlıyor. Olmadan /proc veya /sys gibi sanal dizinlere girmeye çalışır ve anlamsız sonuçlar çıkabilir. Özellikle tüm sistemi tararken mutlaka kullanın.
ncdu çalıştırdığınızda ok tuşlarıyla dizinler arasında gezebilir, d tuşuyla doğrudan silme işlemi yapabilir, s ile boyuta göre sıralama yapabilirsiniz. Büyük dosyaları görsel olarak takip etmek için ideal.
Log Dosyalarını Temizlemek
Prodüksiyon ortamlarında disk dolmasının en yaygın sebebi log dosyalarıdır. /var/log altında binlerce satır hata logu birikmiş olabilir.
# Log dizinindeki büyük dosyaları listele
find /var/log -type f -size +100M -exec ls -lh {} ; 2>/dev/null
# Bir log dosyasını truncate ile temizlemek (dosyayı silmeden)
truncate -s 0 /var/log/syslog
# Eski log dosyalarını bulmak ve silmek (30 günden eski)
find /var/log -name "*.gz" -mtime +30 -delete
# journald loglarını temizlemek
journalctl --vacuum-time=7d
journalctl --vacuum-size=500M
Önemli not: Log dosyalarını silmek yerine truncate -s 0 ile içini boşaltmak çok daha güvenli. Çünkü bir servis o dosyaya aktif olarak yazıyor olabilir. Dosyayı sildiğinizde, servis eski dosya tanımlayıcısına yazmaya devam eder ve disk alanı serbest kalmaz. truncate ise dosyayı açık bırakarak içini sıfırlar.
journalctl --vacuum-time=7d komutu systemd journal loglarını son 7 günden eskilerini temizler. --vacuum-size=500M ise journal boyutunu 500 MB altına indirir. Özellikle Ubuntu ve modern CentOS/RHEL sistemlerde journald çok yer kaplıyor olabilir.
Büyük Dosya Tipleri: Core Dump ve Geçici Dosyalar
Sistem çöküşlerinden sonra oluşan core dump dosyaları ve uygulama geçici dosyaları fark edilmeden devasa boyutlara ulaşabilir.
# Core dump dosyalarını bul
find / -name "core" -o -name "core.*" -type f 2>/dev/null | xargs ls -lh 2>/dev/null
# /tmp dizinindeki eski dosyaları temizle (7 günden eski)
find /tmp -type f -atime +7 -delete
# /tmp altında büyük dosyaları bul
find /tmp -type f -size +50M 2>/dev/null
# Sistemdeki tüm .tmp uzantılı dosyaları bul
find / -name "*.tmp" -size +10M 2>/dev/null | head -20
Core dump dosyaları analiz için gerekli olabilir, bu yüzden silmeden önce log kayıtlarına bakın. Eğer debugger ile incelediyseniz veya ihtiyaç kalmadıysa silebilirsiniz.
Uygulama Cache Dosyalarını Temizlemek
# apt cache temizleme (Debian/Ubuntu)
apt clean
apt autoclean
# yum/dnf cache temizleme
yum clean all
dnf clean all
# pip cache temizleme
pip cache purge
# npm cache temizleme
npm cache clean --force
# Docker kullanıyorsanız kullanılmayan katmanları temizle
docker system prune -a
apt clean tüm indirilen paket dosyalarını siler, apt autoclean ise sadece eski ve artık kullanılmayan olanları temizler. Prodüksiyon sunucularda apt clean tercih edilebilir çünkü cache’i tamamen boşaltır. docker system prune -a ise kullanılmayan tüm image, container ve network’leri temizler, Docker kullanan sistemlerde düzenli çalıştırılmalı.
Duplicate (Yinelenen) Dosyaları Bulmak
Özellikle developer makinelerinde veya backup karmaşasında aynı dosyanın birden fazla kopyası bulunabilir. fdupes aracı bu konuda çok kullanışlı.
# fdupes kurulumu
apt install fdupes
# Belirli bir dizindeki kopyaları bul
fdupes -r /home/user/Downloads
# Kopya dosyaları boyutlarıyla göster
fdupes -rS /home/user/Documents
# Onay alarak kopyaları sil
fdupes -rd /home/user/Downloads
-r recursive yani alt dizinlere de bakıyor, -S boyutları gösteriyor, -d ise interaktif silme moduna giriyor. Silmeden önce -r ile kontrol etmek ve hangi dosyaların kopya olduğunu görmek iyi bir alışkanlık.
Inode Dolulugu: Boyut Kucuk Ama Yer Yok
Bazen df -h makul bir kullanım yüzdesi gösterirken sisteme yeni dosya oluşturamıyor olabilirsiniz. Bu durumda inode tükenmesi söz konusu olabilir.
# Inode kullanımını kontrol et
df -i
# En fazla inode kullanan dizini bul
find / -xdev -type f 2>/dev/null | cut -d "/" -f 2 | sort | uniq -c | sort -rn | head -10
# Küçük ama çok sayıda dosya olan dizinleri bul
for dir in /var/spool /tmp /var/cache; do
echo "$dir: $(find $dir -type f 2>/dev/null | wc -l) dosya"
done
Mail spool, PHP session dosyaları ve küçük cache dosyaları inode tükenmesinin başlıca nedenleridir. /var/spool/mail ve /var/spool/postfix altında yüz binlerce küçük dosya birikmiş olabilir.
Büyük Dosyaları Sıkıştırarak Yer Kazanmak
Silmek yerine sıkıştırarak yer kazanmak daha güvenli bir yaklaşım olabilir, özellikle log dosyaları için.
# Tek bir büyük log dosyasını sıkıştır
gzip /var/log/büyük_uygulama.log
# Bir dizindeki tüm eski logları sıkıştır
find /var/log -name "*.log.*" -not -name "*.gz" -mtime +3 -exec gzip {} ;
# xz ile daha iyi sıkıştırma (daha yavaş ama daha küçük)
xz -9 /path/to/büyük-dosya.log
# Sıkıştırılmış boyutu önceden tahmin etmek
gzip --best --stdout büyük-dosya.log | wc -c | numfmt --to=iec
gzip hız ve sıkıştırma oranı arasında iyi bir denge sunar. xz -9 daha iyi sıkıştırma yapıyor ama işlemci ve zaman maliyeti yüksek. Büyük log dosyaları için genellikle gzip yeterli.
Gerçek Dünya Senaryosu: /var Doldu Alarmı
Gece saat 02:00’de bir prodüksiyon sunucusunda /var %95 doldu alarmı geldiğini düşünelim. İşte adım adım nasıl yaklaşılır:
# 1. Genel durumu anla
df -h
# 2. /var altında en büyük dizinleri bul
du -h --max-depth=2 /var | sort -rh | head -20
# 3. Büyük dosyaları listele
find /var -type f -size +500M 2>/dev/null -exec ls -lh {} ;
# 4. Hangi process hangi dosyayı açık tutuyor kontrol et
# (silinen ama hala kullanılan dosyalar için)
lsof | grep deleted | awk '{print $7, $1, $2}' | sort -rn | head -20
# 5. Güvenli şekilde büyük log dosyasını temizle
truncate -s 0 /var/log/problem-uygulama.log
# 6. Eski sıkıştırılmış logları temizle
find /var/log -name "*.gz" -mtime +30 -delete
# 7. journald temizle
journalctl --vacuum-size=200M
lsof | grep deleted komutu kritik öneme sahip. Bir dosyayı silerseniz ama bir process o dosyayı açık tutuyorsa, disk alanı serbest kalmaz. lsof ile silinen ama hala açık tutulan dosyaları görebilirsiniz. O process’i yeniden başlatmak ya da truncate kullanmak bu durumda doğru yaklaşım.
Otomatik Temizlik Script’i
Düzenli disk temizliği için basit ama etkili bir script yazabilirsiniz:
#!/bin/bash
# disk-temizlik.sh
LOG_FILE="/var/log/disk-temizlik.log"
ESIK=80 # Disk doluluk uyarı eşiği (%)
echo "$(date) - Disk temizlik başladı" >> $LOG_FILE
# Disk kullanımını kontrol et
KULLANIM=$(df -h / | awk 'NR==2 {print $5}' | tr -d '%')
if [ "$KULLANIM" -gt "$ESIK" ]; then
echo "$(date) - Disk %$KULLANIM dolu, temizlik yapılıyor" >> $LOG_FILE
# 30 günden eski sıkıştırılmış logları sil
find /var/log -name "*.gz" -mtime +30 -delete
echo "$(date) - Eski loglar temizlendi" >> $LOG_FILE
# apt cache temizle
apt clean 2>/dev/null
echo "$(date) - APT cache temizlendi" >> $LOG_FILE
# journald temizle
journalctl --vacuum-time=14d >> $LOG_FILE 2>&1
# /tmp altındaki eski dosyaları temizle
find /tmp -type f -atime +7 -delete
# Yeni disk durumunu logla
df -h / >> $LOG_FILE
fi
echo "$(date) - Disk temizlik tamamlandı" >> $LOG_FILE
Bu script’i crontab’a ekleyerek düzenli çalıştırabilirsiniz:
# Her gün gece 03:00'da çalıştır
0 3 * * * /usr/local/bin/disk-temizlik.sh
Silme İşleminden Önce Güvenlik Kontrolleri
Büyük dosyaları bulmak bir şey, doğru olanı silmek başka bir şey. Birkaç altın kural:
- Silmeden önce
ls -lhile dosyayı inceleyin. Sahip, izinler ve son değişiklik tarihi size çok şey söyler. - Aktif olarak kullanılan dosyaları silmeyin.
lsof /path/to/filekomutu o dosyayı hangi process’lerin açtığını gösterir. - Log dosyalarını silmek yerine
truncate -s 0kullanın. Daha önce söyledim ama tekrar söylemeye değer. - Kritik dosyaları silmeden önce yedek alın.
cp büyük-dosya.log büyük-dosya.log.backupyeterli. -deleteparametresini kullanmadan öncefindkomutunu-deleteolmadan çalıştırın. Ne silineceğini önce görün.
# Önce ne silineceğini gör
find /var/log -name "*.gz" -mtime +30
# Sonuç makul görünüyorsa sil
find /var/log -name "*.gz" -mtime +30 -delete
Bu basit iki adımlı yaklaşım pek çok felaketi önler. -delete parametresini doğrudan ekleyip çalıştırmak kötü bir alışkanlık.
Disk Doluluğunu İzlemek: Proaktif Yaklaşım
Sorun çıktıktan sonra değil, çıkmadan önce haberdar olmak için basit bir izleme mekanizması kurmak gerekiyor.
# Disk kullanımını e-posta ile bildiren basit script
#!/bin/bash
ESIK=85
EMAIL="[email protected]"
df -h | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{print $5 " " $6}' | while read OUTPUT; do
KULLANIM=$(echo $OUTPUT | awk '{print $1}' | tr -d '%')
MOUNT=$(echo $OUTPUT | awk '{print $2}')
if [ "$KULLANIM" -ge "$ESIK" ]; then
echo "UYARI: $MOUNT diskinde kullanım %$KULLANIM'e ulaştı" |
mail -s "Disk Doluluk Uyarısı: $(hostname)" $EMAIL
fi
done
Daha gelişmiş bir ortamda Prometheus + Grafana veya Zabbix ile disk metriklerini izlemek çok daha iyi ama basit bir cron job da işinizi görür.
Sonuç
Disk yönetimi, sysadmin işinin vazgeçilmez bir parçası ve proaktif davranmak her zaman reaktif müdahaleden daha az stresli. Özetlemek gerekirse:
df -hvedu -h --max-depth=1ile hızlı genel bakış yapınfindile boyut ve tarih kombinasyonunda büyük dosyaları tespit edinncduile interaktif ve görsel analiz yapın- Log dosyalarını silmek yerine
truncate -s 0ile temizleyin lsof | grep deletedile silinen ama hala tutulan dosyaları kontrol edinjournalctl --vacuum-timeile journald’ı düzenli temizleyin- Temizlik işlemlerini otomatize edin ve disk doluluk uyarılarını kurun
Gece yarısı alarm almanın önüne geçmenin en iyi yolu, hangi dizinin hangi hızda büyüdüğünü günlük takip etmek. Bir hafta boyunca du -h --max-depth=2 /var | sort -rh çıktısını kaydedin, trend analizi yapın. Nereye dikkat etmeniz gerektiğini kısa sürede anlarsınız.