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 yes olmalıdır
  • Random Access: Disk tabanlı depolama için her zaman Yes olmalıdır, bant sürücüler için No
  • 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 yes olmalıdır, açık bırakmak performansı artırır
  • AutoChanger: Bant kütüphanesi kullanıyorsanız yes yapı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 = 1048576 ayarlayarak büyük bloklar kullanın
  • Spool Data: Director’daki Job tanımına Spool Data = yes ve Spool Size = 2GB ekleyerek önce geçici alana yazıp sonra aktarın, bu ağ sorunlarından kaynaklanan yeniden başlatmaları önler
  • Concurrent Jobs: Maximum Concurrent Jobs değ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.

Bir yanıt yazın

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