Linux'ta Disk Doldu: Neyin Yer Kapladığını Bulmak ve Güvenle Temizlemek
df, du, ncdu ve lsof ile diskin neden dolduğunu bulmak; günlükler, paket önbelleği ve eski yedekler gibi sık nedenleri güvenle temizlemek ve tekrarını önlemek için sistematik bir yöntem.
"No space left on device" hatası, genellikle en kötü zamanda gelir: veritabanı yazamaz, servis başlamaz, yedek yarım kalır. Panik içinde dosya silmek ise çoğu zaman yeni sorun yaratır. Bu yazıda diskin neden dolduğunu sistemli biçimde bulmayı, neyin güvenle silinebileceğini ve sorunun tekrarlanmasını nasıl önleyeceğinizi anlatıyoruz.
1. Durumu görün
df -h
Use% sütunu %100'e yakın olan satıra bakın. Kök dosya sistemi (/) mı dolu, yoksa ayrı bir bölüm (/var, /home, bir USB disk) mi? Hangi bağlama noktasının dolduğunu bilmek, aramanızı daraltır.
Bir de inode durumuna bakın. Çok sayıda küçük dosya, disk boş görünse bile inode'ları tüketebilir:
df -i
IUse% %100 ise sorun, dosya sayısıdır (genellikle bir uygulamanın biriktirdiği milyonlarca küçük dosya, oturum ya da önbellek dosyası).
2. Büyük dizinleri bulun
En büyük dizinleri, tek dosya sistemi içinde kalarak listeleyin:
sudo du -xh --max-depth=1 / 2>/dev/null | sort -h | tail -15
-x başka dosya sistemlerine (örneğin /proc ya da bağlı disklere) geçmez; sort -h insan okunur boyutları sıralar. En büyük dizini bulduktan sonra aynı komutu o dizin için tekrarlayın ve adım adım inin:
sudo du -xh --max-depth=1 /var | sort -h | tail
Etkileşimli bir araç isterseniz ncdu çok kullanışlıdır:
sudo apt install ncdu
sudo ncdu -x /
Ok tuşlarıyla gezinir, hangi dizinin ne kadar yer kapladığını görürsünüz. Silme özelliği de vardır; ama silmeden önce ne sildiğinizi bilin.
Belirli bir boyutun üzerindeki dosyaları aramak için:
sudo find / -xdev -type f -size +200M -printf '%s\t%p\n' 2>/dev/null | sort -n | tail
3. Sık nedenler ve güvenli çözümler
Sistem günlükleri. /var/log ve journal zamanla şişebilir.
journalctl --disk-usage
sudo journalctl --vacuum-size=200M
Journal'in kalıcı bir sınırı için ve günlük okuma yöntemleri için journalctl rehberine bakın. /var/log altındaki eski, sıkıştırılmış dosyalar (*.gz, *.1) logrotate tarafından yönetilir; elle silmek yerine rotasyon ayarını gözden geçirin.
Paket önbelleği.
sudo apt clean
sudo apt autoremove
apt clean indirilmiş paket dosyalarını siler (kurulu paketleri etkilemez). autoremove artık gereksiz kalmış bağımlılıkları kaldırır; ne sileceğini listeler, onaylamadan önce okuyun.
Eski yedekler. Yedek betiğiniz eski dosyaları silmiyorsa disk yavaş yavaş dolar. Rotasyon (örneğin 14 günden eskileri sil) ekleyin (örnek). Yedeği silerken aynı disk üzerindeki tek kopya olup olmadığına dikkat edin; 3-2-1 kuralı hatırlatır.
Veritabanı. MariaDB'nin ikili günlükleri (binlog) ve büyük tablolar yer kaplar. İkili günlüğü kullanmıyorsanız kapatmak ya da expire_logs_days ile sınırlamak gerekir. Veritabanı dosyalarını (/var/lib/mysql) elle silmeyin; bu veri kaybıdır.
Çekirdek dökümleri, eski kurulum dosyaları, indirilen arşivler. /home altında ~/.cache ve unutulmuş .zip, .tar.gz dosyalarına bakın.
Docker. Docker kullanıyorsanız docker system df hangi görüntü ve konteynerlerin yer kapladığını gösterir.
4. Silinmiş ama hâlâ açık dosyalar
En sinir bozucu durum: bir dosyayı silersiniz, df yine dolu gösterir. Bir süreç silinmiş dosyayı hâlâ açık tutuyor olabilir; dosya, süreç kapanana kadar diskten gitmez.
sudo lsof +L1
Bu komut, bağlantı sayısı sıfırın altında (silinmiş) ama açık olan dosyaları listeler. Tipik örnek: log dosyasını silmek ama yazan servisi yeniden başlatmamak. Çözüm, ilgili servisi yeniden başlatmaktır:
sudo systemctl restart servis_adi
Bundan kaçınmak için çalışan bir servisin log dosyasını silmek yerine boşaltın (: > dosya.log ya da truncate -s 0 dosya.log); ama en doğrusu logrotate kullanmaktır.
5. Güvenli silme kuralları
- Ne olduğunu bilmediğiniz şeyi silmeyin. Boyutu büyük olması, gereksiz olduğunu göstermez.
- Önce yedeğini alın ya da başka bir yere taşıyın; birkaç gün sonra silin.
rm -rfkomutunu bir değişkenle (rm -rf $DIZIN/*) kullanıyorsanız değişkenin boş olma ihtimalini düşünün; bu, felaketlerin klasik kaynağıdır. Betiklerdeset -ukullanın.- Sistem dizinlerinde (
/usr,/lib,/etc) elle silme yapmayın; paket yöneticisini kullanın. - Silmeden önce
ls -lhvedu -shile ne sileceğinizi görün.
6. Tekrarını önlemek
Diski bir kez temizlemek sorunu çözmez; neyin büyüdüğünü bulup ona sınır koyun:
- Günlüklere boyut sınırı (journald
SystemMaxUse, logrotate). - Yedek rotasyonu ve uzak kopya (rsync rehberi).
- Disk doluluğunda alarm: günlük özet e-postasında %85 üzerinde uyarı verin, izleme betiğiyle anlık haber alın.
- Büyüme hızını izleyin: haftada bir
df -hçıktısını bir dosyaya eklemek bile "diskin ne zaman dolacağını" tahmin etmeye yeter.
Bir SD kartta yer, hem ömür hem performans konusudur: %100'e yakın dolu bir kart, aşınma dengelemesi için boş alan bulamaz ve yavaşlar. Bu yüzden Raspberry Pi'de diski en fazla %70-80 dolu tutmak iyi bir hedeftir (SD kart ömrü).
Hızlı akış
df -hvedf -i: hangi bölüm, hangi sınır?du -xh --max-depth=1ya dancdu: en büyük dizin hangisi?- Nedeni belirleyin (günlük, yedek, veritabanı, önbellek).
lsof +L1: silinmiş ama açık dosya var mı?- Güvenle temizleyin, sınır koyun ve alarm kurun.