Linux'ta Disk Kullanımını İnceleme ve Yönetme
Sunucuya bağlanıyorsunuz, basit bir paket kurmak istiyorsunuz ve karşınıza "No space left on device" çıkıyor. Ya da masaüstü Linux'unuzda dosya yöneticisi kırmızı bir çubuk gösteriyor. İlk refleks genellikle rastgele klasörleri açıp göz kararı silmeye çalışmak oluyor — oysa Linux'ta disk alanı sorununu iki komutla, dakikalar içinde tam olarak haritalandırabilirsiniz.
Önce soru: Disk gerçekten dolu mu?
Kulağa saçma gelebilir ama "dolu" uyarısının her zaman veri hacmiyle ilgisi yoktur. Üç ayrı durum aynı hatayı üretir:
- Blok alanı bitmiştir: Klasik senaryo, dosyalar yer kaplamıştır.
- Inode'lar tükenmiştir: Milyonlarca minik dosya (cache, oturum dosyaları, mail kuyruğu) alan bırakır ama dosya sistemi yeni kayıt açamaz.
- Silinmiş ama hâlâ açık dosyalar vardır: Log dosyasını sildiniz, fakat onu tutan süreç çalıştığı için alan geri dönmedi.
Bu yüzden ilk komut her zaman aynı olmalı:
df -h → insan okunur birimlerle bölüm doluluğu
df -i → inode doluluğu
Eğer df -h %100 diyorsa blok alanı, df -i %100 diyorsa inode sorunu var demektir. İkisi de normalse büyük ihtimalle üçüncü senaryodasınız.
df ile du neden farklı sonuç veriyor?
En sık sorulan soru bu. df dosya sistemine sorar: "kaç blok ayrılmış?" du ise dizinleri gezip dosya boyutlarını toplar. Silinmiş ama bir süreç tarafından açık tutulan dosya du tarafından görülmez, df tarafından sayılır. Aradaki fark birkaç gigabaytsa şu komut suçluyu bulur:
lsof +L1 — link sayısı sıfır olan, yani silinmiş ama açık dosyaları listeler. İlgili servisi yeniden başlattığınızda alan anında geri gelir.
Hangi dizin şişmiş? du komutunun doğru kullanımı
Tüm diski tek seferde taramak yerine katman katman inmek en hızlısı:
du -h --max-depth=1 / 2>/dev/null | sort -h— kök dizindeki en büyük klasörleri sıralar.- Şüpheli klasöre girip aynı komutu tekrarlayın:
du -h --max-depth=1 /var | sort -h - Bir üst seviyeye kadar inince suçluyu bulursunuz: genellikle
/var/log,/var/lib/docker,/home/kullanici/.cacheveya eski çekirdek paketleri.
sort -h kısmı önemli; onsuz 900M ile 2G'yi alfabetik sıralar ve yanıltır. 2>/dev/null ise /proc gibi dizinlerden gelen izin hatalarını susturur.
Tek tek büyük dosyaları bulmak
Dizin değil de tek bir dev dosya arıyorsanız:
find / -xdev -type f -size +500M -exec ls -lh {} \;
-xdev parametresi taramanın başka bağlı disklere atlamasını engeller — ağ paylaşımı bağlıysa hayat kurtarır.
Araçları karşılaştıralım
| Araç | Ne yapar | Güçlü yanı | Zayıf yanı |
|---|---|---|---|
| df | Bölüm bazında doluluk | Anında sonuç, inode de gösterir | Hangi dosyanın suçlu olduğunu söylemez |
| du | Dizin boyutlarını toplar | Her sistemde kurulu, script'e uygun | Büyük disklerde yavaş, çıktı okunması zor |
| ncdu | Etkileşimli terminal arayüzü | Ok tuşlarıyla gezinme, doğrudan silme | Ayrıca kurulması gerekir |
| find | Kritere göre dosya arar | Boyut, tarih, tür filtreleri | Sözdizimi uzun, dikkat ister |
| lsof +L1 | Silinmiş açık dosyalar | df/du farkını çözer | Yalnızca bu özel duruma yarar |
Günlük kullanımda tavsiyem: df -h ile teşhis, ncdu ile keşif. ncdu /var yazıp Enter'a bastığınızda klasörler büyükten küçüğe sıralı gelir, ok tuşlarıyla içine girer, d tuşuyla silersiniz. Tarama süresini kısaltmak için mutlaka bir alt dizinden başlatın.
Yer boşaltırken nereye bakmalı?
- Sistem günlükleri: systemd kullanan dağıtımlarda
journalctl --disk-usageile boyutu görün,journalctl --vacuum-size=200Mile kırpın. - Paket önbelleği: Debian/Ubuntu'da
apt clean, Fedora'dadnf clean all, Arch'ta pacman önbellek dizini. - Eski çekirdekler:
/bootbölümü küçük olduğu için ilk dolan yer burasıdır; kullanılmayan kernel paketlerini kaldırın. - Docker:
docker system dfile durumu görün,docker system pruneile kullanılmayan katmanları temizleyin. - Kullanıcı önbelleği: Masaüstünde
~/.cachesessizce onlarca gigabayta ulaşabilir.
Silmeden önce hangi soruyu sormalıyım?
"Bu dosya yeniden üretilebilir mi?" Önbellek, log ve paket arşivleri evet; veritabanı dizini ve yapılandırma dosy