Disk Boşken «No space left on device» Hatası
Site çalışmıyor, uygulama günlüğü No space left on device hatasıyla dolu, ancak df -h diskin yüzde 60'ının boş olduğunu gösteriyor. Bu, inode'ların tükenmesinin klasik senaryosudur. Herhangi bir işlem yapmadan önce emin olmak için şu komutu çalıştırın:
df -i /
IUse% sütununa bakın. Değer 90'ın üzerindeyse sorun inode kaynaklıdır. Şimdi asıl soru: Bu kadar inode'u ne tüketti ve bunu nasıl bulmalısınız?
inode Nedir ve Tam Olarak Ne Bir Birimini Tüketir
Linux dosya sistemindeki her dosya, dizin, sembolik bağlantı, soket ve boru (pipe) bir inode'a sahiptir. Boş dosyalar da inode tüketir. 0 baytlık bir dosya, 10 gigabaytlık bir dosyayla tam olarak aynı miktarda inode tüketir. Bu, birçok kişiyi şaşırtan bir noktadır.
«Dosya sayısı» dediğimizde, pratikte kullanılan inode sayısını kastediyoruz. Her yeni dosya oluşturduğunuzda, boş havuzdan bir inode eksilir. Dosyayı silmek de onu geri getirir. Yani paylaşımlı hostingde inode sınırı, dosyaların hacmi değil, sahip olabileceğiniz dosya sayısının tavanı anlamına gelir.
Paylaşımlı hostingde en çok inode tüketen dört durum:
- Framework önbellekleri — Laravel,
storage/framework/viewsiçinde derlenen her görünüm için bir dosya oluşturur. Elementor gibi sayfa oluşturucuların önbellekleriyle WordPress de aynı şekildedir. - E-posta posta kutusu — Her e-posta, dosya sisteminde ayrı bir dosyadır. 50 bin eski e-postası olan bir posta kutusu 50 bin inode tüketmiştir.
- Oturum dosyaları —
/tmpveyasession.save_pathiçinde her açık oturum bir dosya oluşturur. Süresi dolmamış oturumlar, yoğun trafikli sitede hızla birikir. - Parçalı yedekler — Veritabanındaki her tabloyu tek bir sıkıştırılmış dosya yerine ayrı bir dosyaya kaydeden yedekleme işlemi.
Burada Hata Yapıyorlar: Büyük Dosyaları Silmek
inode hatası gördüğünüzde ilk tepki en büyük dosyalara yönelmektir. Bu işlemin hiçbir etkisi yoktur. 2 gigabaytlık bir dosyayı silmek yalnızca bir inode boşaltır. Sorun hacimden değil, sayıdan kaynaklanır. Bu hatanın işareti: df -h 10 gigabayt alan boşaldığını gösterir, ancak df -i hâlâ yüzde 99 dolu görünür ve site hata vermeye devam eder.
Paylaşımlı Hostingde inode Sayımının Kesin Yöntemi
cPanel veya DirectAdmin'li paylaşımlı hostingde genellikle panelde istatistikleri gösteren bir «File Usage» veya «inode Usage» bölümü bulunur. Ancak kesin sayıya ve klasör ayrımına ihtiyacınız varsa SSH kullanın. Hostinginizde SSH yoksa panelin Dosya Yöneticisi'ni kullanın ve klasörleri tek tek açın — yavaş ama etkili bir yöntem.
Bir klasördeki inode'ları saymak için ana komut:
find /home/kullanici -xdev -printf '%h\n' | sort | uniq -c | sort -rn | head -20
Bu komut, en fazla dosyaya sahip 20 klasörü gösterir. -xdev bayrağı, /proc ve /sys gibi sanal klasörlerin sonuca girmemesi için dosya sistemi sınırını aşmayı engeller. Çıktıya bakın; genellikle bir veya iki klasör yüzde 80'lik paya sahiptir.
Belirli bir klasördeki toplam dosya sayısını saymak için:
find /home/kullanici/public_html -type f | wc -l
Bir dizindeki dosya sayısını doğrudan alt klasörleriyle birlikte görmek için:
for d in /home/kullanici/public_html/*/; do echo "$(find "$d" -type f | wc -l) $d"; done | sort -rn | head
Genellikle En Büyük Payı Alan Klasörler
Müşteri hostinglerindeki deneyimlere göre, şu beş durum neredeyse her zaman listenin başında yer alır:
| Klasör | Tüketim Nedeni | Çözüm |
|---|---|---|
mail/ veya etc/ | Eski e-postaların birikmesi | Webmail'den eski e-postaları silme veya otomatik temizlik ayarlama |
public_html/wp-content/cache/ | Süresi dolmamış önbellekler | Eklentiyle veya elle önbelleği temizleme |
public_html/wp-content/uploads/ | WordPress'in yeniden boyutlandırdığı görseller | Eklentiyle ekstra boyutları silme |
tmp/ veya session/ | Süresi dolmamış oturumlar | session.gc_maxlifetime değerini daha düşük ayarlama |
logs/ | Döndürülmemiş günlükler | logrotate'i etkinleştirme |
Tespitten sonra gereksiz dosyaları silin ve tekrar df -i çalıştırın. Değer düşmezse, cron veya kuyruk çalışanı (queue worker) gibi bir işlem sürekli yeni dosya oluşturuyor olabilir. Bu durumda, silinmiş ancak hâlâ açık olan dosyaları görmek için lsof +L1 komutunu çalıştırın — bunlar inode'ları kilitler ve işlem kapanana kadar boşalmazlar.
Dosya Sayısı Doğası Gereği Fazla Olduğunda
Bazen sorun düzensizlikten kaynaklanmaz; proje yapısı on binlerce dosya gerektirir. On binlerce ürün görseli olan e-ticaret siteleri, yüksek hacimli mesajlara sahip e-posta hizmetleri veya node_modules ve vendor'ı hostingde tutan projeler — hepsi hızla sınıra ulaşır.
Bu durumda iki seçeneğiniz var. Birincisi: gereksiz dosyaları hostingden kaldırın ve ayrı bir depolama hizmetinde tutun. Ürün görsellerini CDN'ye taşıyın ve yalnızca küçültülmüş sürümleri hostingde tutun. İkincisi: dosya sayısı gerçekten işinizin doğasının bir parçasıysa, özel sunucuya geçin. Özel sunucuda, diski bölümlerken alanın yüzde kaçının inode'a ayrılacağına siz karar verirsiniz. ext4 formatı varsayılan olarak her 16 kilobayt alan için bir inode oluşturur; mkfs.ext4 içindeki -i bayrağıyla bu oranı değiştirebilirsiniz:
mkfs.ext4 -i 8192 /dev/sdb1
Bu komut her 8 kilobayt için bir inode oluşturur — varsayılanın iki katı. Maliyeti, daha fazla meta veri depoladığınız için kullanılabilir disk alanının biraz azalmasıdır. Günümüz NVMe diskleri için bu maliyet genellikle önemsizdir, ancak büyük ve az sayıda dosyanız varsa varsayılan oran daha verimlidir.
Önleme: Rakamları Önceden Bilin
Paylaşımlı hostingde inode sınırını hizmet özellikleri sayfasından veya destekten öğrenin. Bu sayı genellikle 50 bin ile 500 bin arasındadır. Ardından, her hafta durumu kontrol eden ve yüzde 80'i aşarsa size e-posta gönderen bir cron satırı ekleyin:
df -i / | awk 'NR==2 {if ($5+0 > 80) print "inode usage: " $5}' | mail -s "inode Alert" siz@ornek.com
Linux hostingdeyseniz ve SSH erişiminiz yoksa paneldeki araçları veya rapor dosyalarını kullanın. Önemli olan hatayı beklememektir; hata oluştuğunda site erişilemez hale gelir ve her dakikalık kesinti maliyetlidir.
Ayrıca WordPress kullanıyorsanız, önbellek eklentilerini eski dosyaları otomatik temizleyecek şekilde ayarlayın. WP Rocket gibi eklentilerde «Clear cache after…» seçeneği vardır. Sayfa oluşturucu kullanıyorsanız, CSS ve JS önbelleğini ayrı dosyalar yerine sıkıştırılmış modda tutun.
Sıkça Sorulan Sorular
Paylaşımlı hostingde inode sınırı ne kadardır?
Kesin sayı hosting şirketine ve planınıza bağlıdır ve genellikle 50 bin ile 500 bin inode arasında değişir. Bu sayıyı hizmet özellikleri sayfasından veya destekle iletişime geçerek öğrenin. Özel sunucuda, bu sayıyı bölümleme sırasında siz belirlersiniz.
Hangi klasörün en çok inode tükettiğini nasıl anlarım?
SSH'ınız varsa find /home/kullanici -xdev -printf '%h\n' | sort | uniq -c | sort -rn | head -20 komutunu çalıştırın. Çıktı, klasörleri dosya sayısına göre sıralı gösterir. SSH yoksa panelin Dosya Yöneticisi'ni kullanın ve mail, public_html ve tmp gibi ana klasörleri inceleyin.
Büyük dosyaları silmek inode boşaltır mı?
Dosyanın boyutundan bağımsız olarak silinen her dosya için yalnızca bir inode boşalır. Sorun küçük dosyaların sayısıysa, büyük dosyaları silmenin etkisi önemsizdir. Önce yüksek hacimli değil, yüksek dosya sayılı klasörleri tespit edin.
inode ile disk tüketimi arasındaki fark nedir?
Disk tüketimi bayt veya gigabayt cinsinden ölçülür ve veri hacmiyle ilgilidir. inode, dosya ve dizinlerin sayısını sayar. 10 gigabaytlık bir dosya bir inode tüketir ve 10 bin boş dosya da 10 bin inode tüketir — disk hacmi neredeyse sıfırken. Her iki sınır da birbirinden bağımsız çalışır.