PowerCLI ile vSphere Datastore'larındaki Kayıtsız (Zombie) Diskleri ve 3 Günden Eski Snapshotları Temizleyen Otonom Script
Büyük ölçekli VMware vSphere veri merkezlerinde sanal sunucular sık sık açılır, taşınır veya envanterden kaldırılır. Bir teknisyen vCenter üzerinden sanal makineyi silerken "Delete from Disk" yerine kazara "Remove from Inventory" seçeneğini tıklarsa, o sanal makinenin yüzlerce gigabaytlık VMDK diskleri ve konfigürasyon dosyaları datastore içinde sahipsiz (Orphaned / Zombie VMDK) olarak kalır. Zamanla bu görünmez çöpler depolama alanını tüketir. Bu gizli atıkları otomatik yakalayan PowerCLI Otonom Temizlik Betiği.
1. Zombi (Yetim) VMDK Nedir ve Neden Oluşur?
- Bir datastore üzerinde fiziksel bir
.vmdkdosyası vardır; - Ancak vCenter veritabanındaki hiçbir canlı sanal makinenin donanım ayarlarında bu disk kayıtlı değildir.
- Manuel olarak 20 farklı datastore içinde klasör klasör aramak haftalar sürer.
2. PowerCLI ile Otomatik Tespit ve Raporlama Betiği
Connect-VIServer -Server "vcsa.holding.local" -User "administrator@vsphere.local" -Password "GucluSifre!2023"
Write-Host "1. Canlı Sanal Makinelerin Diskleri Taranıyor..." -ForegroundColor Cyan
$RegisteredDisks = Get-VM | Get-HardDisk | Select-Object -ExpandProperty Filename
$Report = @()
$Datastores = Get-Datastore | Where-Object {$_.Type -eq "VMFS" -and $_.Accessible -eq $true}
foreach ($ds in $Datastores) {
Write-Host "Taranan Datastore: $($ds.Name)" -ForegroundColor Yellow
# Datastore üzerindeki tüm .vmdk dosyalarını listeleme
$dsBrowser = Get-View $ds.ExtensionData.browser
$spec = New-Object VMware.Vim.HostDatastoreBrowserSearchSpec
$spec.matchPattern = "*.vmdk"
$task = $dsBrowser.SearchDatastoreSubFolders("[" + $ds.Name + "]", $spec)
foreach ($folder in $task) {
foreach ($file in $folder.File) {
$fullPath = $folder.FolderPath + $file.Path
# Eğer disk canlı sanal makinelerin listesinde yoksa ZOMBİDİR!
if ($RegisteredDisks -notcontains $fullPath -and $file.Path -notmatch "-flat.vmdk|-delta.vmdk") {
$Report += [PSCustomObject]@{
Datastore = $ds.Name
FilePath = $fullPath
FileSizeGB = [math]::Round($file.FileSize / 1GB, 2)
LastModified = $file.Modification
}
}
}
}
}
$Report | Export-Csv -Path "C:\Reports\Zombie_VMDK_Report.csv" -NoTypeInformation -Encoding UTF8
Write-Host "Tarama Tamamlandı! Bulunan Yetim Disk Sayısı: $($Report.Count)" -ForegroundColor Green
3. 3 Günden Eski Snapshotları Yakalama ve Raporlama
Aynı betiğe entegre çalışan snapshot denetleyicisi:
$OldSnapshots = Get-VM | Get-Snapshot | Where-Object {$_.Created -lt (Get-Date).AddDays(-3)}
if ($OldSnapshots) {
Write-Warning "DİKKAT: 3 Günden Eski $($OldSnapshots.Count) Adet Snapshot Tespit Edildi!"
$OldSnapshots | Select-Object VM, Name, SizeGB, Created | Format-Table -AutoSize
}
Karşılaşılan Kritik Hatalar ve Çözüm İpuçları
- Betiğin Yetim Diskleri Doğrudan Silmesi Riski: Yetim diskleri betikle doğrudan
Remove-Itemyaptırmayın! Yedekleme sunucusunun (Veeam Proxy) o an HotAdd modunda geçici bağladığı bir disk anlık olarak "unregistered" görünebilir. Doğru yaklaşım: Önce CSV raporunu oluşturmak, 48 saat beklemek ve yöneticinin onayının ardından dosyaları silmektir.
Mühendis Notu
Bu scripti çalıştırdığımız ilk gün datastore'larda 3 yıldır unutulmuş 4.2 TB atıl disk alanı kurtardık. Yeni bir depolama rafı satın almadan önce mevcut datastore'larınızı temizleyin.
