Bacula ile VMware vSphere Sanal Makine Yedekleme Entegrasyonu
VMware vSphere ortamlarında sanal makineleri yedeklemek, geleneksel fiziksel sunucu yedeklemelerinden oldukça farklı bir yaklaşım gerektiriyor. Bacula’yı vSphere ile entegre ettiğinizde, hem snapshot tabanlı tutarlı yedekler alabilir hem de merkezi yönetim avantajından faydalanabilirsiniz. Bu yazıda sıfırdan kurulumu, yapılandırmayı ve gerçek dünya senaryolarını ele alacağız.
Neden Bacula ve vSphere Birlikte?
Kurumsal ortamlarda sıkça karşılaştığım bir durum şu: Onlarca, hatta yüzlerce sanal makine var, her birinin ayrı bir yedekleme ajanı var ve yönetim tam anlamıyla kabus. Bacula’nın vSphere entegrasyonu bu soruna şöyle bir çözüm sunuyor: VADP (vStorage APIs for Data Protection) sayesinde sanal makineleri VMware katmanından, yani hypervisor seviyesinden yedekleyebiliyorsunuz. Bu yaklaşımın avantajları şunlar:
- Sanal makine içine ajan kurmanıza gerek kalmıyor (agentless yedekleme)
- VMware snapshot mekanizmasını kullanarak tutarlı, çalışır durumdaki yedekler alınıyor
- vCenter üzerinden tüm VM’leri merkezi olarak yönetebiliyorsunuz
- Changed Block Tracking (CBT) ile artımlı yedekleme destekleniyor
- Yedekleme penceresi önemli ölçüde kısalıyor
Bacula Enterprise sürümü bu entegrasyon için native destek sunuyor. Bacula Community sürümünde ise Bacula-VMware Plugin veya üçüncü parti araçlarla entegrasyon sağlanabiliyor. Bu yazıda her iki yaklaşıma da değineceğiz.
Ortam Gereksinimleri
Kuruluma geçmeden önce ortamınızın hazır olduğundan emin olmanız gerekiyor. Bir müşteri ortamında bu adımı atladığımızda saatler kaybetmiştik.
Bacula Director ve Storage Daemon için:
- Bacula 11.0 veya üzeri (Community) / Bacula Enterprise 14.x
- CentOS/RHEL 8+ veya Ubuntu 20.04+
- VMware vSphere SDK for Python (pyvmomi)
- Bacula VMware Plugin (bacula-vmware-plugin paketi)
VMware Tarafında:
- vCenter Server 6.7 veya üzeri
- ESXi 6.7 veya üzeri
- vSphere API erişimi açık olmalı
- Dedicated yedekleme hesabı (minimum gerekli roller ile)
Ağ Gereksinimleri:
- Bacula Storage Daemon’ın ESXi host’larına 443/TCP ile erişimi
- vCenter’a 443/TCP erişimi
- Yedekleme trafiği için ayrı VLAN önerilir (production ağını patlatmamak için)
vCenter’da Yedekleme Hesabı Oluşturma
En az yetki prensibini burada da uyguluyoruz. vCenter’da özel bir yedekleme rolü oluşturuyoruz:
# vSphere CLI ile rol oluşturma
govc role.create bacula-backup-role
Datastore.Browse
Datastore.FileManagement
Global.DisableMethods
Global.EnableMethods
VirtualMachine.Config.DiskLease
VirtualMachine.Interact.GuestControl
VirtualMachine.State.CreateSnapshot
VirtualMachine.State.RemoveSnapshot
VirtualMachine.State.RevertToSnapshot
VirtualMachine.Provisioning.DiskRandomAccess
VirtualMachine.Provisioning.GetVmFiles
Bu rolü oluşturduktan sonra vCenter GUI’den veya CLI’dan yedekleme kullanıcısına atıyoruz:
# govc ile kullanıcıya rol atama
govc permissions.set
-principal [email protected]
-role bacula-backup-role
-propagate=true
/datacenter01
Bacula VMware Plugin Kurulumu
Plugin Paketinin Yüklenmesi
Plugin’i Bacula’nın resmi deposundan veya kaynak koddan derleyerek kurabilirsiniz. CentOS 8 örneği:
# Bacula reposunu ekleyelim
cat > /etc/yum.repos.d/bacula.repo << 'EOF'
[bacula-community]
name=Bacula Community Repository
baseurl=https://www.bacula.org/packages/8622e34f6d5a2e3d6b3a8f4d9c1e7b2a/rpms/14.0/el8/x86_64/
gpgcheck=1
gpgkey=https://www.bacula.org/downloads/Bacula-4096-Distribution-Verification-key.asc
enabled=1
EOF
# Plugin paketini yükleyelim
dnf install -y bacula-vmware-plugin bacula-vmware-plugin-libs
# Python bağımlılıklarını yükleyelim
pip3 install pyvmomi requests
Plugin başarıyla kurulduktan sonra Bacula File Daemon’ın plugin dizinini kontrol edin:
# Plugin yolunu doğrulayın
ls -la /usr/lib64/bacula/plugins/ | grep vmware
# vmware-fd.so dosyasını görmelisiniz
# bacula-fd.conf içindeki plugin dizinini kontrol edin
grep -i plugindir /etc/bacula/bacula-fd.conf
VMware Plugin Yapılandırma Dosyası
Plugin’in vCenter’a bağlanabilmesi için bir yapılandırma dosyası oluşturuyoruz:
cat > /etc/bacula/vmware.conf << 'EOF'
# VMware vCenter Bağlantı Ayarları
[vmware]
vcenter_host = vcenter01.sirket.local
vcenter_port = 443
vcenter_username = [email protected]
vcenter_password = GucluBirSifre123!
ssl_verify = true
ca_cert = /etc/bacula/certs/vcenter-ca.pem
# Snapshot Ayarları
snapshot_name = Bacula_Backup
snapshot_description = Bacula tarafindan olusturulan yedekleme snapshot
snapshot_memory = false
snapshot_quiesce = true
# CBT (Changed Block Tracking) Ayarları
enable_cbt = true
cbt_reset_on_full = true
# Timeout Ayarları
connection_timeout = 30
operation_timeout = 3600
EOF
chmod 600 /etc/bacula/vmware.conf
chown bacula:bacula /etc/bacula/vmware.conf
Bacula Director Yapılandırması
FileSet Tanımı
VMware sanal makineleri için özel bir FileSet tanımlaması gerekiyor. Bu yapılandırma, hangi VM’lerin ve hangi disklerin yedekleneceğini belirliyor:
# /etc/bacula/conf.d/vmware-filesets.conf
FileSet {
Name = "VMware-Production-VMs"
Include {
Options {
signature = MD5
compression = LZO
# VMware plugin'e özgü seçenekler
plugin = "vmware"
}
# Plugin direktifleri
Plugin = "vmware:
vcenter=vcenter01.sirket.local
[email protected]
password=GucluBirSifre123!
vm_name=webserver01
include_disk=Hard disk 1
include_disk=Hard disk 2
transport=nbdssl"
Plugin = "vmware:
vcenter=vcenter01.sirket.local
[email protected]
password=GucluBirSifre123!
vm_folder=/Datacenter/vm/Production
transport=nbdssl
exclude_vm=test-.*
exclude_vm=dev-.*"
}
}
Burada transport=nbdssl seçeneği önemli. NBD (Network Block Device) üzerinden şifreli iletişim sağlıyor. Eğer Bacula Storage Daemon ESXi host ile aynı ağdaysa hotadd transport modunu da kullanabilirsiniz; bu çok daha hızlı.
Job Tanımları
Şimdi yedekleme işlerini tanımlayalım. Production ortamında genellikle şu yapıyı kullanıyorum:
# /etc/bacula/conf.d/vmware-jobs.conf
# Tam Yedekleme - Haftalık
Job {
Name = "VMware-Full-Weekly"
Type = Backup
Level = Full
Client = bacula-vmware-fd
FileSet = "VMware-Production-VMs"
Schedule = "WeeklyFullSchedule"
Storage = VMwareStorage
Pool = VMware-Full-Pool
Messages = Standard
Priority = 10
Maximum Concurrent Jobs = 2
SpoolData = yes
# VM snapshot için özel yazma modu
WriteBootstrap = "/var/lib/bacula/VMware-Full-Weekly.bsr"
}
# Artımlı Yedekleme - Günlük
Job {
Name = "VMware-Incremental-Daily"
Type = Backup
Level = Incremental
Client = bacula-vmware-fd
FileSet = "VMware-Production-VMs"
Schedule = "DailyIncrementalSchedule"
Storage = VMwareStorage
Pool = VMware-Incremental-Pool
Messages = Standard
Priority = 10
Maximum Concurrent Jobs = 3
SpoolData = yes
WriteBootstrap = "/var/lib/bacula/VMware-Incremental.bsr"
}
# Schedule Tanımları
Schedule {
Name = "WeeklyFullSchedule"
Run = Level=Full sun at 02:00
}
Schedule {
Name = "DailyIncrementalSchedule"
Run = Level=Incremental mon-sat at 23:00
}
Storage ve Pool Yapılandırması
VMware yedeklemeleri için ayrı bir storage ve pool tanımlamak yönetimi kolaylaştırıyor:
# /etc/bacula/conf.d/vmware-storage.conf
Storage {
Name = VMwareStorage
Address = backup-server01.sirket.local
SDPort = 9103
Password = "StoragePassword123"
Device = VMware-AutoChanger
Media Type = VMwareTape
Maximum Concurrent Jobs = 4
}
Pool {
Name = VMware-Full-Pool
Pool Type = Backup
Recycle = yes
AutoPrune = yes
Volume Retention = 4 weeks
Maximum Volume Bytes = 500G
Maximum Volumes = 20
Label Format = "VMware-Full-"
Next Pool = VMware-Offsite-Pool
}
Pool {
Name = VMware-Incremental-Pool
Pool Type = Backup
Recycle = yes
AutoPrune = yes
Volume Retention = 2 weeks
Maximum Volume Bytes = 200G
Maximum Volumes = 50
Label Format = "VMware-Inc-"
}
Changed Block Tracking (CBT) Yapılandırması
CBT, VMware’in sunduğu en değerli özelliklerden biri. Bir önceki yedekten sonra değişen blokları takip ediyor ve sadece değişen kısımları yedeklemenize izin veriyor. Büyük disk boyutlarında inanılmaz fark yaratıyor.
CBT’yi etkinleştirmek için:
# CBT durumunu kontrol eden script
cat > /usr/local/bin/check-vm-cbt.sh << 'SCRIPT'
#!/bin/bash
# govc ile tüm VM'lerde CBT durumunu kontrol et
VCENTER="vcenter01.sirket.local"
export GOVC_URL="https://[email protected]:GucluBirSifre123!@${VCENTER}"
export GOVC_INSECURE=0
export GOVC_TLS_CA_CERTS="/etc/bacula/certs/vcenter-ca.pem"
echo "VM CBT Durum Raporu - $(date)"
echo "================================"
for vm in $(govc ls /Datacenter/vm/Production/); do
vm_name=$(basename "$vm")
cbt_status=$(govc vm.info -json "$vm" | python3 -c "
import json,sys
data=json.load(sys.stdin)
config=data['VirtualMachines'][0]['Config']
print(config.get('ChangeTrackingEnabled', False))
")
echo "VM: $vm_name | CBT: $cbt_status"
done
SCRIPT
chmod +x /usr/local/bin/check-vm-cbt.sh
Geri Yükleme Senaryoları
Tam VM Geri Yükleme
Gerçek dünyada en çok ihtiyaç duyduğunuz senaryo bu. Bir VM’nin tamamen bozulduğunu düşünün:
# bconsole üzerinden restore işlemi
bconsole << 'EOF'
restore
# Menüden "Select the most recent backup for a client" seçeneğini seçin (5)
5
# Client'ı belirtin
mark all
done
# Restore hedefini belirtin - orijinal lokasyon veya farklı datastore
# Restore type: 1=Full VM, 2=Specific files
EOF
Komut satırından otomatik restore için:
# Otomatik VM restore scripti
cat > /usr/local/bin/restore-vm.sh << 'SCRIPT'
#!/bin/bash
VM_NAME="${1}"
RESTORE_DATE="${2:-latest}"
TARGET_DATASTORE="${3:-datastore01}"
if [ -z "$VM_NAME" ]; then
echo "Kullanim: $0 <vm_name> [restore_date] [target_datastore]"
exit 1
fi
echo "VM restore basliyor: $VM_NAME"
echo "Hedef Datastore: $TARGET_DATASTORE"
bconsole << BCONSOLE
restore client=bacula-vmware-fd
where=/vmfs/volumes/${TARGET_DATASTORE}/restored_${VM_NAME}
select
2
${VM_NAME}
done
yes
BCONSOLE
echo "Restore tamamlandi. Sonucu kontrol edin."
SCRIPT
chmod +x /usr/local/bin/restore-vm.sh
Dosya Seviyesinde Geri Yükleme (FLR)
Bazen tüm VM’yi değil, sadece bir dosyayı geri yüklemeniz gerekiyor. VMware plugin bu durumda sanal diski mount ediyor:
# Dosya seviyesi geri yükleme için plugin mount komutu
cat > /etc/bacula/conf.d/flr-restore.conf << 'EOF'
Job {
Name = "VMware-FLR-Restore"
Type = Restore
Client = bacula-vmware-fd
FileSet = "VMware-Production-VMs"
Storage = VMwareStorage
Pool = VMware-Full-Pool
Messages = Standard
# Dosya seviyesi restore için mount noktası
Where = /mnt/bacula-restore
# VMware plugin FLR modu
Plugin Options = "vmware:flr_mode=true:mount_point=/mnt/vm-disks"
}
EOF
İzleme ve Alerting
Yedekleme işlerinin başarılı olup olmadığını takip etmek kritik. Basit ama etkili bir izleme scripti:
#!/bin/bash
# /usr/local/bin/bacula-vmware-monitor.sh
# Crontab: 0 8 * * * /usr/local/bin/bacula-vmware-monitor.sh
MAIL_TO="[email protected]"
BACULA_HOST="backup-server01.sirket.local"
FAILED_JOBS=""
WARNING_JOBS=""
# Son 24 saatteki job durumlarını çek
JOB_STATUS=$(echo "list jobs last 24hours" | bconsole | grep -E "VMware")
# Başarısız jobları tespit et
while IFS= read -r line; do
if echo "$line" | grep -qE "E|f"; then
FAILED_JOBS="${FAILED_JOBS}n${line}"
elif echo "$line" | grep -qE "W"; then
WARNING_JOBS="${WARNING_JOBS}n${line}"
fi
done <<< "$JOB_STATUS"
# Alert gönder
if [ -n "$FAILED_JOBS" ]; then
echo -e "KRITIK: VMware yedekleme hatalari tespit edildi!nnBasarisiz Joblar:n${FAILED_JOBS}" |
mail -s "[KRITIK] Bacula VMware Yedekleme Hatasi - ${BACULA_HOST}" "$MAIL_TO"
fi
# Snapshot temizliği kontrolü - asılı kalan snapshotları tespit et
export GOVC_URL="https://[email protected]:[email protected]"
STALE_SNAPSHOTS=$(govc snapshot.tree -vm "*" 2>/dev/null | grep "Bacula_Backup" |
awk -v date="$(date -d '2 hours ago' +%Y-%m-%dT%H:%M)" '$0 < date')
if [ -n "$STALE_SNAPSHOTS" ]; then
echo -e "UYARI: Asili kalan Bacula snapshotlari bulundu!n${STALE_SNAPSHOTS}" |
mail -s "[UYARI] Asili VMware Snapshot - ${BACULA_HOST}" "$MAIL_TO"
fi
Sık Karşılaşılan Sorunlar ve Çözümleri
Snapshot Temizlenmeme Sorunu
Yedekleme ortasında bir hata oluşursa snapshot silinmeyebilir. Bu hem disk dolmasına hem de VM performansının düşmesine yol açar. Düzenli temizlik zorunlu:
# Asılı kalan Bacula snapshot'larını temizle
cat > /usr/local/bin/cleanup-bacula-snapshots.sh << 'SCRIPT'
#!/bin/bash
export GOVC_URL="https://[email protected]:[email protected]"
export GOVC_TLS_CA_CERTS="/etc/bacula/certs/vcenter-ca.pem"
# 4 saatten eski Bacula snapshotlarını bul ve sil
govc find / -type m | while read vm; do
govc snapshot.tree -vm "$vm" 2>/dev/null | while read snapshot_info; do
if echo "$snapshot_info" | grep -q "Bacula_Backup"; then
snap_time=$(echo "$snapshot_info" | grep -oP 'd{4}-d{2}-d{2}Td{2}:d{2}')
current_time=$(date +%s)
snap_timestamp=$(date -d "$snap_time" +%s 2>/dev/null)
age_hours=$(( (current_time - snap_timestamp) / 3600 ))
if [ "$age_hours" -gt 4 ]; then
echo "Eski snapshot siliniyor: $vm - $snap_time (${age_hours} saat)"
govc snapshot.remove -vm "$vm" "Bacula_Backup"
fi
fi
done
done
SCRIPT
chmod +x /usr/local/bin/cleanup-bacula-snapshots.sh
CBT Bozulması
Bazen CBT veritabanı bozulabiliyor ve artımlı yedekler beklenenden büyük geliyor. Çözüm şu:
- VMware host’unu bakım moduna alın
- Storage vMotion ile VM’yi başka bir datastore’a taşıyın ve geri getirin
- Bu işlem CBT’yi sıfırlıyor
- Bir sonraki yedekleme Full alınarak CBT yeniden başlatılıyor
SSL Sertifika Sorunları
vCenter sertifikasını Bacula’nın güvendiği certificate store’a eklemeyi unutmayın:
# vCenter CA sertifikasını indir ve ekle
openssl s_client -connect vcenter01.sirket.local:443 -showcerts 2>/dev/null |
openssl x509 -outform PEM > /etc/bacula/certs/vcenter-ca.pem
# Sistem sertifika deposuna da ekleyelim
cp /etc/bacula/certs/vcenter-ca.pem /etc/pki/ca-trust/source/anchors/
update-ca-trust extract
Performans Optimizasyonu
Büyük ortamlarda yedekleme penceresini küçültmek için şu ayarları yapın:
- Maximum Concurrent Jobs: Director ve Storage Daemon’da eş zamanlı job sayısını artırın, ancak ESXi host başına maksimum 4 eş zamanlı VADP bağlantısına dikkat edin
- Transport Mode Seçimi: Bacula ve ESXi aynı ağdaysa
nbdsslyerinehotaddkullanın, okuma hızı 3-5 kat artıyor - Compression: LZO kullanın, LZ4 kadar hızlı değil ama sıkıştırma oranı daha iyi
- SpoolData: Disk boyutunuz yeterliyse açın, bant/disk yazmasını optimize ediyor
- CBT’yi mutlaka aktif tutun: 100 GB diskli bir VM’de sadece 2 GB değişiklik olduysa sadece 2 GB yedekleniyor
Sonuç
Bacula ile vSphere entegrasyonu ilk kurulumda biraz karmaşık görünebilir, ancak doğru kurulduktan sonra son derece güvenilir ve ölçeklenebilir bir yapı oluşturuyor. Bu yazıda ele aldığımız noktaları özetleyecek olursak:
- vCenter’da minimum yetki prensibine uygun servis hesabı oluşturun
- CBT’yi mutlaka aktif tutun, hem zaman hem bant genişliği tasarrufu sağlıyor
- Asılı kalan snapshot’lar için otomatik temizlik scriptini crontab’a ekleyin
- Transport modunu ağ topolojinize göre seçin
- Yedekleme başarı durumunu günlük mail ile takip edin
Gerçek bir DR tatbikatı yapmadan yedekleme sistemine güvenmek tehlikeli. Her 3 ayda bir en az bir kritik VM’yi test ortamına restore edip uygulamanın çalışıp çalışmadığını doğrulayın. Yedek aldığınızı sanmak ile yedek aldığınızı bilmek arasındaki fark, tam da en kötü anda ortaya çıkıyor.
