Linux sunucuda disk doldu: No space left on device çözümü
“No space left on device” hatası, işlemin yazmak istediği yerde kullanılabilir kaynak kalmadığını gösterir. Diskteki boş alanın yanı sıra, inode adı verilen dosya kayıtları da tükenebilir. Çok sayıda küçük dosya bu kayıtları doldurabilir. Bu nedenle önce doğru dosya sistemini bulup alan ve inode değerlerini ayrı kontrol edeceğiz.
Bu rehber, Linux VPS veya VDS sunucuda disk doluluğunun nedenini bulma, güvenle alan açma ve sonucu doğrulama içindir. Veritabanı dosyalarını silmek, sunucuyu yeniden kurmak veya diski biçimlendirmek ilk çözüm değildir.
Gereken erişim: SSH ile sunucuya giriş ve gerektiğinde sudo yetkisi. Aşağıdaki bütün komutlar bağlandığınız sunucuda çalışır. root kullanıcısıyla bağlıysanız sudo önekini yazmanız gerekmez. Paylaşımlı hosting hesabındaki kota için aynı işlemleri sunucunun tamamına uygulayamazsınız; cPanel kaynak kullanımını kontrol edin.
Görseller, Ubuntu 24.04 LTS kullanan gerçek bir demo VPS üzerindendir. Hatalar, ana sistem bölümünden ayrı ve yalnız bu çalışma için hazırlanmış küçük test dosya sistemlerinde oluşturuldu. Kendi sunucunuzun diskini doldurmanız veya test dosya sistemi oluşturmanız gerekmez. Ekranlardaki /mnt/dchost-disk-demo-* yolları örneğe aittir; kendi uygulamanızın yazdığı yolu kullanın. Sunucuya özel bilgiler gizlenmiştir.
1. Hata hangi dosya sisteminde?
Hata veren işlemi, dosya yolunu, saati ve son değişikliği not edin. Yedekleme, dosya yükleme ve veritabanı işlemleri farklı klasörlere yazabilir. / bölümünde yer olması, ayrı bağlı /var veya /backup bölümünde de yer olduğunu göstermez.
Önce hata veren mevcut klasörü seçin. Aşağıdaki /var örneğini kendi yolunuzla değiştirin. Henüz oluşmamış bir dosya yerine en yakın mevcut üst klasörü kullanın:
CHECK_PATH=/var
date -Is
findmnt --target "$CHECK_PATH" --output SOURCE,FSTYPE,TARGET
df -hT -- "$CHECK_PATH"
df -i -- "$CHECK_PATH"
Komutları sırayla çalıştırın. No such file or directory alırsanız sonraki sonucu yorumlamadan önce yolu düzeltin. Bu komutlar dosya silmez.
| Ekrandaki alan | Nasıl okunur? |
|---|---|
TARGET / Mounted on | Seçtiğiniz klasörün bağlı olduğu dosya sistemi. Sonraki ölçümleri aynı yerde yapın. |
Avail ve Use% | Kullanılabilir alan ve alan doluluğu. Avail sıfırsa uygulamaların yazacak alanı kalmamış olabilir. |
IFree ve IUse% | Kullanılabilir inode sayısı ve inode doluluğu. Yeni dosya veya klasör için kayıt gerekir. |
FSTYPE / Type | Dosya sistemi türü. Ekranlardaki örnek ext4 kullanır. |
Hata veren klasörün hangi diskte olduğunu belirleyin; ardından alan ve inode kullanımını ayrı ayrı okuyun.


1. adım: Use% sütunu: disk alanı
- Use% sütunu: disk alanı
df -hT çıktısında Size toplam alanı, Avail kullanılabilir alanı, Use% ise doluluk oranını gösterir. Mounted on sütunundan doğru bağlama noktasını seçin.
- IUse% sütunu: inode kullanımı
df -i çıktısındaki IUse%, dosya ve dizin kayıtlarının doluluğunu gösterir. Diskte boş alan olsa bile IFree sıfıra düştüğünde yeni dosya oluşturulamayabilir.
Bu sağlıklı başlangıç ekranında kök diskin alan kullanımı %6, inode kullanımı %3. /dev/loop0 ve /dev/loop1, yalnız rehber için ayrılmış küçük test dosya sistemleridir; sunucunun kök diski doldurulmadı. Görsel, gerçek terminal kaydının ilgili bölümünden kırpılmıştır.
Hata mesajını okuyun; aynı dosya sisteminde df -hT ve df -i sonuçlarını karşılaştırın.


1. adım: Hata mesajını tanıyın
- Hata mesajını tanıyın
No space left on device, yazma işleminin tamamlanamadığını gösterir. Tek başına alan mı, inode mu tükendiğini söylemez.
- Avail ve Use% değerlerini okuyun
Avail 0 ve Use% %100. Aşağıdaki df -i çıktısında boş inode bulunduğu için bu örnekte alanı kullanan dosyaları araştırın.
Kontrollü demoda dolan yer, yalnız küçük test dosya sistemidir. Inode kullanımı %1 iken alan kullanımı %100 ve Avail 0 olduğu için bu örnekte sorun boş disk alanıdır.
Gerçek örnekte yalnız ayrı test dosya sistemi dolduruldu: ekranda 56M kapasite, 55M kullanım, 0 kullanılabilir alan ve %100 doluluk göründü. Inode kullanımı ise 18 / 16384, yani ekranda %1 idi. Yeni dosyaya yazma denemesi “No space left on device” hatası ve başarısız işlem koduyla bitti. Bu, alan doluluğu ile inode doluluğunun farklı olduğunu gösterir; ana sistem bölümünü doldurmak gerekmedi.
| Birlikte gördüğünüz durum | Sonraki adım |
|---|---|
| Alan dolu, inode kullanılabilir | Büyük klasörleri bulun. |
GB boş görünüyor, IFree sıfır veya IUse% %100 | Çok sayıda küçük dosyayı inceleyin. |
df dolu diyor, du çok daha az gösteriyor | Silinmiş ama açık dosyaları ve ölçüm kapsamını kontrol edin. |
| Alan ve inode yeterli ama belirli kullanıcı yazamıyor | Hesap/proje kotası, dosya sistemi türü ve tam hata mesajını inceleyin. Disk quota exceeded, Permission denied ve Read-only file system farklı sorunlardır. |
df -i bazı dosya sistemlerinde anlamlı bir sabit inode kapasitesi göstermez; - veya sıfır görmek tek başına “inode dolu” demek değildir. tmpfs, RAM destekli ayrı bir dosya sistemidir; oradaki doluluğu ana diskten dosya silerek çözemeyebilirsiniz. Konteyner, ağ diski veya özel depolama kullanıyorsanız ilgili katmanın sınırlarını ayrıca kontrol edin.
2. En çok yer kaplayan klasörü bulun
İlk adımdaki TARGET değerini esas alın. Değer / ise aşağıdaki ilk komutla başlayın. Farklı bir bağlama noktası gördüyseniz / yerine onu yazın:
sudo du -x -h --max-depth=1 -- / | sort -h
du, erişebildiği dosya ve klasörlerin kullandığı alanı toplar. -x, taramanın başka bir dosya sistemine geçmesini önler. --max-depth=1, yalnız ilk seviyedeki klasörlerin özetini gösterir. Son satırlarda büyük klasörleri arayın; toplam satırını ayrıca bir dosya gibi saymayın.
Örneğin en büyük klasör /var çıktıysa aynı ölçümü bu klasörde yapın:
sudo du -x -h --max-depth=1 -- /var | sort -h
Aynı yöntemle /var/log, /var/cache veya kendi uygulamanızın veri klasörüne ilerleyin. Bir klasörün büyük olması, içeriğinin gereksiz olduğu anlamına gelmez. Hata veya erişim uyarılarını gizlemeyin; okunamayan klasörler toplamı eksik bırakır. Çok sayıda dosya varsa tarama uzun sürebilir ve disk okuma yükünü artırabilir; bütün diski tekrar tekrar taramayın.
Önce du ile dizinleri karşılaştırın; ardından karar vermeden önce aday dosyanın bilgisini inceleyin.


1. adım: Alanı kullanan klasörü bulun
- Alanı kullanan klasörü bulun
Bu örnekte cache dizini 55M ile toplam kullanımın çoğunu oluşturuyor. du -x başka dosya sistemlerine geçmeden inceleme yapar.
- Dosyanın boyutunu doğrulayın
ls -lh, seçilen disposable-demo.bin dosyasının 55M olduğunu gösteriyor. Bu inceleme tek başına dosyanın silinebilir olduğu anlamına gelmez.
Bu dosya sadece rehber için oluşturulmuş, silinebileceği bilinen bir demo dosyasıdır. Gerçek sunucuda büyük görünen dosyaları görevini, sahibini ve yedeğini doğrulamadan silmeyin. Kayıttan yalnız ilgili terminal bölümü kırpılmıştır.
Demoda du çıktısı, test dosya sistemindeki cache klasöründe yaklaşık 55M kullanım gösterdi. Bunun nedeni yalnız rehber için oluşturulmuş disposable-demo.bin dosyasıydı. cache adı taşıyan her klasör veya .bin uzantılı her dosya güvenle silinebilir anlamına gelmez; bu dosyanın içeriği ve amacı önceden biliniyordu.
df ile du neden farklı sonuç verir?
df, dosya sisteminin genel doluluğunu; du, taradığı dosyaların kullandığı alanı gösterir. Aynı klasörü ve aynı dosya sistemini karşılaştırdığınızdan emin olun. Silinmiş ama açık dosyalar, dosya sistemi üstverileri, erişilemeyen klasörler ve başka bir bağlama noktasının altında kalan dosyalar fark oluşturabilir.
ls -lh ise dosyanın görünen uzunluğunu gösterir. Özellikle sparse dosyalarda bu değer, diskte gerçekten ayrılan alandan büyük olabilir. Bir dosyayı karşılaştırmak için du -h -- /tam/dosya/yolu kullanabilirsiniz. Aktif bağlama noktalarını sırf sayı eşitlemek için kaldırmayın.
Demoda alan nasıl geri kazanıldı?
Dosya kaldırmadan önce güvenli temizlik koşullarını kontrol edin. Aşağıdaki işlem yalnız içeriği bilinen ve bu çalışma için oluşturulmuş tek dosyaya uygulandı.
Yalnız belirlenen demo dosyası kaldırıldı; ardından aynı klasöre yeniden yazma denendi.


1. adım: Yazılan içeriği geri okuyun
- Yazılan içeriği geri okuyun
printf ile oluşturulan dosyayı cat açabiliyor ve Write test passed metni görünüyor. Böylece bu klasörde yazma ve okuma yeniden doğrulanıyor.
- Boş alanın geri geldiğini kontrol edin
Aynı dosya sisteminde Avail 55M ve Use% %1. Son olarak asıl uygulamanın hata veren işlemini de yeniden deneyin.
Silme komutu yalnız önceden tanımlanmış tek demo dosyasına uygulanmıştır. Write test passed metni yazılan dosyadan cat ile geri okunur; uygulamanızın sağlığını kontrol etmenin yerini tutmaz. Kayıttan yalnız ilgili terminal bölümü kırpılmıştır.
Görselli örnekte yalnız önceden oluşturduğumuz cache/disposable-demo.bin demo dosyası kaldırıldı. Sonraki yazma denemesi başarılı oldu ve dosya okununca Write test passed metni görüldü. Aynı test dosya sisteminde kullanım %100’den %1’e indi. Bu sonuç gerçek müşteri yedeği veya süresi dolmuş uygulama önbelleği temizlendiği anlamına gelmez; kaldırılan dosya yalnız kontrollü örnekti. Güvenli temizlik bölümündeki APT, DNF ve journal yöntemlerini kendi sunucunuzda bulduğunuz nedene göre değerlendirin.
Kök disk doldurulmadan ayrılmış test dosya sisteminde hata, dosya tespiti ve yeniden yazma kontrolü. Kayıt 1× hızda; bekleme aralıkları korunmuştur.
Kaydın yazılı anlatımı
- Ayrı test dosya sistemindeki klasöre yazma denenir; terminal “No space left on device” hatasını gösterir.
df -hTile alanın %100 dolu olduğu,df -iile kullanılabilir inode bulunduğu görülür.du,cacheklasöründeki yaklaşık 55M kullanımı gösterir.ls -lhile yalnız bu çalışma için oluşturulmuşdisposable-demo.binincelenir.- Silinebileceği önceden bilinen yalnız bu demo dosyası kaldırılır.
- Aynı konuma tekrar yazılır;
catileWrite test passediçeriği okunur. Sondfölçümünde kullanım %1 olur.
3. GB boş ama inode doluysa
Inode, dosyanın sahibi ve izinleri gibi bilgileri tutan kayıttır. Çok sayıda küçük önbellek dosyası, oturum dosyası veya kuyruk kaydı, toplam boyutu küçük olsa bile yeni dosya oluşturmayı engelleyebilir.
Önce dolu dosya sisteminin bağlama noktasında dosya sayısıyla ilişkili yoğunluğu ölçün. Örnekte / yazılmıştır; kendi TARGET değerinizi kullanın:
sudo du --inodes -x --max-depth=1 -- / | sort -n
En yüksek sayının çıktığı klasörde aynı komutu tekrarlayın. Örneğin sonuç /var klasörünü işaret ediyorsa:
sudo du --inodes -x --max-depth=1 -- /var | sort -n
Aynı No space left on device mesajı bu kez boş alan bulunmasına rağmen görülüyor.


1. adım: Önce boş alanı görün
- Önce boş alanı görün
df -hT çıktısı Avail 28M ve Use% %1 gösteriyor. Yalnız bu tabloya bakıp diskin sorunsuz olduğunu düşünmeyin.
- IFree sıfır: inode kalmamış
df -i çıktısında 128 kaydın tamamı kullanılmış, IFree 0 ve IUse% %100. Çok sayıdaki küçük dosyanın hangi uygulamaya ait olduğunu araştırın; silinebilirliğini ayrıca doğrulayın.
Bu kontrollü testte alan kullanımı yalnız %1. Yeni dosya oluşturulamamasının nedeni, küçük test dosya sistemindeki 128 inode kaydının tamamının kullanılması. Kök disk doldurulmadı.
Gerçek ölçümde inode dosya sisteminde 28M kapasitenin yalnız 40K kadarı kullanılıyordu; kullanılabilir alan 28M, alan doluluğu %1 idi. Buna karşılık 128 inode’un tamamı kullanılmıştı: IUse% %100. Yeni dosya oluşturma denemesi “No space left on device” hatasıyla başarısız oldu.
Demoda yalnız bu çalışma için oluşturulan 113 adet old-demo-*.tmp dosyasının değişiklik zamanı sekiz gün öncesine ayarlandı. Bu, gerçek bir uygulamanın dosyaları süresi dolmuş olarak işaretlediği anlamına gelmez. Aşağıdaki salt okunur seçim, yalnız test klasörünün ilk seviyesindeki bu ada uyan normal dosyaları listeler:
find /mnt/dchost-disk-demo-inodes/cache -xdev -maxdepth 1 -type f -name 'old-demo-*.tmp' -mtime +7 -print
Örnek dosya adlarını görün; silme işlemine geçmeden önce aynı ölçütlerle kaç dosyanın seçildiğini kontrol edin.


1. adım: Örnek adları kontrol edin
- Örnek adları kontrol edin
İlk beş sonuç, amaçlanan old-demo dosyaları olmalı. Yalnız dosya adının eski görünmesi gerçek sunucuda silme gerekçesi değildir.
- Seçilen dosya sayısını doğrulayın
Aynı koşullara uyan 113 dosya var. Sayı beklediğinizden yüksekse kapsamı daraltın; silme adımına geçmeyin.
Seçim yalnız cache klasöründeki old-demo-*.tmp adlı demo dosyalarını kapsıyor. -mtime +7, en az 8×24 saat önce değiştirilmiş dosyaları seçer; demodaki tarihler özellikle geriye alındı. Bu, gerçek uygulama önbelleğinin süresinin dolduğunu kanıtlamaz. Uzun komutlar alt satıra taşar.
GNU find içindeki -mtime +7, son değişiklikten bu yana en az 8 × 24 saat geçmiş dosyaları seçer. Süre tam 24 saatlik dönemlerle hesaplanır; +7, bu dönemlerin sayısının 7’den büyük olmasını ister. Bu, “son 7 gün kullanılmayan her şey” anlamına gelmez. Dosyanın yaşı, adı veya .tmp uzantısı tek başına silme izni değildir.
Gerçek denemede seçim önce listelendi ve sayıldı; ardından yalnız bu bilinen demo dosyaları aynı koşullarla kaldırıldı. Güncel active-demo.tmp ve ayrı uploads/keep-demo.txt örnekte korunacak dosyalardır. Kendi sunucunuzda bu seçimi rastgele bir klasöre uyarlayıp toplu silme çalıştırmayın.
Seçilen eski demo dosyaları kaldırıldı; yeni dosya oluşturma işlemi aynı klasörde tekrarlandı.


1. adım: Korunan ve yeni dosyayı birlikte kontrol edin
- Korunan ve yeni dosyayı birlikte kontrol edin
ls çıktısında active-demo.tmp hâlâ var; new-demo.txt ise yeni oluşturulmuş boş dosya. Sıfır boyut, touch ile oluşturulan bu dosya için beklenen sonuçtur.
- IFree ve IUse% sonuçlarını yeniden okuyun
Artık 112 inode boş ve kullanım %13. Gerçek sunucuda sorun çıkaran uygulama işlemini de yeniden deneyin.
Temizlik yalnız önceden listelenen 113 eski demo dosyasına uygulandı. Aktif demo dosyası korunuyor, yeni dosya oluşuyor ve IFree 112 görünüyor. Bu, uygulama verilerinin rastgele silinebileceği anlamına gelmez.
Yalnız seçilmiş 113 demo dosyası kaldırıldıktan sonra 36 baytlık active-demo.tmp yerinde kaldı ve new-demo.txt başarıyla oluşturuldu. Son ölçümde inode kullanımı 16 / 128 (%13), boş inode sayısı 112 oldu. Bu sonuç, GB kapasitesiyle dosya kaydı kapasitesinin ayrı denetlenmesi gerektiğini gösterir.
Silinecek dosyaların hangi uygulamaya ait olduğunu belirleyin. Uygulamanın süresi dolmuş önbellek/oturum temizleme yöntemini veya kuyruk yönetimini kullanın. Yalnız dosya sayısı çok diye posta kuyruğunu, oturumları veya uygulama verisini topluca silmeyin; teslim edilmemiş e-posta, aktif oturum ve iş kaydı kaybolabilir.
Temizlikten sonra aynı df -i -- "$CHECK_PATH" komutuyla IFree değerinin arttığını doğrulayın. Inode sorunuysa yalnız büyük tek bir dosyayı silmek yeterli olmayabilir. Yeni küçük dosyaları üreten işi ve saklama süresini düzeltmezseniz sorun geri gelir.
4. Dosyayı sildiniz ama disk alanı boşalmadıysa
Bir program dosyayı açık tutarken dosya adı silinirse, program aynı dosyaya erişmeye devam edebilir. Dosya klasör listesinde görünmez; ancak son açık bağlantı kapanana kadar kullandığı alan geri dönmeyebilir.
Sunucuda lsof zaten varsa aşağıdaki salt okunur komutla bu dosyaları listeleyin:
sudo lsof +L1
Araç kurulu değilse dolu dosya sistemine hemen paket kurmaya çalışmayın. Önce diğer ölçümleri alın ve gereken aracı kontrollü bakım kapsamında hazırlayın.
Dosyanın adı kaldırılmış olsa da onu açık tutan süreç disk alanını kullanmaya devam edebilir.


1. adım: df ile du aynı şeyi ölçmez
- df ile du aynı şeyi ölçmez
Dosya silinmesine rağmen df 21M kullanım gösteriyor; du ise görünen dosyaları 44K olarak topluyor. Bu fark, açık tutulan silinmiş dosyaları araştırmak için bir işarettir.
- Açık dosyayı ve süreci belirleyin
SIZE/OFF 20.971.520 bayt, NLINK 0. Bu demo dosyası süreç tarafından açık tutuluyor; hangi servisle ilişkili olduğunu doğrulamadan süreci durdurmayın.
Bu örnekte dosyayı yalnız rehber için oluşturulan demo süreç açık tutuyor. lsof, 20.971.520 baytlık açık dosyada NLINK 0 gösteriyor. Satıra sığmayan deleted etiketi bir alt satıra taşar; çıktı değiştirilmemiştir.
Bu demoda yalnız bizim başlattığımız geçici bir program, 20 MiB’lık held-demo.log dosyasını açık tutuyordu. Dosya adı silindikten sonra df hâlâ yaklaşık 21M kullanım ve %37 doluluk gösterirken, du aynı test dosya sisteminde yalnız 44K buldu.
lsof satırında SIZE/OFF=20971520, NLINK=0 ve (deleted) işareti görüldü.
| Sütun | Ne işe yarar? |
|---|---|
COMMAND ve PID | Dosyayı açık tutan program ve süreç numarası. |
FD | Sürecin açık dosya tanımı; bir dosyanın birden fazla açık bağlantısı olabilir. |
SIZE/OFF | Kaydın türüne göre boyut veya konum bilgisi; her satırı ayrı disk kullanımı gibi toplamayın. |
NLINK / NAME | Sıfır bağlantı sayısı ve çoğunlukla (deleted) işareti. Dosyanın hangi dosya sistemine ait olduğunu da eşleştirin. |
- İlgili sürecin hangi uygulama veya servise ait olduğunu bulun.
- Günlük dosyasıysa uygulamanın desteklediği günlük dosyasını yeniden açma veya arşivleyip yenisine geçme yöntemini kullanın. Her serviste
reloadaynı işi yapmaz. - Yeniden başlatma gerekiyorsa etkisini ve bakım zamanını değerlendirin; yalnız ilgili servisi hedefleyin.
- Açık dosya kaydının kalktığını ve aynı dosya sisteminde kullanılabilir alanın arttığını kontrol edin.
kill -9, sunucuyu yeniden başlatma veya /proc/.../fd/... dosyasını boşaltma genel temizlik yöntemi değildir. Özellikle veritabanı dosyalarında bunlar veri kaybına neden olabilir. Listede (deleted) bulunması da her satırın sorunlu olduğu anlamına gelmez; bazı uygulamalar geçici dosyaları bu şekilde kullanır.
Bu örnekte sadece dosyayı açık tutan özel test servisi durduruldu.


1. adım: Komuttaki servis adını kontrol edin
- Komuttaki servis adını kontrol edin
Durdurulan servis yalnız bu rehberin dchost-disk-demo-writer.service adlı test servisi. Kendi sunucunuzda adı bilinmeyen bir sürece aynı komutu uygulamayın.
- df sonucunun düzeldiğini görün
Alan kullanımı %1’e indi ve 55M kullanılabilir alan görünüyor. du 44K olarak kaldı; asıl değişiklik açık dosyanın kapatılmasıyla df tarafında oldu.
Bu işlem üretim uygulamasına uygulanmış bir servis yeniden başlatma örneği değildir. Gerçek sunucuda servis belgelerine göre dosyayı yeniden açtırma veya planlı yeniden başlatma değerlendirilir; tüm servisleri durdurmayın.
Yalnız bu örnek için oluşturulan dchost-disk-demo-writer.service durdurulup açık dosya kapandığında df yaklaşık 48K kullanım, %1 doluluk ve 55M kullanılabilir alan gösterdi; du 44K kaldı. Küçük fark, bu iki ölçümün bütünüyle aynı şeyi saymadığını da gösterir. Gerçek müşteri web veya veritabanı servisi durdurulmadı. Kendi sunucunuzda örnekteki servis adını aramayın; dosyayı tutan kendi uygulamanızı belirleyin.
5. Neleri güvenli biçimde temizleyebilirsiniz?
Önce hangi verinin silinebilir olduğunu belirleyin. İhtiyaç duyduğunuz kayıt ve yedeği başka bir disk ya da sunucuda doğrulayın. Dolu bölümde yeni ZIP/yedek üretmek sorunu büyütebilir. Aynı dosya sistemi içinde dosyayı başka klasöre taşımak alan açmaz.
| Bulduğunuz veri | İzlenecek yol |
|---|---|
| İndirilmiş işletim sistemi paketleri | Dağıtımın paket önbelleği temizleme komutunu kullanın. Bu, kurulu yazılımı kaldırmak değildir. |
| Eski sistem günlükleri | Saklama ihtiyacını ve arşivi kontrol edip journalctl veya mevcut logrotate politikasını kullanın. |
| Uygulama önbelleği ve oturum dosyaları | Uygulamanın kendi bakım yöntemini kullanın; aktif oturum ve kuyruklara dikkat edin. |
| Eski yedek arşivleri | Başka konumdaki kullanılabilir kopyayı doğrulayın; yedek zincirinin parçasını tek başına silmeyin. |
| Veritabanı, Docker volume veya müşteri yüklemeleri | Veri sahipliğini ve bağımlılıkları belirleyin. Rastgele dosya silmek yerine ilgili yazılımın bakım yöntemini planlayın. |
Paket önbelleğini temizleme
Önce boyutu ölçün. Ubuntu/Debian ve APT kullanan bir sunucuda:
sudo du -sh -- /var/cache/apt/archives
Bu klasör gerçekten yer kaplıyorsa, devam eden paket kurulum/güncellemesi yoksa ve indirilmiş paket arşivlerine ihtiyacınız kalmadıysa:
sudo apt-get clean
Komut indirilen paket arşivlerini temizler; kurulu paketleri kaldırmaz. Yeniden kurulum için paketlerin tekrar indirilmesi gerekebilir. autoremove, upgrade ve dist-upgrade farklı işlemlerdir; disk temizliği diye gelişigüzel çalıştırmayın.
DNF kullanan AlmaLinux/Rocky Linux gibi sistemlerde indirilen paketler için karşılık sudo dnf clean packages komutudur. APT ve DNF komutlarını aynı sunucuda peş peşe uygulamayın; kendi dağıtımınızın yöntemini seçin.
Sistem günlüklerini küçültme
Önce journal boyutunu okuyun:
sudo journalctl --disk-usage
Gerekli olay kayıtları dışarıda saklanmışsa ve saklama politikanız uygunsa, örneğin 14 günden eski arşivlenmiş journal dosyalarını kaldırmak için:
sudo journalctl --vacuum-time=14d
sudo journalctl --disk-usage
Bu işlem eski günlükleri siler; geri alma komutu yoktur. 14d her sunucu için doğru saklama süresi değildir. Vacuum yalnız arşivlenmiş journal dosyalarını temizler; --disk-usage etkin dosyaları da saydığı için değer sıfıra inmeyebilir. Hiç uygun arşiv yoksa alan kazandırmayabilir. --rotate, etkin günlükleri arşivler ve yeni dosya açar; dolu bir sistemde bunu da koşulsuz çözüm gibi kullanmayın.
Metin günlükleri için logrotate kuruluysa sudo logrotate --debug /etc/logrotate.conf, planı günlükleri değiştirmeden incelemeye yardımcı olur. --force ile aynı işlem değildir. Aktif log dosyalarını silmeyin; yeniden açma yöntemi uygulamaya göre değişir. Sürekli büyümeyi ilgili hata ve saklama politikasıyla çözün. Journald'ın SystemMaxUse ve SystemKeepFree ayarları kapasite planlamasında kullanılabilir; bunlar bütün sunucudaki dosyaları temizleyen ayarlar değildir.
Tek bir gereksiz dosyayı kaldırma
Yolunu ve içeriğini doğruladığınız, bir program tarafından açık tutulmayan bağımsız bir eski arşiv için önce ls -lh -- /tam/dosya/yolu ile tam hedefi kontrol edin. Başka konumdaki gerekli kopya doğrulandıysa sudo rm -i -- /tam/dosya/yolu yalnız o dosya için onay ister. Örnek yolu aynen çalıştırmayın. Joker karakter (*) veya toplu rm -rf eklemeyin.
6. Disk doluluk uyarısı kurun
Disk dolmadan haber almak için alanı ve inode kullanımını birlikte izleyin. Örneğin %85 başlangıç eşiği olabilir; hızlı büyüyen küçük bir bölümde daha erken uyarı gerekebilir. Yalnız yüzdeyi değil boş GB'ı ve dolma hızını da izleme planınıza katın. /var, /backup veya ayrı veri diskleri için ilgili yolları ayrıca kapsayın.
Systemd kullanan sunucularda aşağıdaki örnek, seçilen yolu beş dakikada bir ölçüp yerel sistem günlüğüne OK, WARNING veya ERROR kaydı yazar. E-posta, SMS veya Telegram göndermez. Uykudayken de bildirim almak için bu kaydı merkezi izlemeye bağlayın veya bu ölçümleri sunucu dışından takip eden sisteminizde uyarı kuralı tanımlayın. Yerel günlüğün yazılamadığı tam dolulukta, dış izleme özellikle önemlidir.
Kontrol betiğini hazırlayın
Bu adımlar sunucuya bir kontrol betiği ve iki systemd birimi ekler; dosya temizlemez veya web/veritabanı servisini yeniden başlatmaz. Bash, GNU df, awk, logger ve systemd gerekir. Aynı adla bir dosya/birim zaten varsa üzerine yazmayın; mevcut izlemeyi yöneten kişiyle birleştirin.
Aşağıdaki bloğu sunucu terminaline tamamını birlikte yapıştırın. Son EOF satırı dosyayı bitirir. bash -n normalde çıktı vermez; hata verirse zamanlayıcıyı etkinleştirmeden önce düzeltin.
Kontrol betiğini göster ve kopyala
sudo tee /usr/local/sbin/dchost-disk-check >/dev/null <<'EOF'
#!/bin/bash
set -eu
export LANG=C LC_ALL=C
check_path=${DCHOST_DISK_CHECK_PATH:-/}
threshold_text=${DCHOST_DISK_THRESHOLD:-85}
report() {
local priority=$1 message=$2
printf '%s\n' "$message"
logger --tag dchost-disk-check --priority "daemon.$priority" -- "$message"
}
if [[ ! $threshold_text =~ ^[0-9]{1,3}$ ]]; then
report err "ERROR: DCHOST_DISK_THRESHOLD must be an integer from 1 to 100."
exit 1
fi
threshold=$((10#$threshold_text))
if (( threshold < 1 || threshold > 100 )); then
report err "ERROR: DCHOST_DISK_THRESHOLD must be an integer from 1 to 100."
exit 1
fi
if ! disk_values=$(df --output=pcent,ipcent,itotal -- "$check_path"); then
report err "ERROR: Disk usage could not be read for path=$check_path."
exit 1
fi
values=$(printf '%s\n' "$disk_values" | awk 'NR == 2 { print $1, $2, $3 }')
read -r blocks_text inodes_text inode_total <<< "$values"
blocks=${blocks_text%%%}
inodes=${inodes_text%%%}
if [[ ! $blocks =~ ^[0-9]+$ ]]; then
report err "ERROR: Disk usage result is not numeric for path=$check_path."
exit 1
fi
inode_label=not-reported
inode_warning=0
if [[ $inodes =~ ^[0-9]+$ && $inode_total =~ ^[0-9]+$ ]] && (( inode_total > 0 )); then
inode_label="$inodes%"
if (( inodes >= threshold )); then
inode_warning=1
fi
elif [[ $inodes != - && $inode_total != 0 ]]; then
report err "ERROR: Inode usage result is invalid for path=$check_path."
exit 1
fi
if (( blocks >= threshold || inode_warning == 1 )); then
report warning "WARNING: path=$check_path space=$blocks% inodes=$inode_label threshold=$threshold%"
else
report info "OK: path=$check_path space=$blocks% inodes=$inode_label threshold=$threshold%"
fi
EOF
sudo chmod 0755 /usr/local/sbin/dchost-disk-check
sudo bash -n /usr/local/sbin/dchost-disk-check
Hedefi ve zamanlamayı belirleyin
Aşağıdaki örnek / dosya sistemini %85 eşiğiyle izler. Ayrı bir veri diski için DCHOST_DISK_CHECK_PATH=/ satırındaki yolu kendi bağlama noktanızla değiştirin. Kontrol, seçilen yolun ait olduğu dosya sisteminin doluluğunu ölçer; aynı dosya sistemindeki her klasör için tekrar kurmanız gerekmez. Farklı dosya sistemlerini izlemek için ayrı birim adı ve ilgili yol kullanın; zamanlayıcıdaki Unit= değeri de ilgili servis adıyla eşleşmelidir.
sudo tee /etc/systemd/system/dchost-disk-check.service >/dev/null <<'EOF'
[Unit]
Description=DCHost disk and inode usage check
[Service]
Type=oneshot
Environment="DCHOST_DISK_CHECK_PATH=/"
Environment="DCHOST_DISK_THRESHOLD=85"
ExecStart=/usr/local/sbin/dchost-disk-check
StandardOutput=null
StandardError=journal
EOF
sudo tee /etc/systemd/system/dchost-disk-check.timer >/dev/null <<'EOF'
[Unit]
Description=Check disk and inode usage every five minutes
[Timer]
OnBootSec=2min
OnUnitActiveSec=5min
AccuracySec=30s
Unit=dchost-disk-check.service
[Install]
WantedBy=timers.target
EOF
Her iki dosya kaydedildikten sonra komutları sırayla çalıştırın. Biri hata verirse sonraki adıma geçmeden hatayı inceleyin. İlk çalıştırmanın kaydı oluşmalı; zamanlayıcı listesinde sonraki çalışma görünmelidir:
sudo systemctl daemon-reload
sudo systemctl start dchost-disk-check.service
sudo systemctl enable --now dchost-disk-check.timer
systemctl list-timers dchost-disk-check.timer --all --no-pager
sudo journalctl -t dchost-disk-check -n 10 --no-pager
WARNING, seçilen eşiklerden en az birine ulaşıldığını veya bu değerin aşıldığını; ERROR, ölçümün yapılamadığını gösterir. Ölçüm hatasını %0 kullanım saymayın. inodes=not-reported görünen dosya sisteminde inode uyarısı yapılamaz. Zamanlayıcının active olması tek başına son ölçümün başarılı olduğunu kanıtlamaz; kayıt zamanını ve sonucu okuyun.
Otomatik kontrolün çalıştığını ve disk kullanımının belirlenen eşiği aştığını birlikte doğrulayın.


1. adım: Sonraki kontrolü doğrulayın
- Sonraki kontrolü doğrulayın
Zamanlayıcı bir sonraki çalışmayı 4 dakika 24 saniye sonra planlamış. LAST/PASSED alanları da önceki kontrolün gerçekleştiğini gösterir.
- Kullanımı eşikle karşılaştırın
Yerel kayıtta space=92% ve threshold=85% görünüyor. Bu nedenle WARNING yazılmış; inode kullanımı bu örnekte yalnız %1.
Kontrol gerçek zamanlayıcı tarafından çalıştırıldı. Bu düzenek yalnız sunucunun yerel günlüğüne kayıt yazar; e-posta veya SMS göndermez. Terminal, uzun tarih ve servis adlarını üç nokta ile kısaltmıştır.
Gerçek demoda bu betik, servis ve zamanlayıcı dosyaları sunucuya kuruldu; hedef olarak ayrı test dosya sistemi, eşik olarak %85 seçildi. enable --now sonrasındaki ilk otomatik çalışma, günlükte WARNING, space=92%, inodes=1% ve threshold=85% değerlerini oluşturdu. Zamanlayıcı listesinde son ve sonraki çalışma da göründü.
Demo yük dosyası kaldırıldı; kontrol servisi bu kez elle çalıştırılarak sonuç hemen doğrulandı.


1. adım: Kontrolü gerektiğinde elle çalıştırın
- Kontrolü gerektiğinde elle çalıştırın
systemctl start dchost-disk-check.service komutu, bir sonraki zamanlamayı beklemeden kontrolü tekrar çalıştırır.
- Yeni kayıttaki değerleri kontrol edin
Yeni OK satırında space=1%, inodes=1% ve threshold=85%. Aşağıdaki df sonucu da alan kullanımının %1 olduğunu doğruluyor.
Eski WARNING satırı günlük geçmişinde kalır; sonrasındaki OK yeni kontrolün sonucudur. Bu doğrulama elle başlatıldı ve dışarıya bildirim gönderilmedi. Kayıttan yalnız ilgili terminal bölümü kırpılmıştır.
Yalnız alarm denemesi için oluşturulan 50 MiB’lık threshold-demo.bin kaldırıldıktan sonra servis elle bir kez çalıştırıldı. Bu kontrol OK, space=1%, inodes=1% ve threshold=85% kaydı üretti. Böylece otomatik uyarı ve temizlik sonrasındaki ayrı elle kontrol doğrulandı. E-posta veya Telegram mesajı gönderilmedi; sonuç yerel journal kaydıdır. Yeniden başlatma sonrası çalışma ve uzun süreli izleme bu demoda test edilmedi.
7. Alan açıldıktan sonra sorunun çözüldüğünü doğrulayın
Başta seçtiğiniz aynı yolu kullanın. Yeni SSH oturumu açtıysanız önce CHECK_PATH değerini yeniden belirleyin:
df -hT -- "$CHECK_PATH"
df -i -- "$CHECK_PATH"
systemctl --failed --no-pager
| Kontrol | Beklenen sonuç |
|---|---|
| Alan ve inode | Soruna neden olan değer gerilemiş, kullanılabilir kapasite oluşmuş. |
| Başta hata veren işlem | Kontrollü yeniden denemede artık aynı hatayı üretmiyor. |
| İlgili uygulama/servis | Beklenen veriye erişiyor ve normal işlevi çalışıyor. |
| Yeni günlük kayıtları | Aynı saatli yeni No space left on device hatası oluşmuyor. |
| Bir süre sonraki ölçüm | Kullanım hemen yeniden dolmuyor; gereksiz veri üretimi durdurulmuş. |
systemctl --failed listesinin boş olması, uygulamanın bütün işlevlerinin çalıştığını kanıtlamaz. Veritabanı durduysa yalnız boş alan oluştu diye otomatik olarak sağlıklı kabul etmeyin; kendi günlük ve kurtarma adımlarını kontrol edin. Ödeme veya e-posta gönderimi gibi işlemleri sonucu belirsizken tekrar tekrar çalıştırmayın.
İşlem sonunda aynı bağlama noktalarını kontrol edin; servis durumunu da ayrı değerlendirin.


1. adım: Aynı disklerde son değerleri okuyun
- Aynı disklerde son değerleri okuyun
Kök disk %6, iki test dosya sistemi %1 alan kullanıyor. Alttaki df -i çıktısı da boş inode bulunduğunu gösteriyor.
- Servis durumunu ayrıca kontrol edin
SSH için active görülüyor. systemctl --failed çıktısındaki 0 loaded units listed., başarısız durumda listelenen birim olmadığını gösterir.
Bu ekran demo dosya sistemleri kaldırılmadan önce alınmıştır. SSH aktif ve systemd başarısız birim listesi boş; bu sonuçlar tek başına web sitesi veya veritabanı işlevlerinin tamamını doğrulamaz. Kendi uygulamanızın hata veren işlemini ayrıca deneyin.
Son ekranda iki test dosya sisteminin alan kullanımı %1, inode kullanımları ise sırasıyla %1 ve %13 olarak doğrulandı. Alan ve inode hatası veren yazma işlemleri artık başarılıydı. Ana sistem bölümünde 38G kapasite, yaklaşık 2.2G kullanım, 36G kullanılabilir alan ve %6 doluluk görüldü; SSH active, hata durumundaki systemd birim sayısı 0 idi.
Temizlikten önce korunacak üç test dosyasının SHA-256 değerleri başlangıçla karşılaştırıldı ve aynı oldukları doğrulandı. Bunlar gerçek müşteri dosyaları değildi; bu rehberin test imajlarının içindeydi. Kurtarma kontrolü tamamlandıktan sonra yalnız bizim oluşturduğumuz alarm betiği, iki systemd birimi ve etkinleştirme bağlantısı kaldırıldı. Test dosya sistemleri normal biçimde ayrıldı, loop bağlantıları kapatıldı ve bu çalışmanın test imajları, dosyaları ve klasörleri temizlendi. Dolayısıyla hash ile kontrol edilen örnek dosyalar da çalışma sonunda test imajlarıyla birlikte kaldırıldı.
Son temizlikten sonra ana sistem bölümünün doluluğu yine %6, inode kullanımı %3 olarak ölçüldü; başlangıçtaki inode kullanım sayısı korundu. SSH active kaldı ve hata durumundaki birim sayısı yine 0 idi. Bu sonuçlar ayrı demo ortamındaki işlemleri doğrular; gerçek müşteri verisinin kurtarıldığı anlamına gelmez.
Değişiklik işe yaramazsa veya geri dönmek isterseniz
Salt okunur df, du, findmnt ve lsof ölçümlerinin geri alınması gerekmez. Silinen dosyayı ancak uygun yedekten geri getirebilirsiniz. Bu nedenle temizliği küçük, hedefi bilinen işlemlerle yapın; her adımın ardından aynı ölçümü tekrarlayın.
Uygulama veya günlük politikasını değiştirdiyseniz önceki ayarınızı saklayın ve yalnız o değişikliği geri alın. Alarmı kaldırmak için önce zamanlayıcıyı durdurun:
sudo systemctl disable --now dchost-disk-check.timer
Ardından yalnız bu rehber için oluşturduğunuz .service, .timer ve betik dosyalarını kaldırıp sudo systemctl daemon-reload çalıştırın. Önceden var olan başka izleme dosyalarını silmeyin. Geçici demo ortamının kapatılması, gerçek müşteri sunucusunda disk veya disk bölümü kaldırmanız gereken bir adım değildir.
Alan ihtiyacı kalıcı olarak büyüdüyse paket yükseltme veya ayrı depolama planlayın. Pakette disk artması, bölümün ve dosya sisteminin kendiliğinden büyüdüğünü kanıtlamaz. Dosya sistemi türüne ve disk düzenine uygun genişletme gerekir. mkfs, rastgele bölümleme komutu veya ext4 ayrılmış blok oranını sıfırlamak disk temizliği yöntemi değildir.
Destek talebine ne eklemelisiniz?
DCHost müşteri portalından destek talebi açarken hizmeti, saat dilimiyle hata zamanını, hata veren işlemi ve tam hata mesajını yazın. İlgili findmnt, df -hT, df -i ve kısa du sonuçlarını; gerekiyorsa ilgili lsof satırını ekleyin. Son değişiklikleri ve temizlediğiniz veri türünü belirtin.
Herkese açık paylaşımda sunucu adı, IP, kullanıcı adı ve özel dosya yollarını gizleyin. Parola, SSH anahtarı, veritabanı içeriği veya müşteri dosyalarını göndermeyin.
Sık sorulan sorular
Linux diski dolu görünüyor ama boş GB var; neden dosya oluşmuyor?
Inode tükenmiş olabilir. Aynı hedefte df -i ile IFree ve IUse% değerlerini kontrol edin. Inode yeterliyse hesap kotası, ayrı bağlama noktası ve tam hata mesajıyla devam edin. Inode bölümündeki sayı odaklı tarama, çok sayıda küçük dosyanın biriktiği klasörü bulmaya yardımcı olur.
Dosyayı sildim, neden disk alanı boşalmadı?
Dosya bir program tarafından açık tutuluyor olabilir. sudo lsof +L1 çıktısını ilgili dosya sistemiyle eşleştirin. Açık dosya bölümündeki kontrollü işlemden sonra son açık bağlantı kapanınca alan geri dönebilir. Dosyanın başka hard linkleri olması veya farklı dosya sistemini ölçmeniz de sonucu etkiler.
/tmp veya /var/log klasörünün tamamını silebilir miyim?
Hayır. Çalışan uygulamalar, oturumlar, soketler veya teşhis için gereken kayıtlar bulunabilir. Dosyanın sahibini ve saklama politikasını belirleyin; işletim sisteminin veya ilgili uygulamanın temizleme yöntemini kullanın.
Disk %100 görünüyorsa sunucuyu yeniden başlatmak çözüm mü?
Kalıcı veri, inode veya kota sorununu çözmez; yeniden başlayan servisler gerekli dosyayı yazamayabilir. Önce nedeni belirleyin. Açık dosya sorununda bile yalnız ilgili uygulamanın desteklenen yeniden açma veya bakım işlemini değerlendirin.
Paket yükseltirsem inode ve disk sorunu kesin çözülür mü?
Hayır. Gereksiz dosya üretimi devam edebilir; bölüm ve dosya sistemi genişletmesi ayrıca gerekebilir. İhtiyacı ölçüp yeni kapasitenin sunucu içinde göründüğünü doğrulayın. Inode kapasitesinin nasıl değişeceği dosya sistemi ve genişletme yöntemine bağlıdır.
İlgili rehberler
- Linux sunucuda CPU, RAM ve disk kullanımını kontrol etme
- Linux sunucuya ilk SSH bağlantısı
- Sunucu yedekleme planı
- Yedeğin kullanılabilir olduğunu doğrulama
- Linux güncellemelerini planlama
- Paket yükseltme hazırlığı
RAM yetersizliği disk doluluğundan farklıdır. Killed, Out of memory veya kendiliğinden kapanan servisler görüyorsanız Linux OOM ve swap rehberinden devam edin. Swap dosyası diskten yer ayırır; disk doluyken alan planlamadan swap oluşturmayın.
Diskte boş alan olması, uygulamanın depolama işlemlerini beklemediği anlamına gelmez. Alan ve inode kullanımı normal olduğu hâlde load average yüksekse CPU kullanımıyla I/O beklemesini ayırın. Yalnız yük ortalamasına bakarak dosya silmeyin veya işlemci paketini yükseltmeyin.
Teknik kaynaklar
- GNU Coreutils: df ve du
- util-linux: findmnt kaynak kılavuzu
- lsof: açık ve silinmiş dosyaları seçme
- systemd: journalctl kaynak kılavuzu ve journald.conf
- systemd: timer birimleri
- Debian: apt-get ve DNF: clean komutları
- logrotate kaynak kılavuzu
- e2fsprogs: tune2fs ve ayrılmış bloklar
- GNU Findutils: dosya yaşına göre seçim