Bacula ile Depolama Aygıtı Yapılandırması
Bacula kurulumunun en kritik adımlarından biri olan depolama aygıtı yapılandırması, çoğu zaman dokümanlarda yüzeysel geçilir. Oysa yanlış yapılandırılmış bir storage device, yedekleme işlemlerinin sessiz sedasız başarısız olmasına ya da disk alanının verimsiz kullanılmasına neden olabilir. Bu yazıda Storage Daemon tarafından yönetilen depolama aygıtlarını, gerçek dünya senaryolarıyla birlikte ele alacağız.
Bacula Depolama Mimarisini Anlamak
Bacula’nın üç ana bileşeni vardır: Director, File Daemon ve Storage Daemon. Depolama aygıtı yapılandırması tamamen Storage Daemon (SD) tarafından yönetilir. SD, fiziksel ya da sanal yedekleme medyasını kontrol eden servis olarak düşünülebilir.
Bacula’da depolama aygıtları iki temel kategoriye ayrılır:
- File Storage (Disk tabanlı): Yerel disk, NFS mount, iSCSI volume gibi blok ya da dosya sistemi tabanlı depolama
- Tape Storage (Bant tabanlı): LTO, DLT gibi fiziksel bant sürücüler veya sanal bant kütüphaneleri
Storage Daemon yapılandırma dosyası genellikle /etc/bacula/bacula-sd.conf konumunda bulunur. Bu dosyada üç temel kaynak tanımı yaparsınız: Storage, Director ve Device.
Temel Yapılandırma Dosyası Yapısı
Önce mevcut yapılandırma dosyasına bir göz atalım ve ne işe yaradığını anlayalım:
# Mevcut yapılandırmayı yedekle
sudo cp /etc/bacula/bacula-sd.conf /etc/bacula/bacula-sd.conf.bak
# Yapılandırma dosyasını görüntüle
sudo cat /etc/bacula/bacula-sd.conf
Temel bir Storage Daemon yapılandırması şu şekilde görünür:
# /etc/bacula/bacula-sd.conf
Storage {
Name = backup-server-sd
SDPort = 9103
WorkingDirectory = "/var/lib/bacula"
Pid Directory = "/run/bacula"
Plugin Directory = "/usr/lib/bacula"
Maximum Concurrent Jobs = 20
SDAddress = 192.168.1.10
}
Director {
Name = backup-server-dir
Password = "GucluBirSifre123!"
}
Messages {
Name = Standard
director = backup-server-dir = all
}
SDAddress parametresi özellikle dikkat ister. Çok sayıda ağ arayüzüne sahip bir sunucuda, yedekleme trafiğini belirli bir interface üzerinden yönlendirmek için bu değeri açıkça belirtmelisiniz.
Disk Tabanlı Depolama Aygıtı Yapılandırması
En yaygın senaryo olan disk tabanlı depolamadan başlayalım. Diyelim ki /backup dizinini yedekleme alanı olarak kullanacaksınız.
Önce gerekli dizin yapısını oluşturun:
# Yedekleme dizinlerini oluştur
sudo mkdir -p /backup/pool-daily
sudo mkdir -p /backup/pool-weekly
sudo mkdir -p /backup/pool-monthly
# Bacula kullanıcısına sahiplik ver
sudo chown -R bacula:bacula /backup
sudo chmod -R 750 /backup
# Dizin yapısını kontrol et
ls -la /backup/
Şimdi bu dizinler için Device tanımlarını yapılandıralım:
# /etc/bacula/bacula-sd.conf dosyasına eklenecek Device tanımları
Device {
Name = FileStorage-Daily
Media Type = File
Archive Device = /backup/pool-daily
LabelMedia = yes
Random Access = Yes
AutomaticMount = yes
RemovableMedia = no
AlwaysOpen = no
Maximum Concurrent Jobs = 5
Maximum File Size = 2GB
}
Device {
Name = FileStorage-Weekly
Media Type = File
Archive Device = /backup/pool-weekly
LabelMedia = yes
Random Access = Yes
AutomaticMount = yes
RemovableMedia = no
AlwaysOpen = no
Maximum Concurrent Jobs = 3
Maximum File Size = 5GB
}
Device {
Name = FileStorage-Monthly
Media Type = File
Archive Device = /backup/pool-monthly
LabelMedia = yes
Random Access = Yes
AutomaticMount = yes
RemovableMedia = no
AlwaysOpen = no
Maximum Concurrent Jobs = 2
Maximum File Size = 10GB
}
Önemli parametreleri açıklayalım:
- LabelMedia: Etiketsiz medyayı otomatik olarak etiketler, disk tabanlı depolamada genellikle
yesolmalıdır - Random Access: Disk tabanlı depolama için her zaman
Yesolmalıdır, bant sürücüler içinNo - AutomaticMount: Servis başlarken aygıtı otomatik bağlar
- Maximum File Size: Tek bir volume dosyasının alabileceği maksimum boyut
- Maximum Concurrent Jobs: Bu aygıtta aynı anda çalışabilecek maksimum iş sayısı
Director Tarafında Storage Tanımı
Storage Daemon’daki Device tanımları tek başına yeterli değildir. Director yapılandırmasında da eşleşen Storage kaynakları tanımlanmalıdır:
# /etc/bacula/bacula-dir.conf dosyasına eklenecek Storage tanımları
Storage {
Name = File-Daily
Address = 192.168.1.10
SDPort = 9103
Password = "GucluBirSifre123!"
Device = FileStorage-Daily
Media Type = File
Maximum Concurrent Jobs = 5
}
Storage {
Name = File-Weekly
Address = 192.168.1.10
SDPort = 9103
Password = "GucluBirSifre123!"
Device = FileStorage-Weekly
Media Type = File
Maximum Concurrent Jobs = 3
}
Burada dikkat edilmesi gereken nokta: Password değeri hem Director hem de Storage Daemon yapılandırmasında birbiriyle eşleşmeli, Device değeri ise SD tarafındaki Device kaynak adıyla birebir aynı olmalıdır.
Bant Sürücüsü Yapılandırması
Kurumsal ortamlarda LTO bant sürücüler hala yaygın kullanılır. Özellikle uzun süreli arşivleme ve uyumluluk gereksinimleri için bant depolama kaçınılmaz olabiliyor. LTO-8 sürücüsü olan bir ortam için yapılandırma şu şekilde olur:
# Önce bant sürücüyü tanımla
Device {
Name = LTO8-Drive-0
Media Type = LTO8
Archive Device = /dev/nst0
AutomaticMount = yes
AlwaysOpen = yes
RemovableMedia = yes
Random Access = No
AutoChanger = yes
Drive Index = 0
Alert Command = "sh -c 'tapeinfo -f %c | grep TapeAlert'"
Maximum Block Size = 524288
Hardware End of Medium = No
Fast Forward Space File = No
BSF at EOM = yes
Two EOF = yes
Label Block Size = 64512
}
Bant yapılandırmasına özgü parametreler:
- AlwaysOpen: Bant sürücüler için
yesolmalıdır, açık bırakmak performansı artırır - AutoChanger: Bant kütüphanesi kullanıyorsanız
yesyapın - Drive Index: Kütüphanedeki sürücü indeksi, 0’dan başlar
- Alert Command: Bant uyarılarını izlemek için çalıştırılacak komut
- Maximum Block Size: Bant verimliliği için blok boyutu, genellikle 512KB önerilir
- Two EOF: Dosya sonuna çift EOF yazar, bazı sürücüler için gereklidir
- BSF at EOM: Medya sonuna ulaşıldığında geriye doğru boşluk bırakır
Otomatik Changer (Bant Kütüphanesi) Yapılandırması
Birden fazla bant sürücüsü ve kartuşu olan bir ortamda Autochanger tanımlaması gerekir:
# Autochanger tanımı - bacula-sd.conf içine eklenir
Autochanger {
Name = LTO8-Library
Changer Command = "/usr/lib/bacula/mtx-changer %c %o %S %a %d"
Changer Device = /dev/sg0
Device = LTO8-Drive-0, LTO8-Drive-1
}
Device {
Name = LTO8-Drive-1
Media Type = LTO8
Archive Device = /dev/nst1
AutomaticMount = yes
AlwaysOpen = yes
RemovableMedia = yes
Random Access = No
AutoChanger = yes
Drive Index = 1
Maximum Block Size = 524288
}
mtx-changer script’inin doğru çalıştığını test etmek için:
# mtx komutunun mevcut durumunu kontrol et
sudo mtx -f /dev/sg0 status
# Bacula changer script'ini test et
sudo /usr/lib/bacula/mtx-changer /dev/sg0 list 0 /dev/nst0 0
sudo /usr/lib/bacula/mtx-changer /dev/sg0 slots
# Bant sürücüsüne erişimi test et
sudo mt -f /dev/nst0 status
NFS Üzerinde Uzak Depolama
Birçok ortamda yedeklemeler NFS ile bağlanmış bir NAS cihazına yazılır. Bu senaryo için önce mount yapılandırması:
# /etc/fstab'a NFS mount ekle
echo "192.168.1.50:/export/backups /backup nfs4 rw,hard,intr,rsize=1048576,wsize=1048576,timeo=600,retrans=2,_netdev 0 0" | sudo tee -a /etc/fstab
# Mount et ve test et
sudo mount -a
df -h /backup
# Bacula servisinin başlamadan önce mount'un hazır olduğundan emin ol
sudo systemctl edit bacula-sd.service
Systemd override dosyasına şunu ekleyin:
# /etc/systemd/system/bacula-sd.service.d/override.conf
[Unit]
After=network-online.target remote-fs.target
Requires=network-online.target
[Service]
# NFS hazır değilse servisi başlatma
ExecStartPre=/bin/bash -c 'until mountpoint -q /backup; do sleep 2; done'
Yapılandırmanın Doğrulanması ve Test Edilmesi
Yapılandırma değişikliklerinden sonra her zaman önce syntax kontrolü yapılmalıdır:
# Storage Daemon yapılandırmasını kontrol et
sudo bacula-sd -t -c /etc/bacula/bacula-sd.conf
# Director yapılandırmasını kontrol et
sudo bacula-dir -t -c /etc/bacula/bacula-dir.conf
# Servisleri yeniden başlat
sudo systemctl restart bacula-sd
sudo systemctl restart bacula-dir
# Servis durumunu kontrol et
sudo systemctl status bacula-sd
sudo journalctl -u bacula-sd -f
Bconsole ile depolama aygıtlarını test etmek:
# Bconsole'a bağlan
sudo bconsole
# Storage durumunu sorgula
*status storage=File-Daily
# Tüm storage aygıtlarını listele
*show storage
# Otomatik label ile test volume oluştur
*label storage=File-Daily pool=Daily
# Volume durumunu kontrol et
*list volumes
Pool Yapılandırması ile Entegrasyon
Device tanımları tek başına yeterli değildir; hangi volume’ların hangi aygıtta saklanacağını belirlemek için Pool yapılandırmasıyla entegre edilmesi gerekir:
# /etc/bacula/bacula-dir.conf içindeki Pool tanımları
Pool {
Name = Daily
Pool Type = Backup
Recycle = yes
AutoPrune = yes
Volume Retention = 8 days
Maximum Volume Bytes = 2GB
Maximum Volumes = 30
Label Format = "Daily-"
Storage = File-Daily
Next Pool = Weekly
}
Pool {
Name = Weekly
Pool Type = Backup
Recycle = yes
AutoPrune = yes
Volume Retention = 35 days
Maximum Volume Bytes = 5GB
Maximum Volumes = 10
Label Format = "Weekly-"
Storage = File-Weekly
Next Pool = Monthly
}
Pool {
Name = Monthly
Pool Type = Backup
Recycle = yes
AutoPrune = yes
Volume Retention = 365 days
Maximum Volume Bytes = 10GB
Maximum Volumes = 13
Label Format = "Monthly-"
Storage = File-Monthly
}
Next Pool parametresi, Migration ve Copy job’larla birlikte verileri otomatik olarak bir pooldan diğerine taşımak için kullanılır. Bu, modern Bacula kurulumlarında disk-to-disk-to-tape (D2D2T) stratejisinin temelidir.
Gerçek Dünya Senaryosu: Çoklu Site Yedekleme
Birden fazla ofisi olan bir şirkette merkezi yedekleme senaryosu oldukça yaygındır. Bu senaryoda her lokasyondaki File Daemon, merkezdeki Storage Daemon’a bağlanır ve şifreli bağlantı üzerinden veri aktarımı gerçekleşir.
SD tarafında lokasyona göre ayrı device’lar tanımlamak işleri düzenli tutar:
# İstanbul ofisi için ayrı storage
Device {
Name = FileStorage-Istanbul
Media Type = File-IST
Archive Device = /backup/istanbul
LabelMedia = yes
Random Access = Yes
AutomaticMount = yes
RemovableMedia = no
AlwaysOpen = no
Maximum Concurrent Jobs = 10
Maximum File Size = 3GB
# Sıkıştırma etkinleştir, ağ üzerinden gelen veriyi disk'te sıkıştır
# Not: Bu SD tarafında değil FD tarafında yapılır
}
# Ankara ofisi için ayrı storage
Device {
Name = FileStorage-Ankara
Media Type = File-ANK
Archive Device = /backup/ankara
LabelMedia = yes
Random Access = Yes
AutomaticMount = yes
RemovableMedia = no
AlwaysOpen = no
Maximum Concurrent Jobs = 8
Maximum File Size = 3GB
}
Her lokasyon için Media Type değerinin farklı olmasına dikkat edin. Bu sayede Bacula, yanlış bir volume’ü yanlış bir pool’a yazmaz.
Disk Doluluk Takibi ve Otomasyon
Depolama aygıtlarının doluluk durumunu izlemek ve kritik eşiklerde uyarı almak için basit bir monitoring script’i:
#!/bin/bash
# /usr/local/bin/bacula-storage-check.sh
THRESHOLD=85
BACKUP_DIRS=("/backup/pool-daily" "/backup/pool-weekly" "/backup/pool-monthly")
ALERT_EMAIL="[email protected]"
for DIR in "${BACKUP_DIRS[@]}"; do
if mountpoint -q "$DIR" || [ -d "$DIR" ]; then
USAGE=$(df -h "$DIR" | awk 'NR==2 {print $5}' | tr -d '%')
if [ "$USAGE" -gt "$THRESHOLD" ]; then
echo "UYARI: $DIR dizini %$USAGE dolu!" |
mail -s "Bacula Depolama Uyarisi - $HOSTNAME" "$ALERT_EMAIL"
logger -t bacula-monitor "Kritik: $DIR %$USAGE dolu"
fi
else
echo "HATA: $DIR dizini erişilebilir değil!" |
mail -s "Bacula Depolama Hatasi - $HOSTNAME" "$ALERT_EMAIL"
fi
done
# Bacula volume istatistiklerini de kontrol et
echo "select VolumeName, VolBytes, VolFiles, VolStatus from Media where PoolId in (select PoolId from Pool where Name='Daily') limit 20;" |
sudo bconsole -c /etc/bacula/bconsole.conf 2>/dev/null
Bu script’i crontab’a ekleyin:
# Saatte bir kontrol et
echo "0 * * * * root /usr/local/bin/bacula-storage-check.sh" | sudo tee -a /etc/cron.d/bacula-monitor
sudo chmod +x /usr/local/bin/bacula-storage-check.sh
Yaygın Sorunlar ve Çözümleri
Depolama aygıtı yapılandırmasında en sık karşılaşılan sorunlar ve çözümleri:
Volume label eşleşmemesi sorunu: Volume label mismatch hatası alıyorsanız, Volume’ün Media Type değeri Device’daki Media Type ile eşleşmiyor demektir. Bconsole’dan update volume komutuyla düzeltilebilir.
Storage Daemon’a bağlantı hatası: Cannot connect to Storage daemon hatası için önce SD’nin çalıştığını doğrulayın, ardından Director yapılandırmasındaki Password ve Address değerlerini kontrol edin. Firewall kurallarında 9103 portunun açık olduğundan emin olun:
# SD portunu kontrol et
sudo ss -tlnp | grep 9103
# Firewall kuralını ekle (firewalld için)
sudo firewall-cmd --permanent --add-port=9103/tcp
sudo firewall-cmd --reload
# UFW için
sudo ufw allow 9103/tcp
Disk doluluk nedeniyle başarısız yedekler: Bacula bir volume’ü dolduğunda otomatik olarak yeni volume açmaya çalışır. Maximum Volume Bytes değeri çok küçük ayarlanmışsa sürekli yeni volume oluşturulur ve disk hızla dolar. Maximum Volumes parametresiyle maksimum volume sayısını sınırlandırın ve otomatik prune mekanizmasının doğru çalıştığından emin olun.
İzin hataları: SD’nin archive dizinine yazma izni olmayabilir:
# İzinleri kontrol et ve düzelt
ls -la /backup/
sudo chown -R bacula:bacula /backup/
sudo chmod -R 750 /backup/
# SELinux varsa context'i düzelt
sudo semanage fcontext -a -t bacula_store_t "/backup(/.*)?"
sudo restorecon -Rv /backup/
Performans Optimizasyonu
Büyük ortamlarda depolama performansı kritik önem taşır. Birkaç önemli optimizasyon:
- Maximum Block Size: Disk tabanlı depolamada varsayılan 65536 byte yerine
Maximum Block Size = 1048576ayarlayarak büyük bloklar kullanın - Spool Data: Director’daki Job tanımına
Spool Data = yesveSpool Size = 2GBekleyerek önce geçici alana yazıp sonra aktarın, bu ağ sorunlarından kaynaklanan yeniden başlatmaları önler - Concurrent Jobs:
Maximum Concurrent Jobsdeğerini depolama aygıtının IOPS kapasitesine göre ayarlayın, gereğinden yüksek değer tersine performans düşüşüne neden olur
Sonuç
Bacula’da depolama aygıtı yapılandırması, yedekleme sisteminin kalbi sayılır. Yanlış yapılandırılmış bir device tanımı sessizce başarısız yedeklemelere, disk alanı israfına ve kurtarma anında sürprizlere yol açar. Bu yazıda anlattığımız yapılandırmaları uygularken birkaç altın kuralı aklınızda tutun: Her değişiklikten sonra syntax kontrolü yapın, yeni device’ları gerçek yedekleme işleriyle test edin, depolama doluluk oranını aktif olarak izleyin ve en önemlisi periyodik olarak gerçek bir restore testi gerçekleştirin. Sisteminizin yedek aldığını bilmek yeterli değildir; o yedekten geri dönebilmeniz gerekir.
Bir sonraki yazıda Bacula’da Job ve Schedule yapılandırmasına geçeceğiz. Sorularınız varsa yorum bölümünde buluşalım.
