Disk Dolu Sorunları: Windows Server’da Yer Açma Yöntemleri
Sabah 7’de telefon çalıyor, üretim sunucunuz çökmüş ve hata logu “disk full” diyorum işte başladı. Bu senaryoyu yaşayan her sysadmin bilir; panik anında doğru adımları atmak hem sinirlerinizi hem de sisteminizi kurtarır. Windows Server ortamlarında disk dolması sorunu, beklenmedik anlarda ortaya çıkar ve eğer önceden hazırlıklı değilseniz saatlerce süren bir hata ayıklama maratonuna dönüşebilir. Bu yazıda, Windows Server’da disk dolması sorununu hem teşhis etmeyi hem de kalıcı olarak çözmeyi adım adım ele alacağız.
Önce Teşhis: Alanı Kim Yiyor?
Diski dolduran şeyi bulmadan temizliğe başlamak, gözünüzü kapatıp oda süpürmek gibidir. İlk adım her zaman teşhis olmalı.
WinDirStat ile Görsel Analiz
WinDirStat, disk kullanımını görsel olarak harita şeklinde gösteren ücretsiz bir araçtır. Hangi klasörün ne kadar yer kapladığını birkaç dakika içinde gösterir. Özellikle büyük ve beklenmedik dosyaları tespit etmek için mükemmeldir. Üretim ortamında GUI erişiminiz yoksa PowerShell ile de aynı işi yapabilirsiniz.
PowerShell ile Hızlı Disk Analizi
Sunucuya RDP ile bağlandınız ve hızlıca nereye bakacağınızı bilmek istiyorsunuz. İşte ilk çalıştırmanız gereken komut:
Get-PSDrive -PSProvider FileSystem | Select-Object Name, @{N="Used(GB)";E={[math]::Round($_.Used/1GB,2)}}, @{N="Free(GB)";E={[math]::Round($_.Free/1GB,2)}}, @{N="Total(GB)";E={[math]::Round(($_.Used+$_.Free)/1GB,2)}}
Bu komut size tüm sürücülerin dolu/boş durumunu GB cinsinden gösterir. Hangi sürücünün kritik seviyede olduğunu anında görürsünüz.
Sonrasında, en fazla yer kaplayan klasörleri bulmak için şu scripti çalıştırın:
$path = "C:"
Get-ChildItem -Path $path -Recurse -ErrorAction SilentlyContinue |
Where-Object { !$_.PSIsContainer } |
Sort-Object Length -Descending |
Select-Object -First 20 FullName, @{N="Size(MB)";E={[math]::Round($_.Length/1MB,2)}} |
Format-Table -AutoSize
Bu script, belirtilen dizindeki en büyük 20 dosyayı listeler. Gerçek hayatta bu listeyi gördüğünüzde genellikle şunlardan birini bulursunuz: devasa log dosyaları, unutulmuş backup dosyaları veya temp klasörlerinde biriken çöpler.
Daha hedefli bir tarama yapmak istiyorsanız, belirli bir dizinin toplam boyutunu şu şekilde ölçebilirsiniz:
$folderPath = "C:WindowsLogs"
$size = (Get-ChildItem -Path $folderPath -Recurse -ErrorAction SilentlyContinue |
Measure-Object -Property Length -Sum).Sum
Write-Host "Toplam Boyut: $([math]::Round($size/1GB, 2)) GB"
Windows Server’da Yer Açma Yöntemleri
1. Windows Temp Dosyaları Temizleme
Geçici dosyalar, sunucularda sessiz sedasız büyüyen ve çoğu zaman gözden kaçan bir alan hırsızıdır. Hem sistem genelinde hem de kullanıcı bazında temp klasörleri düzenli aralıklarla temizlenmelidir.
# Sistem temp klasörünü temizle
Remove-Item -Path "C:WindowsTemp*" -Recurse -Force -ErrorAction SilentlyContinue
# Kullanıcı temp klasörünü temizle
Remove-Item -Path "$env:TEMP*" -Recurse -Force -ErrorAction SilentlyContinue
# Tüm kullanıcı profillerinin temp klasörlerini temizle
Get-ChildItem "C:Users" -Directory | ForEach-Object {
$tempPath = Join-Path $_.FullName "AppDataLocalTemp"
if (Test-Path $tempPath) {
Remove-Item -Path "$tempPath*" -Recurse -Force -ErrorAction SilentlyContinue
Write-Host "$($_.Name) kullanicisinin temp dosyalari temizlendi"
}
}
Bu komutu çalıştırırken -ErrorAction SilentlyContinue parametresini mutlaka ekleyin. Bazı dosyalar aktif process tarafından kullanıldığından silinemez ve hata verir; bu parametre olmadan script yarıda durur.
2. IIS Log Dosyaları
IIS kullanan sunucularda log dosyaları fark edilmeden devasa boyutlara ulaşabilir. Özellikle yoğun trafikli bir web sunucusunda yıllarca temizlenmemiş IIS logları onlarca GB yer kaplayabilir. Varsayılan log yolu C:inetpublogsLogFiles dizinidir.
# 30 günden eski IIS log dosyalarını bul ve sil
$logPath = "C:inetpublogsLogFiles"
$cutoffDate = (Get-Date).AddDays(-30)
Get-ChildItem -Path $logPath -Recurse -Include "*.log" |
Where-Object { $_.LastWriteTime -lt $cutoffDate } |
ForEach-Object {
Write-Host "Siliniyor: $($_.FullName) - $([math]::Round($_.Length/1MB,2)) MB"
Remove-Item $_.FullName -Force
}
Bu scripti çalıştırmadan önce log politikanızı gözden geçirin. Bazı uyumluluk gereksinimleri (PCI-DSS, HIPAA gibi) log dosyalarının belirli süre saklanmasını zorunlu kılar. 30 günlük süreyi kendi politikanıza göre ayarlayın.
3. Windows Update Dosyaları ve SoftwareDistribution Klasörü
Windows Update’in indirdiği dosyalar C:WindowsSoftwareDistributionDownload klasöründe birikir. Başarılı kurulumlardan sonra bu dosyalar gereksizleşir ama otomatik olarak silinmez. Özellikle toplu güncelleme dönemlerinden sonra bu klasör birkaç GB’a ulaşabilir.
# Windows Update servisini durdur
Stop-Service -Name wuauserv -Force
Stop-Service -Name bits -Force
# Indirilen update dosyalarini temizle
Remove-Item -Path "C:WindowsSoftwareDistributionDownload*" -Recurse -Force -ErrorAction SilentlyContinue
# Servisleri yeniden baslat
Start-Service -Name wuauserv
Start-Service -Name bits
Write-Host "Windows Update cache temizlendi"
Servisleri durdurmadan bu klasörü silmeye çalışırsanız bazı dosyalar kilitli olacak ve silinemeyecektir. Servis durdurma adımını atlamamanızı önemle tavsiye ederim.
4. Disk Cleanup ile Bileşen Deposu Temizleme
Windows bileşen deposu (WinSxS klasörü) zamanla şişer ve bazen 10-20 GB’ı aşabilir. Bu klasörü manuel silmek yerine Microsoft’un sağladığı araçları kullanmalısınız.
# Disk Cleanup aracini sessiz modda calistir (tum kategoriler)
cleanmgr /sagerun:1
# Ya da DISM ile bileşen deposunu temizle (daha etkili)
DISM /Online /Cleanup-Image /StartComponentCleanup /ResetBase
# Eski Windows kurulum dosyalarini kaldir
DISM /Online /Cleanup-Image /SPSuperseded
/ResetBase parametresi, kurulu olan tüm service pack’lerin geri alınamaz hale getirilmesi anlamına gelir. Bu komutu çalıştırdıktan sonra artık güncelleme öncesi duruma geri dönemezsiniz. Üretim sunucularında bu kararı dikkatli alın ve önce snapshot/backup alın.
5. Event Log Dosyaları
Olay günlükleri de sessiz sedasız büyüyebilir. Özellikle hata fırlatan bir uygulama varsa Application log kısa sürede dev boyutlara ulaşır. Bu durumu hem temizlemek hem de kalıcı çözüme kavuşturmak gerekir.
# Mevcut event log boyutlarini goster
Get-EventLog -List | Select-Object Log, MaximumKilobytes,
@{N="CurrentSizeMB";E={[math]::Round($_.FileSize/1MB,2)}} |
Sort-Object CurrentSizeMB -Descending | Format-Table
# Belirli bir log dosyasini temizle
Clear-EventLog -LogName "Application"
Clear-EventLog -LogName "System"
# Tum Windows event loglarini temizle (dikkatli kullanin!)
Get-EventLog -List | ForEach-Object { Clear-EventLog $_.Log }
Üretim ortamında event log’ları temizlemeden önce mutlaka bir yere export alın. Aktif bir sorun varsa bu loglar delil niteliğindedir.
# Temizlemeden once export al
$exportPath = "C:LogBackup_$(Get-Date -Format 'yyyyMMdd')"
New-Item -ItemType Directory -Path $exportPath -Force
wevtutil epl Application "$exportPathApplication.evtx"
wevtutil epl System "$exportPathSystem.evtx"
wevtutil epl Security "$exportPathSecurity.evtx"
6. Shadow Copy ve Eski Restore Point’ler
Volume Shadow Copy (VSS) dosyaları disk dolmasının gizli suçluları arasında sıkça karşıma çıkıyor. Özellikle backup yazılımlarının yoğun kullandığı sunucularda VSS snapshot’ları arka planda birikir.
# Mevcut shadow copy'leri listele
vssadmin list shadows
# Shadow copy kullanimi goster
vssadmin list shadowstorage
# Tum eski shadow copy'leri sil (en yenisi haric)
vssadmin delete shadows /all /quiet
# Belirli bir volume icin shadow storage boyutunu sinirla
vssadmin resize shadowstorage /for=C: /on=C: /maxsize=5GB
vssadmin delete shadows /all komutunu çalıştırmadan önce backup politikanızı gözden geçirin. Eğer bu shadow copy’lere dayanan bir backup çözümünüz varsa, o backupları geçersiz kılmış olursunuz.
7. Recycle Bin ve Kullanıcı Profili Temizliği
Sunucularda “çöp kutusu” kavramı çoğu zaman göz ardı edilir ama özellikle birden fazla kullanıcının oturum açtığı terminal sunucularda Recycle Bin devasa boyutlara ulaşabilir.
# Tum kullanicilarin Recycle Bin'ini temizle
$drives = Get-PSDrive -PSProvider FileSystem | Select-Object -ExpandProperty Root
foreach ($drive in $drives) {
$recyclePath = "${drive}`$Recycle.Bin"
if (Test-Path $recyclePath) {
Get-ChildItem -Path $recyclePath -Force -Recurse -ErrorAction SilentlyContinue |
Remove-Item -Recurse -Force -ErrorAction SilentlyContinue
Write-Host "$drive surucusunun cop kutusu temizlendi"
}
}
Kalıcı Çözümler: Disk Dolmasını Önlemek
Anlık temizlik yaptınız, nefes aldınız. Ama asıl mesele bu durumun tekrar yaşanmamasını sağlamak.
Disk Kullanım İzleme ile Uyarı Sistemi
Disk dolmadan uyarı alan bir monitoring sistemi kurmak, sizi sabah 7’deki telefon çağrılarından kurtarır. Görev Zamanlayıcı ile basit bir PowerShell script’i bu işi görür:
# DiskAlarmControl.ps1
$threshold = 85 # Yuzde kac dolulukta uyari verilsin
$smtpServer = "smtp.sirketiniz.com"
$alertEmail = "[email protected]"
$drives = Get-PSDrive -PSProvider FileSystem | Where-Object { $_.Used -gt 0 }
foreach ($drive in $drives) {
$total = $drive.Used + $drive.Free
$usedPercent = [math]::Round(($drive.Used / $total) * 100, 1)
if ($usedPercent -ge $threshold) {
$freeGB = [math]::Round($drive.Free/1GB, 2)
$subject = "UYARI: $($drive.Name) surucusu %$usedPercent dolu!"
$body = @"
Sunucu: $($env:COMPUTERNAME)
Surucu: $($drive.Name)
Doluluk: %$usedPercent
Kalan Alan: $freeGB GB
Tarih: $(Get-Date)
Lutfen disk alanini kontrol ediniz.
"@
Send-MailMessage -SmtpServer $smtpServer -To $alertEmail `
-From "[email protected]" -Subject $subject -Body $body
Write-Host "Uyari gonderildi: $($drive.Name) - %$usedPercent"
}
}
Bu scripti Görev Zamanlayıcı’ya ekleyip her 4 saatte bir çalıştırın. Disk %85’e ulaştığında email alırsınız, %100 değil.
Log Rotasyonu ile Otomatik Temizlik
IIS log temizliğini manuel yapmak yerine otomatikleştirin:
# LogTemizlik.ps1 - Haftalık zamanlanmış görev olarak calistirin
param(
[int]$GunSayisi = 30,
[string]$LogKlasoru = "C:inetpublogsLogFiles"
)
$cutoffDate = (Get-Date).AddDays(-$GunSayisi)
$silineenDosyalar = 0
$kazanilanMB = 0
Get-ChildItem -Path $LogKlasoru -Recurse -Include "*.log", "*.txt" |
Where-Object { $_.LastWriteTime -lt $cutoffDate } |
ForEach-Object {
$kazanilanMB += [math]::Round($_.Length/1MB, 2)
$silineenDosyalar++
Remove-Item $_.FullName -Force
}
$logEntry = "$(Get-Date) - $silineenDosyalar dosya silindi, $kazanilanMB MB kazanildi"
Add-Content -Path "C:ScriptsLogTemizlik_Rapor.txt" -Value $logEntry
Write-Host $logEntry
Disk Kota Yönetimi
FSRM (File Server Resource Manager) kullanarak kullanıcı kotaları belirleyebilir ve belirli klasör boyutlarını sınırlayabilirsiniz. Bu özellik özellikle terminal sunucularında ve dosya sunucularında çok işe yarar.
# FSRM kurulumu
Install-WindowsFeature FS-Resource-Manager -IncludeManagementTools
# Kullanici basvna 10 GB kota tanimla
$quotaTemplate = "C:Users%USERNAME%"
New-FsrmQuota -Path "C:Users" -Template "100 MB Limit" -Confirm:$false
# Kota durumunu kontrol et
Get-FsrmQuota | Select-Object Path, Size, SoftLimit,
@{N="Kullanim%";E={[math]::Round(($_.Usage/$_.Size)*100,1)}}
Gerçek Dünya Senaryosu: Terminal Sunucuda Kriz
Birkaç ay önce 200 kullanıcılı bir terminal sunucusunda benzer bir krizle karşılaştım. C: sürücüsü sabah 3’te dolmuş, kullanıcılar iş başı yaptığında sisteme giremiyorlardı. Teşhis aşamasında keşfettiklerim şunlardı:
- C:Users altındaki profiller toplam 45 GB’a ulaşmıştı. Birkaç kullanıcı masaüstüne onlarca GB’lık dosya bırakmıştı.
- C:WindowsTemp klasörü 8 GB’dı. Yıllardır temizlenmemişti.
- IIS logları 12 GB’ı aşmıştı. Kimse log rotasyonu kurmamıştı.
- Bir backup yazılımı VSS snapshot biriktirmişti, tek başına 15 GB tutuyordu.
Toplamda 80 GB’ın üzerinde gereksiz dosyayı tespit ettim. Yukarıda paylaştığım komutları sırayla çalıştırdıktan sonra C: sürücüsünde 65 GB alan açıldı. Sonrasında log rotasyonu, disk izleme scripti ve kullanıcı profil kotaları kurularak benzer krizin tekrarlanması önlendi.
Bu deneyimden çıkan en önemli ders: disk yönetimi reaktif değil, proaktif yapılmalıdır. İzleme ve otomatik temizlik kurulmamış bir sunucu, er ya da geç kriz üretir.
Acil Durum İçin Hızlı Başvuru
Disk tam dolduğunda ve sisteminiz yanıt vermiyorsa, önce en az zarar veren adımları atın:
- Temp klasörlerini temizleyin, bunlar her zaman güvenlidir.
- En eski IIS loglarını silin.
- Recycle Bin’i boşaltın.
- Event log’ları export alıp temizleyin.
- Shadow copy’leri kontrol edin.
Bu adımlarla genellikle yeterli alan açılır. Bunlar yetersizse WinSxS temizliğine ve update cache temizliğine geçin.
Sonuç
Windows Server’da disk dolması sorunu, doğru araçlar ve düzenli bakım rutiniyle tamamen yönetilebilir bir durumdur. Önemli olan, sorunu sadece anlık çözmek değil; izleme sistemi, otomatik temizlik görevleri ve kullanıcı kotaları kurarak tekrarlanmasını engellemektir.
Bu yazıda paylaştığım PowerShell scriptlerini kendi ortamınıza uyarlayın ve zamanlanmış görevlere ekleyin. Özellikle disk kullanım uyarı scriptini mutlaka devreye alın; %85 dolulukta uyarı aldığınızda sakin kafayla temizlik yapabilirsiniz. %100’de uyarı alındığında ise her şey çok daha stresli olur.
Son olarak şunu söyleyeyim: en iyi disk yönetimi, dolduktan sonra temizlemek değil, dolmasını önceden fark etmektir. Proaktif olun, izleyin ve otomatikleştirin.
