"No space left on device" ama disk boş görünüyor: inode dolmuş olabilir

Linux Sunucu (SSH) 74 görüntülenme Markdown

Bir dosya oluşturmaya, paket kurmaya ya da uygulamanızın günlük yazmasına çalışıyorsunuz ve şu hatayı görüyorsunuz:

No space left on device

İlk refleks df -h yazmaktır. Disk yüzde 40 dolu görünüyor, yani hata mantıksız. Bu durumun klasik bir sebebi vardır: inode tükenmesi.

Inode nedir?

Linux dosya sistemi her dosya ve klasör için "inode" denen bir kayıt tutar. Disk oluşturulurken inode sayısı sabitlenir. Boyutu ne olursa olsun, bir dosya bir inode harcar. Yani milyonlarca küçük dosya (oturum dosyaları, önbellek, posta kuyruğu, günlük parçaları) disk alanını doldurmadan inode'ları bitirebilir. Inode biterse alan olsa bile yeni dosya oluşturulamaz.

Doğrulama

df -i

IUse% sütunu yüzde 100'e yakınsa sorun budur (df -h ise bayt kullanımını gösterir). Normal bir sunucuda bu oran birkaç yüzde civarındadır.

Çok dosyayı nerede olduğunu bulun

Dizinlerdeki dosya sayısını sayarak suçluyu arayın (kök dizinden başlayın, ardından daraltın):

sudo find / -xdev -type f | cut -d/ -f2-3 | sort | uniq -c | sort -rn | head

Bu komut en çok dosya içeren klasörleri sıralar. Büyük disklerde uzun sürebilir. Daha hedefli bakmak için bir klasörün içinde:

sudo find /var/lib/php/sessions -type f | wc -l

Sık görülen suçlular

  • PHP oturum dosyaları (/var/lib/php/sessions, /tmp): Temizlik çalışmıyorsa binlerce sess_ dosyası birikir.
  • Posta kuyruğu (/var/spool, /var/lib/postfix): Gönderilemeyen mailler birikir.
  • Uygulama önbellekleri (WordPress önbellek eklentileri, Laravel storage/framework).
  • Docker (/var/lib/docker): Eski katmanlar ve kapsayıcılar: docker system prune (dikkatle).
  • Eski çekirdek paketleri: sudo apt autoremove --purge.
  • Kontrolsüz büyüyen günlük dosyası parçaları: logrotate.

Temizlemek

Hangi klasörün gereksiz olduğundan emin olun. Örneğin 7 günden eski PHP oturum dosyalarını silmek:

sudo find /var/lib/php/sessions -type f -mtime +7 -delete

Bir klasörde milyonlarca dosya varsa rm -rf klasor/* "argument list too long" verir; bunun yerine find klasor -type f -delete kullanın. Silmeden önce -delete yerine -print | head ile neyi sileceğinizi görün.

Kalıcı çözüm

Nedeni (oturum temizliği, kuyruk, önbellek) düzeltmezseniz sorun geri gelir. İnode sayısı dosya sistemi oluşturulurken belirlendiğinden sonradan artırılamaz; ihtiyacınız büyükse veri için ayrı bir diskte inode yoğunluğu yüksek bir dosya sistemi kurmak gerekir: ek disk. Alan gerçekten bittiğinde ise disk doldu makalesine bakın.

Sık sorulanlar

Windows'ta da inode sorunu olur mu?

Windows NTFS'te inode kavramı yoktur; benzer sınır neredeyse hiç görülmez. Bu makale Linux içindir.

Hata sadece belirli bir klasörde çıkıyor.

Bölüm ayrıysa (örneğin /var ayrı bir disk) o bölümün inode'u bitmiş olabilir. df -i tüm bölümleri gösterir.

Disk de dolu değil inode da, yine hata var.

Dosya sistemi salt okunur hale gelmiş olabilir (disk hatası) ya da kota/silinmiş ama açık dosya vardır. mount | grep ' / ' ile ro var mı bakın; ayrıca sudo lsof +L1 silinmiş ama hâlâ açık dosyaları gösterir.

İlgili makaleler

Sorununuz çözülmediyse destek talebi açın. Hangi adımı denediğinizi ve ekranda ne gördüğünüzü yazarsanız çözüm çok daha hızlı olur.

Faydalı oldu mu?

Geri bildiriminiz için teşekkürler!

Hâlâ Yardıma mı İhtiyacınız Var?

Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.