Bacula Director, Storage ve File Daemon Kurulumu

Bacula’yı ilk defa kuranların çoğu, servis mimarisini kavramakta zorlanır. “Neden bu kadar çok bileşen var?” sorusu sıkça duyulur. Aslında bu modüler yapı, Bacula’yı kurumsal ortamlarda bu kadar güçlü kılan şeydir. Bu yazıda Bacula’nın iki kritik bileşeni olan Storage Daemon ve File Daemon‘ı sıfırdan kuracağız, yapılandıracağız ve gerçek dünya senaryolarıyla test edeceğiz.

Bacula Mimarisi Hakkında Kısa Bir Hatırlatma

Bacula üç ana bileşenden oluşur. Bunları ayrı servisler olarak düşünmek işleri kolaylaştırır.

  • Bacula Director: Tüm yedekleme işlemlerini yöneten beyin. Hangi makinenin ne zaman yedekleneceğine bu servis karar verir.
  • Storage Daemon (SD): Yedek verilerinin fiziksel olarak yazıldığı ve okunduğu servis. Disk, bant sürücüsü veya sanal teyp kütüphanesiyle konuşur.
  • File Daemon (FD): Yedeklenecek istemci makinelerde çalışan ajan. Verileri Director’ın talimatıyla Storage Daemon’a gönderir.

Tipik bir üretim ortamında Director ayrı bir sunucuda, Storage Daemon depolama sunucusunda, File Daemon ise her yedeklenecek istemcide çalışır. Ama küçük ortamlar için hepsini tek sunucuya da kurabilirsiniz.

Ortam Hazırlığı ve Ön Gereksinimler

Bu rehberde şu senaryoyu kullanacağız:

  • director.example.com (192.168.1.10): Bacula Director kurulu, bu yazıda SD ve FD da buraya kurulacak
  • client01.example.com (192.168.1.20): Yedeklenecek Linux istemcisi, sadece FD kurulacak
  • İşletim Sistemi: Ubuntu 22.04 LTS (CentOS/RHEL için paket adları farklıdır, onlara da değineceğiz)

Kuruluma başlamadan önce sunucuların birbirleriyle hostname üzerinden iletişim kurabildiğinden emin olun.

# /etc/hosts dosyasına ekle (DNS yoksa)
echo "192.168.1.10 director.example.com" >> /etc/hosts
echo "192.168.1.20 client01.example.com" >> /etc/hosts

# Bağlantıyı test et
ping -c 3 director.example.com
ping -c 3 client01.example.com

Sistemleri güncelleyin ve gerekli paketleri yükleyin:

# Ubuntu/Debian için
apt update && apt upgrade -y
apt install -y bacula-director bacula-sd bacula-fd bacula-console bacula-common

# CentOS/RHEL için
yum install -y bacula-director bacula-storage bacula-client bacula-console

Paket kurulumu tamamlandıktan sonra servis durumlarını kontrol edin:

systemctl status bacula-director
systemctl status bacula-sd
systemctl status bacula-fd

Muhtemelen hepsi “failed” ya da “inactive” durumunda görünecektir. Bu normal, henüz yapılandırmadık.

Storage Daemon Yapılandırması

Storage Daemon’ın ana yapılandırma dosyası Ubuntu’da /etc/bacula/bacula-sd.conf yolundadır. Bu dosyayı açıp inceleyin.

Storage Daemon Temel Parametreleri

Yapılandırmayı sıfırdan oluşturalım. Önce mevcut dosyayı yedekleyin:

cp /etc/bacula/bacula-sd.conf /etc/bacula/bacula-sd.conf.bak

Şimdi /etc/bacula/bacula-sd.conf dosyasını şu şekilde düzenleyin:

Storage {
  Name = storage-daemon
  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 = bacula-dir
  Password = "guclu-bir-sifre-buraya-gelecek"
}

Autochanger {
  Name = FileStorage
  Device = FileChgr1
  Changer Command = ""
  Changer Device = /dev/null
}

Device {
  Name = FileChgr1
  Media Type = File
  Archive Device = /backup/bacula
  LabelMedia = yes
  Random Access = Yes
  AutomaticMount = yes
  RemovableMedia = no
  AlwaysOpen = no
  Maximum Concurrent Jobs = 5
}

Messages {
  Name = Standard
  Director = bacula-dir = all
}

Yedek dizinini oluşturun ve izinleri ayarlayın:

mkdir -p /backup/bacula
chown -R bacula:bacula /backup/bacula
chmod 750 /backup/bacula

# Disk alanını kontrol et
df -h /backup

Storage Daemon İçin Şifre Belirleme

Bacula’da bileşenler birbirleriyle şifreli bağlantı kurar. Bu şifreleri rastgele üretmek iyi bir pratiktir:

# Güçlü rastgele şifre üret
openssl rand -base64 33
# Çıktı örneği: xK9mP2qRsT8vWnYzA1bCdEfGhIjKlMnO

# Bu şifreyi not edin, Director yapılandırmasında da kullanacaksınız

Şimdi Storage Daemon’ı başlatın ve test edin:

systemctl enable bacula-sd
systemctl start bacula-sd
systemctl status bacula-sd

# Port dinlenip dinlenmediğini kontrol et
ss -tlnp | grep 9103

Herhangi bir hata alırsanız logları inceleyin:

tail -f /var/log/bacula/bacula-sd.log
# veya
journalctl -u bacula-sd -f

Storage Daemon’a Birden Fazla Depolama Alanı Eklemek

Gerçek ortamlarda genellikle birden fazla yedek dizini veya depolama birimi kullanırsınız. Örneğin günlük yedekler için hızlı SSD, uzun dönem arşiv için yavaş ama büyük HDD dizisi:

Device {
  Name = FastStorage
  Media Type = File1
  Archive Device = /mnt/ssd/bacula
  LabelMedia = yes
  Random Access = Yes
  AutomaticMount = yes
  RemovableMedia = no
  AlwaysOpen = no
  Maximum Concurrent Jobs = 10
  Minimum Block Size = 65536
  Maximum Block Size = 262144
}

Device {
  Name = ArchiveStorage
  Media Type = File2
  Archive Device = /mnt/hdd/bacula-archive
  LabelMedia = yes
  Random Access = Yes
  AutomaticMount = yes
  RemovableMedia = no
  AlwaysOpen = no
  Maximum Concurrent Jobs = 2
}

Bu yapılandırma, Director tarafında farklı Pool’lara farklı depolama alanı atamanızı sağlar.

File Daemon Yapılandırması

File Daemon, yedeklenecek her makinede çalışması gereken hafif bir ajandır. Çok az kaynak tüketir ama doğru yapılandırılması kritiktir.

Director Sunucusunda FD Yapılandırması

Director sunucusunda (192.168.1.10) aynı zamanda kendi kendini de yedeklemek isteyebilirsiniz. /etc/bacula/bacula-fd.conf dosyasını düzenleyin:

FileDaemon {
  Name = director-fd
  FDport = 9102
  WorkingDirectory = /var/lib/bacula
  Pid Directory = /run/bacula
  Plugin Directory = /usr/lib/bacula
  Maximum Concurrent Jobs = 20
  FDAddress = 192.168.1.10
}

Director {
  Name = bacula-dir
  Password = "fd-icin-ayri-bir-sifre"
}

Messages {
  Name = Standard
  Director = bacula-dir = all
}

İstemci Sunucusunda FD Kurulumu

client01.example.com (192.168.1.20) üzerinde sadece File Daemon kurulacak:

# Ubuntu/Debian istemcide
apt update
apt install -y bacula-fd

# CentOS/RHEL istemcide
yum install -y bacula-client

İstemcideki /etc/bacula/bacula-fd.conf dosyasını düzenleyin:

FileDaemon {
  Name = client01-fd
  FDport = 9102
  WorkingDirectory = /var/lib/bacula
  Pid Directory = /run/bacula
  Plugin Directory = /usr/lib/bacula
  Maximum Concurrent Jobs = 10
  FDAddress = 192.168.1.20
}

Director {
  Name = bacula-dir
  Password = "client01-icin-guclu-sifre-buraya"
}

Messages {
  Name = Standard
  Director = bacula-dir = all
}

İstemcide servisi başlatın:

systemctl enable bacula-fd
systemctl start bacula-fd
systemctl status bacula-fd

# Port kontrolü
ss -tlnp | grep 9102

Güvenlik Duvarı Yapılandırması

Bacula bileşenleri arasındaki iletişim için firewall kuralları ekleyin:

# Director sunucusunda (UFW ile)
ufw allow 9101/tcp comment "Bacula Director"
ufw allow 9102/tcp comment "Bacula File Daemon"
ufw allow 9103/tcp comment "Bacula Storage Daemon"

# veya iptables ile
iptables -A INPUT -p tcp --dport 9101 -j ACCEPT
iptables -A INPUT -p tcp --dport 9102 -j ACCEPT
iptables -A INPUT -p tcp --dport 9103 -j ACCEPT

# CentOS/RHEL firewalld ile
firewall-cmd --permanent --add-port=9101/tcp
firewall-cmd --permanent --add-port=9102/tcp
firewall-cmd --permanent --add-port=9103/tcp
firewall-cmd --reload

İstemci sunucusunda sadece FD portu gereklidir:

# İstemcide (UFW)
ufw allow from 192.168.1.10 to any port 9102 proto tcp

Director Yapılandırmasına SD ve FD Eklenmesi

Storage Daemon ve File Daemon kurulumları tamamlandıktan sonra, Director’a bu bileşenleri tanıtmamız gerekiyor. /etc/bacula/bacula-dir.conf dosyasını düzenleyin.

Director’ın ana yapılandırmasına Storage tanımı ekleyin:

Storage {
  Name = File1
  Address = 192.168.1.10
  SDPort = 9103
  Password = "guclu-bir-sifre-buraya-gelecek"
  Device = FileChgr1
  Media Type = File
  Maximum Concurrent Jobs = 10
}

Client {
  Name = director-fd
  Address = 192.168.1.10
  FDPort = 9102
  Catalog = MyCatalog
  Password = "fd-icin-ayri-bir-sifre"
  File Retention = 60 days
  Job Retention = 6 months
  AutoPrune = yes
}

Client {
  Name = client01-fd
  Address = 192.168.1.20
  FDPort = 9102
  Catalog = MyCatalog
  Password = "client01-icin-guclu-sifre-buraya"
  File Retention = 30 days
  Job Retention = 3 months
  AutoPrune = yes
}

Şifrelerin birbiriyle eşleştiğinden emin olun. Director’daki Client bloğundaki şifre, istemcideki bacula-fd.conf dosyasındaki Director bloğundaki şifreyle aynı olmalıdır. Aynı şekilde Storage bloğundaki şifre, bacula-sd.conf dosyasındaki Director bloğundaki şifreyle eşleşmelidir. Bu kafa karıştırıcı görünebilir ama bir tablo yerine şöyle özetleyeyim:

  • Director -> Client bağlantısı: Director’daki Client bloğu şifresi = FD’deki Director bloğu şifresi
  • Director -> Storage bağlantısı: Director’daki Storage bloğu şifresi = SD’deki Director bloğu şifresi

Yapılandırma Doğrulama

Tüm yapılandırmalar tamamlandıktan sonra syntax hatalarını kontrol edin:

# Director yapılandırmasını test et
bacula-dir -t -c /etc/bacula/bacula-dir.conf

# Storage Daemon yapılandırmasını test et
bacula-sd -t -c /etc/bacula/bacula-sd.conf

# File Daemon yapılandırmasını test et
bacula-fd -t -c /etc/bacula/bacula-fd.conf

Hata yoksa servisleri sırayla yeniden başlatın:

systemctl restart bacula-sd
systemctl restart bacula-fd
systemctl restart bacula-director

# Tüm servislerin durumunu kontrol et
systemctl status bacula-sd bacula-fd bacula-director

bconsole ile Bağlantı Testi

Bacula Console (bconsole) ile Director’a bağlanıp SD ve FD bağlantılarını test edin:

bconsole

# bconsole isteminde
*status storage=File1
*status client=director-fd
*status client=client01-fd

status client=client01-fd komutunun çıktısında Daemon started ve istemci bilgilerini görüyorsanız bağlantı başarılıdır.

Bağlantı hatası alırsanız şunları kontrol edin:

# İstemciye erişim var mı?
telnet 192.168.1.20 9102

# Storage Daemon'a erişim var mı?
telnet 192.168.1.10 9103

# Log dosyalarına bak
tail -100 /var/log/bacula/bacula.log | grep -i error

Gerçek Dünya Senaryosu: Haftalık Full, Günlük Incremental Yedekleme

Şimdi pratik bir senaryo kuralım. Bir e-ticaret şirketinin web sunucusunu yedekliyorsunuz:

  • Pazar geceleri full yedek
  • Pazartesi-Cumartesi günlük incremental yedek
  • Yedekler 30 gün saklanacak

bacula-dir.conf dosyasına şu Job ve Schedule tanımları eklenir:

Schedule {
  Name = "WeeklyFull"
  Run = Full sun at 23:00
  Run = Incremental mon-sat at 02:00
}

FileSet {
  Name = "WebServerFiles"
  Include {
    Options {
      signature = MD5
      compression = GZIP
    }
    File = /var/www/html
    File = /etc/nginx
    File = /etc/ssl
  }
  Exclude {
    File = /var/www/html/cache
    File = /tmp
  }
}

Job {
  Name = "BackupClient01"
  Type = Backup
  Level = Incremental
  Client = client01-fd
  FileSet = "WebServerFiles"
  Schedule = "WeeklyFull"
  Storage = File1
  Messages = Standard
  Pool = DefaultPool
  Priority = 10
  Write Bootstrap = "/var/lib/bacula/client01.bsr"
}

Pool {
  Name = DefaultPool
  Pool Type = Backup
  Recycle = yes
  AutoPrune = yes
  Volume Retention = 30 days
  Maximum Volume Bytes = 50G
  Maximum Volumes = 100
  Label Format = "Vol-"
}

Bu yapılandırmayla Bacula, Pazar akşamı tam yedek alacak, diğer günler sadece değişen dosyaları yedekleyecek. 30 günden eski volumeler otomatik olarak geri dönüştürülecek.

Yaygın Sorunlar ve Çözümleri

Kurulum sürecinde karşılaşacağınız en sık problemlere bakalım:

Şifre uyumsuzluğu: En sık karşılaşılan sorundur. Logda Authorization key rejected hatası görürsünüz. Tüm şifreleri tekrar kontrol edin.

Permission denied on /backup/bacula: Storage Daemon bacula kullanıcısı olarak çalışır. Dizin izinlerini kontrol edin:

ls -la /backup/
chown -R bacula:bacula /backup/bacula
chmod 750 /backup/bacula

# SELinux varsa (CentOS/RHEL)
chcon -R -t bacula_store_t /backup/bacula

Volume label hatası: Yeni volume’lar için önce label atanması gerekir:

bconsole
*label storage=File1 volume=Vol-0001 pool=DefaultPool

FD istemciye ulaşılamıyor: Istemci tarafında DNS çözümlemesi veya firewall engeliyor olabilir. IP adresi ile test edin:

# Director sunucusundan
nc -zv 192.168.1.20 9102

Performans Optimizasyonu

Büyük veri yedeklerinde Storage Daemon performansı kritik önem taşır:

Device {
  Name = FastStorage
  Media Type = File1
  Archive Device = /backup/bacula
  LabelMedia = yes
  Random Access = Yes
  AutomaticMount = yes
  RemovableMedia = no
  AlwaysOpen = no
  Maximum Concurrent Jobs = 5
  # Buffer ayarları
  Minimum Block Size = 65536
  Maximum Block Size = 1048576
  # Spool ayarları performansı artırır
  Spool Directory = /tmp/bacula-spool
  Maximum Spool Size = 20gb
}

Director tarafında da paralel işleri sınırlamak önemlidir. Çok fazla paralel iş ağı ve diski yorar. Ortamınıza göre Maximum Concurrent Jobs değerini ayarlayın.

Sonuç

Bu yazıda Bacula’nın Storage Daemon ve File Daemon bileşenlerini kurdum, yapılandırdım ve test ettik. Dikkat edilmesi gereken kritik noktaları özetleyeyim:

  • Şifrelerin karşılıklı eşleşmesi şart, en küçük yazım hatası bağlantıyı keser
  • Dizin izinleri bacula kullanıcısı için doğru ayarlanmalı
  • Firewall kuralları her bileşen için ayrı düşünülmeli
  • Yapılandırma değişikliklerinden sonra her zaman -t ile syntax testi yapın
  • bconsole’u öğrenin, sorun gidermede hayat kurtarır

Bir sonraki adım olarak Bacula Web arayüzü olan Baculum‘u kurmayı veya veritabanı katalogu için PostgreSQL kullanmayı inceleyebilirsiniz. Kurumsal ortamlarda MySQL/MariaDB yerine PostgreSQL genellikle daha iyi performans verir.

Herhangi bir adımda takılırsanız /var/log/bacula/bacula.log dosyası genellikle sorunun tam olarak nerede olduğunu söyler. Bacula logları oldukça ayrıntılı ve anlaşılırdır, okumaktan çekinmeyin.

Bir yanıt yazın

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