Proxmox ile VM Snapshot Yönetimi: Tam Rehber
Proxmox ortamında çalışıyorsanız, snapshot’ların hayatınızı ne kadar kolaylaştırdığını muhtemelen bir kez yaşayıp anlamışsınızdır. Bir güncelleme öncesi “acaba bir şeyler bozulur mu?” kaygısıyla geçen o gergin dakikaları hatırlıyor musunuz? İşte snapshot yönetimi tam olarak o kaygıyı ortadan kaldıran şey. Bu yazıda Proxmox VE üzerinde VM snapshot’larını nasıl verimli şekilde yöneteceğinizi, nelere dikkat etmeniz gerektiğini ve gerçek senaryolarda nasıl kullanabileceğinizi ele alacağız.
Snapshot Nedir ve Neden Önemlidir?
Snapshot, bir sanal makinenin belirli bir andaki disk, RAM ve yapılandırma durumunun anlık görüntüsüdür. Backup ile karıştırılmamalı. Backup, verinizin başka bir yere taşınmış tam kopyasıdır. Snapshot ise mevcut disk imajının üzerine delta (fark) yazarak çalışır; yani orijinal veriyi hareket ettirmez, sadece “bu andan sonraki değişiklikleri ayrı takip ediyorum” der.
Proxmox’ta snapshot’lar QEMU/KVM altyapısı üzerine inşa edilmiştir ve iki temel bileşeni kapsar:
- Disk snapshot’ı: QCOW2 formatındaki diskin anlık görüntüsü
- RAM snapshot’ı: VM’in o anki bellek içeriği (isteğe bağlı)
RAM snapshot’ı dahil ettiğinizde geri dönüşte VM tam kaldığı yerden devam eder. Dahil etmediğinizde ise disk durumuna döner, VM yeniden başlatılır.
Önemli not: LVM-Thin veya ZFS storage backend kullanıyorsanız snapshot desteği mükemmeldir. Ancak raw LVM veya directory bazlı storage’da sınırlılıklar yaşayabilirsiniz.
Proxmox Web Arayüzünden Snapshot Almak
En temel yöntemle başlayalım. Web GUI üzerinden snapshot almak oldukça basittir:
- VM’i seçin, sol panelden Snapshots sekmesine gidin
- Take Snapshot butonuna tıklayın
- Snapshot adı ve açıklama girin
- Include RAM seçeneğini ihtiyacınıza göre işaretleyin
Ancak biz sysadmin’iz, terminal olmadan olmaz.
CLI ile Snapshot İşlemleri
Proxmox, qm komutu üzerinden snapshot yönetimini tamamen CLI’dan yapmanıza olanak tanır. Bu komutları bilmek özellikle otomasyon senaryolarında kritik önem taşır.
Snapshot Alma
# Temel kullanım: qm snapshot <vmid> <snapshot_adı>
qm snapshot 101 pre-update-snapshot --description "Kernel güncellemesi öncesi"
# RAM dahil snapshot
qm snapshot 101 pre-update-with-ram --vmstate 1 --description "RAM ile birlikte snapshot"
Mevcut Snapshot’ları Listeleme
# Belirli bir VM'in snapshot listesi
qm listsnapshot 101
# Çıktı formatı:
# current -> pre-update-snapshot
# pre-update-snapshot (2024-01-15 14:30:22)
Snapshot’a Geri Dönme (Rollback)
# VM durdurulmadan rollback (dikkatli kullanın)
qm rollback 101 pre-update-snapshot
# Güvenli yöntem: önce durdur, sonra rollback
qm stop 101
qm rollback 101 pre-update-snapshot
qm start 101
Snapshot Silme
# Tek snapshot silme
qm delsnapshot 101 pre-update-snapshot
# Force flag ile silme (snapshot zinciri bozuksa)
qm delsnapshot 101 pre-update-snapshot --force 1
Otomatik Snapshot Script’i
Gerçek ortamlarda snapshot’ları manuel almak hem zahmetlidir hem de unutmaya açıktır. Aşağıdaki script, belirli VM’ler için otomatik snapshot alır ve eski snapshot’ları temizler:
#!/bin/bash
# /usr/local/bin/vm-snapshot-manager.sh
# Proxmox otomatik snapshot script'i
# Yapılandırma
VMIDS="101 102 105 110" # Snapshot alınacak VM'ler
RETENTION_COUNT=5 # Kaç snapshot tutulacak
SNAPSHOT_PREFIX="auto" # Snapshot adı prefix'i
LOG_FILE="/var/log/vm-snapshots.log"
# Tarih formatı
DATE=$(date +%Y%m%d-%H%M%S)
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
take_snapshot() {
local vmid=$1
local snap_name="${SNAPSHOT_PREFIX}-${DATE}"
log "VM $vmid için snapshot alınıyor: $snap_name"
if qm snapshot "$vmid" "$snap_name" --description "Otomatik snapshot - $DATE"; then
log "VM $vmid snapshot başarılı: $snap_name"
else
log "HATA: VM $vmid snapshot alınamadı!"
return 1
fi
}
cleanup_old_snapshots() {
local vmid=$1
# Prefix'e göre snapshot'ları listele ve eski olanları sil
local snapshots
snapshots=$(qm listsnapshot "$vmid" | grep "$SNAPSHOT_PREFIX" | awk '{print $2}' | sort)
local count
count=$(echo "$snapshots" | grep -c "$SNAPSHOT_PREFIX" || true)
if [ "$count" -gt "$RETENTION_COUNT" ]; then
local to_delete=$((count - RETENTION_COUNT))
local old_snaps
old_snaps=$(echo "$snapshots" | head -n "$to_delete")
while IFS= read -r snap; do
if [ -n "$snap" ]; then
log "Eski snapshot siliniyor: VM $vmid - $snap"
qm delsnapshot "$vmid" "$snap" || log "UYARI: $snap silinemedi"
fi
done <<< "$old_snaps"
fi
}
# Ana döngü
for vmid in $VMIDS; do
# VM var mı kontrol et
if ! qm status "$vmid" &>/dev/null; then
log "UYARI: VM $vmid bulunamadı, atlanıyor"
continue
fi
take_snapshot "$vmid"
cleanup_old_snapshots "$vmid"
done
log "Snapshot işlemleri tamamlandı"
Bu script’i crontab’a ekleyerek günlük çalıştırabilirsiniz:
# Root crontab'ını düzenle
crontab -e
# Her gece 02:00'de çalıştır
0 2 * * * /usr/local/bin/vm-snapshot-manager.sh
Güncelleme Öncesi Snapshot Workflow’u
Gerçek bir senaryo üzerinden gidelim. Diyelim ki production’daki bir web sunucusunu güncelleyeceksiniz.
#!/bin/bash
# Güncelleme öncesi güvenli snapshot workflow'u
VMID=105
SNAP_NAME="pre-upgrade-$(date +%Y%m%d)"
echo "=== Güvenli Güncelleme Workflow'u ==="
# 1. VM durumunu kontrol et
echo "VM durumu kontrol ediliyor..."
qm status $VMID
# 2. Snapshot al
echo "Snapshot alınıyor..."
qm snapshot $VMID "$SNAP_NAME"
--description "Sistem güncellemesi öncesi - $(date)"
--vmstate 0
echo "Snapshot alındı: $SNAP_NAME"
# 3. Snapshot'ı doğrula
echo "Mevcut snapshot'lar:"
qm listsnapshot $VMID
echo ""
echo "Güncellemeye devam edebilirsiniz."
echo "Sorun yaşarsanız rollback için: qm rollback $VMID $SNAP_NAME"
Güncelleme sonrası sorun çıkarsa:
# Hızlı rollback
VMID=105
SNAP_NAME="pre-upgrade-20240115"
echo "Rollback başlatılıyor..."
qm stop $VMID && sleep 5
qm rollback $VMID $SNAP_NAME
qm start $VMID
echo "VM eski haline döndürüldü"
qm status $VMID
ZFS ile Snapshot Yönetimi
Proxmox’u ZFS üzerine kurduysanız, snapshot yönetiminde hem qm komutlarını hem de doğrudan ZFS snapshot’larını kullanabilirsiniz. ZFS snapshot’ları son derece hızlı ve alan verimlidir.
# ZFS pool ve dataset listesi
zfs list
# Belirli bir VM'in ZFS dataset'ini bul
# Genellikle: rpool/data/vm-101-disk-0
# Manuel ZFS snapshot
zfs snapshot rpool/data/vm-101-disk-0@before-migration
# ZFS snapshot listesi
zfs list -t snapshot | grep vm-101
# ZFS snapshot'a rollback
zfs rollback rpool/data/vm-101-disk-0@before-migration
# Snapshot boyutunu göster
zfs list -t snapshot -o name,used,referenced
# Eski snapshot'ı sil
zfs destroy rpool/data/vm-101-disk-0@before-migration
ZFS snapshot’larının güzel yanı, clone özelliğiyle birlikte test ortamı kurulumunu dakikalar içinde yapabilmenizdir:
# Production VM'den test ortamı oluştur
zfs snapshot rpool/data/vm-101-disk-0@test-clone
zfs clone rpool/data/vm-101-disk-0@test-clone rpool/data/vm-201-disk-0
echo "Test VM için yeni disk hazır: rpool/data/vm-201-disk-0"
Snapshot Performans Etkileri ve Dikkat Edilmesi Gerekenler
Snapshot’larla ilgili en sık yapılan hatalardan biri, çok fazla snapshot biriktirmektir. Her yeni snapshot, disk yazma işlemlerini yavaşlatır çünkü QCOW2 formatında snapshot zinciri oluştukça her yazma işlemi daha fazla işlem gerektirir.
Performans degradasyonunu önlemek için:
- Aktif olarak kullanılmayan snapshot’ları düzenli silin
- Üretim VM’lerde aynı anda 3-5’ten fazla snapshot tutmaktan kaçının
- RAM snapshot’ları disk alanı tüketimini ciddi artırır, gereksiz almayın
- QCOW2 yerine ZFS veya LVM-Thin kullanıyorsanız bu sorun çok daha az hissedilir
Snapshot boyutlarını kontrol etmek için:
# VM disk kullanımını incele
qemu-img info /var/lib/vz/images/101/vm-101-disk-0.qcow2
# Snapshot zincirini göster
qemu-img snapshot -l /var/lib/vz/images/101/vm-101-disk-0.qcow2
# Tüm VM'lerin disk kullanım özeti
for vmid in $(qm list | awk 'NR>1 {print $1}'); do
echo "=== VM $vmid ==="
qm listsnapshot $vmid 2>/dev/null || echo "Snapshot yok"
done
Snapshot’ları Başka Proxmox Node’larına Taşımak
Cluster ortamında çalışıyorsanız veya DR (Disaster Recovery) senaryolarınız varsa, snapshot içeren VM’leri başka bir node’a taşımak gerekebilir.
# VM'i başka bir node'a migrate et (snapshot'larla birlikte)
# NOT: Live migration snapshot içeren VM'lerde çalışmaz
# Önce VM'i durdur
qm stop 101
# Offline migration
qm migrate 101 pve-node2 --with-local-disks 1
# Alternatif: VM'i dışa aktar
vzdump 101 --compress zstd --storage backup-storage --mode snapshot
Snapshot içeren VM’lerin live migration’ında kısıtlamalar olduğunu unutmayın. Proxmox, snapshot bulunan VM’lerde dirty bit tracking mekanizması nedeniyle live migration’ı engeller. Bu durumda ya snapshot’ları silmeniz ya da offline migration kullanmanız gerekir.
Toplu Snapshot Yönetimi ve Raporlama
Çok sayıda VM olan ortamlarda tüm snapshot durumunu tek bakışta görmek büyük kolaylık sağlar:
#!/bin/bash
# /usr/local/bin/snapshot-report.sh
# Tüm VM'lerin snapshot durumu raporu
echo "==================================="
echo "PROXMOX SNAPSHOT DURUM RAPORU"
echo "Tarih: $(date)"
echo "==================================="
echo ""
TOTAL_SNAPS=0
for vmid in $(qm list | awk 'NR>1 {print $1}'); do
vmname=$(qm config "$vmid" | grep "^name:" | awk '{print $2}')
snaps=$(qm listsnapshot "$vmid" 2>/dev/null | grep -v "^current" | grep -v "current$")
snap_count=$(echo "$snaps" | grep -c "." 2>/dev/null || echo 0)
if [ "$snap_count" -gt 0 ]; then
echo "VM $vmid ($vmname) - $snap_count snapshot:"
qm listsnapshot "$vmid" | grep -v "current"
echo ""
TOTAL_SNAPS=$((TOTAL_SNAPS + snap_count))
fi
done
echo "==================================="
echo "Toplam snapshot sayısı: $TOTAL_SNAPS"
echo "==================================="
# Script'i çalıştırılabilir yap ve test et
chmod +x /usr/local/bin/snapshot-report.sh
/usr/local/bin/snapshot-report.sh
# Haftalık rapor için cron ekle
echo "0 8 * * 1 /usr/local/bin/snapshot-report.sh | mail -s 'Proxmox Snapshot Raporu' [email protected]" >> /etc/crontab
Snapshot ile Hızlı Test Ortamı Kurma
Bu benim en sevdiğim kullanım senaryolarından biri. Production VM’den anında test ortamı oluşturmak:
#!/bin/bash
# Production VM'den test clone'u oluştur
PROD_VMID=101
TEST_VMID=201
CLONE_NAME="test-env-$(date +%Y%m%d)"
echo "Production VM $PROD_VMID'den test ortamı oluşturuluyor..."
# Snapshot al
qm snapshot $PROD_VMID "for-clone-$(date +%Y%m%d)"
--description "Test clone için"
# Full clone oluştur (linked clone için --full 0)
qm clone $PROD_VMID $TEST_VMID
--name "$CLONE_NAME"
--full 1
--description "Production clone - $(date)"
# Test VM'in ağ ayarlarını değiştir (production ağından izole et)
qm set $TEST_VMID --net0 virtio,bridge=vmbr1
# Test VM'i başlat
qm start $TEST_VMID
echo "Test ortamı hazır: VM $TEST_VMID ($CLONE_NAME)"
echo "Test bittikten sonra silmek için: qm stop $TEST_VMID && qm destroy $TEST_VMID"
Linked clone vs Full clone farkı:
- Full clone: Tamamen bağımsız disk kopyası oluşturur, daha fazla alan kullanır ama performans kaybı yoktur
- Linked clone: Kaynak disk snapshot’ına bağımlı kalır, az alan kullanır ama kaynak silinirse çalışmaz
Test ortamları için full clone, geliştirme ortamları için linked clone tercih edilebilir.
Snapshot Sorunlarını Gidermek
Zaman zaman snapshot işlemleri beklenmedik hatalar verebilir. En sık karşılaşılan sorunlar ve çözümleri:
Snapshot alınamıyor hatası:
# VM'in lock durumunu kontrol et
cat /var/lock/qemu-server/lock-101.conf
# Gerekirse lock'ı temizle (dikkatli kullanın!)
rm /var/lock/qemu-server/lock-101.conf
# Storage durumunu kontrol et
pvesm status
# Disk alanını kontrol et
df -h
zpool list # ZFS kullanıyorsanız
Rollback sonrası VM açılmıyor:
# VM log'larını incele
qm showcmd 101
journalctl -u qemu-server@101
# QCOW2 dosyasını kontrol et
qemu-img check /var/lib/vz/images/101/vm-101-disk-0.qcow2
# Tutarsız snapshot zincirini onar
qemu-img check --repair /var/lib/vz/images/101/vm-101-disk-0.qcow2
Snapshot silme takılıyor:
# Force ile silmeyi dene
qm delsnapshot 101 problem-snapshot --force 1
# Hala çalışmıyorsa Proxmox log'larına bak
tail -f /var/log/pve/tasks/active
Sonuç
Proxmox snapshot yönetimi, doğru kullanıldığında hem günlük operasyonlarınızı hem de felaket kurtarma senaryolarınızı çok daha güvenli hale getirir. Özetleyecek olursak:
- Snapshot’ları backup’ın yerini tutmaz, tamamlayıcı bir araç olarak kullanın
- Üretim ortamlarında snapshot sayısını makul tutun, performans etkisini göz önünde bulundurun
- ZFS veya LVM-Thin storage backend’i kullandığınızda snapshot işlemleri çok daha verimlidir
- Otomatik snapshot ve temizleme script’lerini cron ile çalıştırarak insan hatasını minimize edin
- Her büyük güncelleme veya yapılandırma değişikliği öncesi snapshot almayı alışkanlık haline getirin
- Snapshot raporlama script’leriyle ortamınızın genel snapshot sağlığını takip edin
En kritik nokta şu: Snapshot aldınız, iyi. Ama test etmediniz mi? O zaman hiç almamış gibi sayılır. Her ay en az bir kez, alınan snapshot’lardan rollback yaparak geri dönüşün gerçekten çalıştığını doğrulayın. Felaket anında “acaba bu snapshot sağlıklı mıydı?” sorusunu sormak istemezsiniz.
