"No space left on device" ama disk boş görünüyor: inode dolmuş olabilir
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 binlercesess_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
- Disk doldu, sunucumda nasıl yer açarım?
- Yüksek işlemci (CPU) veya bellek (RAM) kullanımı nasıl çözülür?
- Linux'ta logrotate ile günlük dosyalarının büyümesini önleme
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.
Geri bildiriminiz için teşekkürler!