Sistem/DevOps•7 dk okuma

PowerCLI ile vSphere Datastore'larındaki Kayıtsız (Zombie) Diskleri ve 3 Günden Eski Snapshotları Temizleyen Otonom Script

Sanal makineleri silerken diskte unutulan terabaytlarca 'zombi' VMDK dosyasını tespit eden, unutulmuş snapshotları raporlayan ve haftalık disk alanı geri kazandıran PowerCLI otomasyonu.

AE

Ahmet Ertekin

18 October 2023

PowerCLI ile vSphere Datastore'larındaki Kayıtsız (Zombie) Diskleri ve 3 Günden Eski Snapshotları Temizleyen Otonom Script

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 .vmdk dosyası 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-Item yaptı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.