VMware ile Snapshot Alma ve Geri Yükleme

Sanallaştırma ortamlarında çalışan herkesin er ya da geç karşılaştığı o anı bilirsiniz: kritik bir güncelleme yapmadan önce “acaba bir şeyler ters giderse ne yaparım?” diye düşünmek. İşte snapshot tam da bu noktada hayat kurtaran özellik. VMware’in en güçlü araçlarından biri olan snapshot mekanizmasını doğru anlayan ve kullanan bir sysadmin, hem üretim ortamında çok daha rahat hareket eder hem de felaketten geri dönüşü çok daha hızlı gerçekleştirir. Bu yazıda VMware snapshot’larını her boyutuyla ele alacağız; GUI üzerinden yapılanları değil, gerçek dünyada işe yarayan CLI yöntemlerini ve otomasyon senaryolarını konuşacağız.

Snapshot Nedir ve Nasıl Çalışır?

Snapshot kelimesini “anlık görüntü” olarak çevirsek de aslında bu tam olarak doğru değil. VMware snapshot’ı, sanal makinenin o andaki durumunu (disk durumu, bellek durumu ve ayarları) kaydeden bir kontrol noktasıdır. Snapshot alındıktan sonra yapılan tüm disk yazma işlemleri, orijinal VMDK dosyasına değil, delta disk dosyasına yazılır.

Bu çalışma mantığını anlamak kritik önem taşıyor:

  • Base VMDK: Snapshot alınmadan önceki orijinal disk dosyası, artık salt okunur hale gelir
  • Delta VMDK (-000001.vmdk): Snapshot sonrası tüm yazma işlemlerinin gittiği dosya
  • VMSN dosyası: Bellek durumunu içeren dosya (bellek snapshot’ı alındıysa)
  • VMSD dosyası: Snapshot metadata bilgilerini tutan dosya

Snapshot aldıkça delta dosyaları zincirleme büyür. Snapshot zinciri uzadıkça hem performans düşer hem de disk alanı şişer. Bu yüzden “snapshot = yedek” diye düşünmek büyük bir hata. Snapshot, kısa süreli bir güvenlik ağıdır; uzun vadeli yedekleme çözümü değildir.

VMware CLI ile Snapshot İşlemleri

vSphere ortamında GUI’den snapshot almak basit görünse de gerçek güç CLI’da. Özellikle toplu işlemler, zamanlama ve otomasyon söz konusu olduğunda vmrun ve govc araçları vazgeçilmez oluyor.

vmrun ile Temel Snapshot İşlemleri

VMware Workstation veya Fusion kullananlar için vmrun aracı doğrudan snapshot yönetimi sağlar:

# Snapshot alma (bellek durumu dahil)
vmrun -T ws snapshot /path/to/machine.vmx "pre-update-snapshot" -memory

# Snapshot alma (sadece disk durumu, bellek yok)
vmrun -T ws snapshot /path/to/machine.vmx "disk-only-snapshot"

# Mevcut snapshot'ları listeleme
vmrun -T ws listSnapshots /path/to/machine.vmx

# Belirli bir snapshot'a geri dönme
vmrun -T ws revertToSnapshot /path/to/machine.vmx "pre-update-snapshot"

# Snapshot silme
vmrun -T ws deleteSnapshot /path/to/machine.vmx "pre-update-snapshot"

govc ile vSphere Ortamında Snapshot Yönetimi

Kurumsal ortamlarda vCenter üzerindeki VM’leri yönetmek için govc aracı çok daha güçlü bir seçenek. Go dilinde yazılmış bu araç, vSphere API’sini doğrudan kullanıyor.

# govc ortam değişkenlerini ayarlama
export GOVC_URL="https://vcenter.sirket.local"
export GOVC_USERNAME="[email protected]"
export GOVC_PASSWORD="SifreGelsin123!"
export GOVC_INSECURE=true  # Self-signed sertifika varsa

# VM'nin snapshot listesini görme
govc snapshot.tree -vm "WebServer-Prod-01"

# Snapshot alma
govc snapshot.create -vm "WebServer-Prod-01" -memory -quiesce "pre-patch-20240115"

# Snapshot'a geri dönme
govc snapshot.revert -vm "WebServer-Prod-01" "pre-patch-20240115"

# Snapshot silme
govc snapshot.remove -vm "WebServer-Prod-01" "pre-patch-20240115"

Burada -quiesce parametresine dikkat edin. Bu parametre, VMware Tools aracılığıyla guest OS’in dosya sistemini tutarlı hale getirdikten sonra snapshot almasını sağlar. Özellikle veritabanı sunucuları için bu parametre kritik.

Gerçek Dünya Senaryosu 1: Toplu Patch Günü

Ayın ikinci Salı’sı, Microsoft’un patch günü. Elimizde 30 adet Windows Server 2022 VM var ve hepsine güncelleme yapmadan önce snapshot almamız gerekiyor. Tek tek GUI’den yapmak yerine şu script’i kullanıyoruz:

#!/bin/bash
# bulk-snapshot.sh - Toplu snapshot alma scripti

export GOVC_URL="https://vcenter.sirket.local"
export GOVC_USERNAME="[email protected]"
export GOVC_PASSWORD="${VCENTER_PASS}"  # Ortam değişkeninden al
export GOVC_INSECURE=true

SNAPSHOT_NAME="pre-patch-$(date +%Y%m%d)"
VM_LIST_FILE="/opt/scripts/windows-servers.txt"
LOG_FILE="/var/log/snapshot-operations.log"

echo "$(date): Toplu snapshot islemi basliyor" >> "$LOG_FILE"

while IFS= read -r vm_name; do
    echo "Snapshot aliniyor: $vm_name"
    
    if govc snapshot.create -vm "$vm_name" 
        -memory=false 
        -quiesce=true 
        "$SNAPSHOT_NAME" 2>> "$LOG_FILE"; then
        echo "$(date): BASARILI - $vm_name" >> "$LOG_FILE"
    else
        echo "$(date): HATA - $vm_name snapshot alinamadi" >> "$LOG_FILE"
        # Slack veya email notification buraya gelebilir
    fi
    
    # API rate limiting icin kisa bekleme
    sleep 2
    
done < "$VM_LIST_FILE"

echo "$(date): Toplu snapshot islemi tamamlandi" >> "$LOG_FILE"
echo "Snapshot islemi tamamlandi. Log: $LOG_FILE"

windows-servers.txt dosyasında her satırda bir VM adı bulunuyor. Script her VM için snapshot alıyor, başarı veya hata durumunu log’a yazıyor. Patch işlemleri tamamlandıktan sonra, sorun çıkmadıysa snapshot’ları temizlemek için de benzer bir script kullanıyoruz.

Gerçek Dünya Senaryosu 2: Otomatik Snapshot Temizleme

En büyük snapshot sorunlarından biri, alınan snapshot’ların unutulması. 2-3 günlük snapshot işe yarıyor ama 3 haftalık snapshot hem disk alanı yiyor hem de VM performansını dramatik şekilde düşürüyor. Bu yüzden otomatik temizleme kritik:

#!/bin/bash
# cleanup-old-snapshots.sh
# 3 gunden eski snapshot'lari siler

export GOVC_URL="https://vcenter.sirket.local"
export GOVC_USERNAME="[email protected]"
export GOVC_PASSWORD="${VCENTER_PASS}"
export GOVC_INSECURE=true

MAX_AGE_DAYS=3
THRESHOLD_DATE=$(date -d "$MAX_AGE_DAYS days ago" +%Y-%m-%d)

echo "Temizleme esigi: $THRESHOLD_DATE oncesi snapshot'lar silinecek"

# Tum VM'leri listele
govc ls /Datacenter/vm/Production | while read vm_path; do
    vm_name=$(basename "$vm_path")
    
    # VM'nin snapshot agacini JSON formatinda al
    snapshots=$(govc snapshot.tree -vm "$vm_name" -D -C 2>/dev/null)
    
    if [ -z "$snapshots" ]; then
        continue
    fi
    
    echo "Kontrol ediliyor: $vm_name"
    
    # govc snapshot.tree ciktisini isle ve eski snapshot'lari bul
    # Snapshot isimlerinde tarih formati: pre-patch-YYYYMMDD
    echo "$snapshots" | grep -oP 'pre-patch-d{8}' | while read snap_name; do
        snap_date=$(echo "$snap_name" | grep -oP 'd{8}' | 
            sed 's/(....)(..)(..)/1-2-3/')
        
        if [[ "$snap_date" < "$THRESHOLD_DATE" ]]; then
            echo "  Siliniyor: $snap_name ($vm_name)"
            govc snapshot.remove -vm "$vm_name" "$snap_name"
        fi
    done
done

Bu script’i cron ile çalıştırıyoruz:

# Crontab - Her gun saat 02:00'de calistir
0 2 * * * /opt/scripts/cleanup-old-snapshots.sh >> /var/log/snapshot-cleanup.log 2>&1

Snapshot Geri Yükleme: Kritik Anlar

Snapshot geri yüklemek, snapshot almaktan çok daha kritik bir işlem. Yanlış yapıldığında veri kaybı yaşanabilir. İşte dikkat edilmesi gereken durumlar:

Tek VM Geri Yükleme

# Once VM'nin mevcut snapshot'larini goster
govc snapshot.tree -vm "DatabaseServer-01" -D

# VM'yi durdurma (guvenli geri yukleme icin)
govc vm.power -off "DatabaseServer-01"

# Snapshot'a geri donme
govc snapshot.revert -vm "DatabaseServer-01" "pre-migration-20240110"

# VM'yi baslatma
govc vm.power -on "DatabaseServer-01"

# VM'nin ayakta olup olmadigini kontrol etme
govc vm.info "DatabaseServer-01" | grep -i "power state"

Bellek Snapshot’ı ile Geri Yükleme

Bellek snapshot’ı alındıysa, geri yüklendiğinde VM tam olarak snapshot alındığı andaki çalışma durumuna döner. VM açık kalır, açık uygulamalar aynen devam eder. Disk-only snapshot’ta ise VM kapalı durumda geri yüklenir.

# Bellek snapshot'i ile geri yukleme (VM kapali olmadan)
# Not: Bu durumda VM snapshot anindaki RAM durumuna donerO
govc snapshot.revert -vm "AppServer-01" -snap "pre-deploy-with-memory"

# Snapshot info'sunu kontrol etme
govc snapshot.tree -vm "AppServer-01" -D -C

PowerCLI ile İleri Seviye Yönetim

Windows tabanlı ortamlarda veya VMware’in kendi otomasyon dünyasında PowerCLI kullanmak çok yaygın. PowerShell scripting ile snapshot yönetimi çok güçlü bir hal alıyor:

# PowerCLI ile vCenter'a baglanma
Connect-VIServer -Server vcenter.sirket.local `
    -User "[email protected]" `
    -Password "SifreGelsin123!"

# Belirli bir klasordeki tum VM'lerin snapshot raporu
$folder = Get-Folder -Name "Production"
$vms = Get-VM -Location $folder

$snapshotReport = foreach ($vm in $vms) {
    $snapshots = Get-Snapshot -VM $vm
    foreach ($snap in $snapshots) {
        [PSCustomObject]@{
            VMName       = $vm.Name
            SnapName     = $snap.Name
            Created      = $snap.Created
            AgeDays      = (New-TimeSpan -Start $snap.Created -End (Get-Date)).Days
            SizeGB       = [math]::Round($snap.SizeGB, 2)
            Description  = $snap.Description
        }
    }
}

# 7 gundan eski snapshot'lari raporla
$oldSnapshots = $snapshotReport | Where-Object { $_.AgeDays -gt 7 }
$oldSnapshots | Format-Table -AutoSize

# Kritik buyuklukteki snapshot'lari (10GB uzeri) raporla  
$largeSnapshots = $snapshotReport | Where-Object { $_.SizeGB -gt 10 }
Write-Host "Buyuk snapshot sayisi: $($largeSnapshots.Count)"

Bu raporu aldıktan sonra hangi VM’lerin snapshot disiplininden saplandığını görebiliyorsunuz. Prod ortamında 15 günlük, 45 GB’lık snapshot’lar bulmak ne yazık ki çok sık karşılaşılan bir durum.

Snapshot Performans Sorunları ve Teşhis

Snapshot zinciri uzadıkça yaşanan performans sorunlarını çözmek için önce durumu teşhis etmek gerekiyor:

# ESXi host uzerinde snapshot durumunu kontrol etme
# ESXi'ye SSH ile baglandiktan sonra

# VM'nin bulundugu datastore'a git
cd /vmfs/volumes/datastore-prod

# Delta disk dosyalarini listele ve boyutlarini gor
find . -name "*-delta.vmdk" -o -name "*-000001.vmdk" | 
    xargs ls -lh 2>/dev/null

# Snapshot zinciri uzunlugunu gormek icin
find /vmfs/volumes/ -name "*.vmsd" -exec grep -l "snapshot" {} ; | 
    while read vmsd; do
        vm_dir=$(dirname "$vmsd")
        snap_count=$(grep -c "snapshot.id" "$vmsd" 2>/dev/null || echo 0)
        if [ "$snap_count" -gt "0" ]; then
            echo "VM: $vm_dir - Snapshot sayisi: $snap_count"
        fi
    done

Snapshot sorunlarının en iyi çözümü “snapshot birleştirme” (consolidation) işlemi. Delta diskler birleştirilmezse VM’nin delta zinciri giderek büyür:

# govc ile snapshot consolidation
govc vm.consolidate -vm "WebServer-Prod-01"

# Consolidation gerekiyor mu kontrol etme
govc vm.info -vm "WebServer-Prod-01" | grep -i "consolidation"

# Tum VM'lerde consolidation ihtiyaci olanlari bul
govc ls /Datacenter/vm/Production | while read vm; do
    vm_name=$(basename "$vm")
    needs_consolidation=$(govc vm.info "$vm_name" 2>/dev/null | 
        grep -i "ConsolidationNeeded: true")
    if [ -n "$needs_consolidation" ]; then
        echo "Consolidation gerekiyor: $vm_name"
    fi
done

Snapshot ile Felaket Kurtarma Planı

Snapshot tek başına bir felaket kurtarma (DR) çözümü değil ama DR planının bir parçası olabilir. İşte tipik bir senaryo:

Senaryo: Üretim veritabanı sunucusuna kritik bir schema değişikliği uygulanacak. Değişiklik başarısız olursa 15 dakika içinde eski duruma dönülmesi gerekiyor.

#!/bin/bash
# db-migration-with-snapshot.sh

VCENTER_URL="https://vcenter.sirket.local"
VM_NAME="DatabaseServer-Prod-01"
SNAP_NAME="pre-schema-migration-$(date +%Y%m%d-%H%M)"
DB_HOST="10.0.1.50"
DB_USER="dbadmin"

echo "=== Veritabani Migration Hazirlik ==="

# 1. Adim: Snapshot al
echo "Snapshot aliniyor: $SNAP_NAME"
govc snapshot.create 
    -vm "$VM_NAME" 
    -quiesce=true 
    -memory=false 
    "$SNAP_NAME"

if [ $? -ne 0 ]; then
    echo "KRITIK: Snapshot alinamadi! Migration iptal ediliyor."
    exit 1
fi

echo "Snapshot basariyla alindi. Migration baslayabilir."
echo "Geri donmek icin: govc snapshot.revert -vm $VM_NAME $SNAP_NAME"

# 2. Adim: Migration scripti calistir (ornek)
# ssh $DB_USER@$DB_HOST "mysql -u root schema_migration.sql"

# 3. Adim: Sonucu kontrol et
read -p "Migration basarili miydi? (y/n): " result

if [ "$result" = "y" ]; then
    echo "Basarili! Snapshot siliniyor..."
    govc snapshot.remove -vm "$VM_NAME" "$SNAP_NAME"
    echo "Snapshot silindi. Islem tamamlandi."
else
    echo "Migration basarisiz! Snapshot'a geri donuluyor..."
    govc vm.power -off "$VM_NAME"
    govc snapshot.revert -vm "$VM_NAME" "$SNAP_NAME"
    govc vm.power -on "$VM_NAME"
    echo "Geri yukleme tamamlandi. VM eski durumuna dondu."
fi

Sık Yapılan Hatalar ve Kaçınma Yöntemleri

Yıllar içinde gördüğüm en yaygın snapshot hatalarını şöyle özetleyebilirim:

  • Snapshot’ı yedek zannetmek: Snapshot, SAN veya NAS arızasına karşı sizi korumaz. Orijinal datastore giderse snapshot da gider. Gerçek yedekleme için Veeam, Zerto veya VMware’in kendi Data Protection çözümleri kullanılmalı.
  • Snapshot zincirini uzun tutmak: 72 saati geçen snapshot’lar performans sorunlarına neden olur. Birden fazla snapshot birikirse delta zincirleri devasa boyutlara ulaşabilir.
  • Quiesce olmadan veritabanı snapshot’ı almak: MySQL, MSSQL veya Oracle’ın çalıştığı VM’lerde quiesce yapılmadan alınan snapshot’lar tutarsız veri içerebilir. VMware Tools kurulu ve güncel olmalı.
  • Snapshot sırasında VM’yi kapatmamak (kritik işlemler için): Bellek snapshot’ı almak disk alanı ve zaman harcatır. Kritik durum değilse disk-only snapshot yeterli ve daha hızlı.
  • Consolidation ihtiyacını görmezden gelmek: vCenter bazen snapshot silinse bile fiziksel dosyaları birleştirmeden bırakabilir. Düzenli olarak consolidation kontrolü yapılmalı.
  • Storage kapasitesini hesaplamamak: Delta diskler en kötü senaryoda orijinal disk boyutuna kadar büyüyebilir. Snapshot alacaksanız en az %50 ekstra boş alan olsun.

Monitoring ve Alerting Kurulumu

Snapshot durumunu izlemek için basit bir monitoring script’i:

#!/bin/bash
# snapshot-monitor.sh - Problemli snapshot'lari raporlar

export GOVC_URL="https://vcenter.sirket.local"
export GOVC_USERNAME="${VCENTER_USER}"
export GOVC_PASSWORD="${VCENTER_PASS}"
export GOVC_INSECURE=true

ALERT_EMAIL="[email protected]"
MAX_SNAPSHOT_AGE=3  # gun
MAX_SNAPSHOT_COUNT=3

issues_found=false
report=""

# Tum VM'leri kontrol et
govc ls /Datacenter/vm/... 2>/dev/null | grep -v "/$" | while read vm_path; do
    vm_name=$(basename "$vm_path")
    
    # Snapshot agacini al
    snap_output=$(govc snapshot.tree -vm "$vm_name" -D 2>/dev/null)
    [ -z "$snap_output" ] && continue
    
    snap_count=$(echo "$snap_output" | wc -l)
    
    if [ "$snap_count" -gt "$MAX_SNAPSHOT_COUNT" ]; then
        echo "UYARI: $vm_name - $snap_count adet snapshot mevcut (max: $MAX_SNAPSHOT_COUNT)"
        issues_found=true
    fi
done

# Bu output email veya Slack'e gonderilebilir
# mail -s "VMware Snapshot Raporu" $ALERT_EMAIL < /tmp/snapshot-report.txt

Sonuç

VMware snapshot yönetimi, basit görünen ama hataları pahalıya mal olan bir konu. Doğru yapıldığında kritik operasyonlarda inanılmaz bir güvenlik ağı sunarken, yanlış yapıldığında depolama alanını tüketir ve VM performansını çökertir.

Özetlemek gerekirse: Snapshot al, işini yap, hemen sil. Uzun vadeli tutuyorsan nedenini belgelendir ve monitore et. Quiesce parametresini veritabanı VM’lerinde asla atlama. Toplu işlemlerde mutlaka otomasyon kullan, elle 30 VM’ye snapshot alma. Consolidation kontrolünü haftada bir rutinine al. Ve en önemlisi, snapshot’ın gerçek bir yedekleme olmadığını asla unutma; Veeam ya da benzeri bir çözümle snapshot’ı destekle.

Bu araçları ve script’leri kendi ortamınıza uyarlayarak kullanmaya başladığınızda, patch günleri ve kritik migration’lar sizin için çok daha az stresli hale gelecek. Sonuçta sistem yöneticiliğinin güzelliği de tam bu noktada: doğru araçları kullanarak kontrolü elinizde tutmak.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir