itsrda

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 -rf komutunu 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. Betiklerde set -u kullanın.
  • Sistem dizinlerinde (/usr, /lib, /etc) elle silme yapmayın; paket yöneticisini kullanın.
  • Silmeden önce ls -lh ve du -sh ile 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ış

  1. df -h ve df -i: hangi bölüm, hangi sınır?
  2. du -xh --max-depth=1 ya da ncdu: en büyük dizin hangisi?
  3. Nedeni belirleyin (günlük, yedek, veritabanı, önbellek).
  4. lsof +L1: silinmiş ama açık dosya var mı?
  5. Güvenle temizleyin, sınır koyun ve alarm kurun.
Not: Komutları üretim ortamında çalıştırmadan önce yedek alın ve önce test ortamında deneyin. Bir adım sizde farklı davranıyorsa bize yazın, rehberi güncelleyelim.