Zálohování s Baculou: otevřený systém pro komplexní scénáře

19. 12. 2024
Doba čtení: 7 minut

Sdílet

Autor: Depositphotos
Zálohování je klíčovou činností při správě počítačů. Bacula je otevřený zálohovací systém, který zdarma nabízí flexibilní řešení pro komplexní scénáře, od osobního použití po enterprise konfigurace.

Zálohujeme Linux

Zálohování je jednou z nejdůležitějších činností, kterou je třeba v rámci správy počítačů provádět. Na Linuxu máte k dispozici základní nástroje, jako například tar nebo dump, ale ty jsou velmi jednoduché a dobře poslouží spíše pro jednotlivé stroje nebo málo složité scénáře. Pokud však máte v plánu zálohovat více strojů nebo realizovat komplexnější zálohovací řešení, tato řešení vám už stačit nebudou.

Řešení existuje spousta. Na jedné straně jsou tu robustní komerční nástroje, které však bývají drahé, na druhé straně existuje Bacula – otevřený zálohovací systém, který lze použít zdarma i pro komplexní scénáře. Bacula nabízí varianty od osobního použití až po enterprise konfiguraci a k dispozici je i placená verze nabízející další funkce. Je to takové „něco mezi“ – flexibilní řešení, které vám umožní hodně, aniž byste museli investovat obrovské částky.

Na druhou stranu, tím, že Bacula nabízí takovou úroveň detailní konfigurace, může být její nastavení zpočátku obtížné, především pokud nemáte předchozí zkušenosti. Abych vám usnadnil orientaci a úspěšný start, připravil jsem jednoduchý tutoriál. Ten vám umožní nastavit zálohování například několika strojů během jedné hodiny. Například mini server postavený na jednodeskovém počítači Raspberry Pi.

Bacula umí pracovat jak s Windows, tak s Linuxem, nicméně u starších verzí pro Raspbian budete pro Windows potřebovat také staršího klienta – jinak vás čeká spousta podivných chybových hlášek. U linuxových klientů jsem na tento problém nenarazil.

Architektura Baculy – Diagram

Bacula je postavena jako modulární systém složený z několika částí, které spolu komunikují a plní specifické role. Tady je stručný popis základních komponent:

  • Director (bacula-dir)
    Hlavní mozek celého systému, který řídí všechny operace. Určuje, co se má kdy zálohovat, kam se mají zálohované soubory ukládat a jak dlouho se mají uchovávat. Director běží jako pozadí na serveru a komunikuje s ostatními částmi systému.
  • Client (bacula-fd, File Daemon)
    Tento modul je nainstalovaný na každém stroji, který má být zálohován. File Daemon přebírá úlohu přenosu dat z klienta na storage určené direktorem. Posílá pouze to, co bylo explicitně nakonfigurováno k zálohování.
  • Storage Daemon (bacula-sd)
    Tato služba ukládá samotná zálohovaná data. Storage démon může běžet na témže zařízení jako director, nebo na jiném samostatném serveru, například na dedikovaném úložišti. Je třeba pamatovat na to, že úložiště musí být dostupné pro všechny klienty.
  • Catalog (databáze)
    Zálohovací systém kromě samotných dat uchovává katalog. Ten zaznamenává, co bylo kdy zálohováno a kde zálohy najdete. Bacula podporuje různé databáze (např. MySQL nebo PostgreSQL), a právě sem ukládá svůj katalog.
  • bconsole (klientská aplikace)
    Ovládací komponenta Baculy. Pomocí ní komunikujete s directory, spouštíte zálohy, sledujete stav systému a spravujete celý proces.

Instalace

Ukázku instalace budu provádět na distribuci Ubuntu, postup je ale téměř stejný i na Debianu a dalších derivátech. Pro databázi jsem zvolil MySQL, protože je rozšířenější než doporučovaná PostgreSQL, i když funkčnost je stejná.

apt install bacula bacula-director-mysql

Bacula se skládá z několika částí, Director vše řídí, plánuje zálohování, určuje, co se bude zálohovat, a kam se to bude zálohovat. Director je běžná služba, která běží na pozadí. Předem upozorňuji, že moje konfigurace nebude definitivní a nějaké ladění nakonec budete potřebovat.

První soubor, který upravíte bude bacula-dir.conf. V tomto souboru nejdříve zakomentujete autochanger:

# Autochanger {
  #  Name = File1

Poté přidáte storage:

Storage {
  Name = File1
  Address = adresa.serveru # Address of the Storage Daemon (SD) (can be FQDN or IP)
  SDPort = 9103       # Port of the SD, default is 9103
  Password = "SDPASSWORD" # Password to connect to the SD
  Device = FileStorage     # Must match Device in bacula-sd.conf
  Media Type = File        # Media type must be defined in bacula-sd.conf
}

Storage je samostatná služba na serveru pod jménem bacula-sd (Bacula Storage Daemon). Jedná se o komplexní řešení, takže vám storage démon může klidně běžet na jiném serveru než director. Zde ovšem pozor, storage démon musí být dostupný ze serverů či koncových stanic, které zálohujete. Proto adresa serveru, kterou konfigurujete, by měla být v místní síti, nikdy ne localhost.

Další věc, kterou potřebujete nakonfigurovat je pool zálohování:

# Default pool definition
  Pool {
    Name = Default
    Pool Type = Backup
    Recycle = yes                       # Bacula can automatically recycle Volumes
    AutoPrune = yes                     # Prune expired volumes
    Volume Retention = 90 days         # one year
    Maximum Volume Bytes = 30G          # Limit Volume size to something reasonable
    Maximum Volumes = 10               # Limit number of Volumes in Pool
    Label Format = "VolDefault-"               # Auto label
  }

Konfigurace toho, co zálohovat:

Job {
  Name = "BackupRPI"
  JobDefs = "RPIJob"
  Storage = "File1"
  Messages = "Standard"
  Pool = "Default"
}

JobDefs {
  Name = "RPIJob"
  Type = Backup
  FileSet = "RPI"
  Schedule = "WeeklyCycle"
  Client = "rpi-fd"
  Messages = Standard
}

Fileset {
  Name = "RPI"
  Include {
    Options {
      signature = MD5
    }
    File = "/etc"
  }
}

Pokračujeme přes konfiguraci katalogu a u toho se zastavíme. To, co ukládáme na úložiště musí být někde zaznamenáno – někde potřebujeme přehled toho, co jsme zálohovali, kdy a kam. Na to nám slouží katalog, který uchováváme v MySQL.

Asi nemusím vysvětlovat, že je také fajn tento katalog občas zálohovat, ale tím se nyní nebudeme zabývat. Věřím tomu, že již máte funkční server MySQL nebo MariaDB, který pravidelně dumpujete třeba na disk.

Konfigurace MySQL

Catalog {
  Name = MyCatalog
  dbname = "bacula"; DB Address = "server.home"; dbuser = "bacula"; dbpassword = "DBPASS"
}

Nejdříve si databázi a uživatele vytvoříme, zde jsou SQL příkazy. Ovšem pozor, jako host používám procento, a procento znamená cokoliv, jen ne localhost. Pokud provozujete databázi na stejném serveru a budete k ní přistupovat přes localhost, místo procenta použijte localhost.

Vytvoření databáze

CREATE DATABASE `bacula`;
CREATE USER 'bacula'@'%' IDENTIFIED BY 'DBPASS';
GRANT ALL PRIVILEGES ON `bacula`.* TO 'bacula'@'%';
FLUSH PRIVILEGES;

Poté do databáze naimportujeme tabulky. K tomuto skriptu jsem nikde nenašel dokumentaci na použití, ale jednoduchým nahlédnutím dovnitř jsem pochopil, jak jej použít.

Importování tabulek

db_name=bacula /usr/share/bacula-director/make_mysql_tables -uroot -pDB_ROOT_PASS -hDB_SERVER_ADDRESS

Ještě si nakonfigurujeme storage démona, používám jednoduché zálohy na pevný disk, nic složitého, i když Bacula umí ovládat i páskovou jednotku a enterprise (rozuměj placená) verze ukládání třeba i do cloudu. Zde znovu pozor, nastavte storage démona ať poslouchá na interface, ke kterému se dokážou připojit i klienti.

V souboru bacula-sd.conf:

Device {
  Name = FileStorage
  Media Type = File
  Archive Device = /mnt/linux-share/bacula
  LabelMedia = yes;                  # lets Bacula label unlabelled media
  Random Access = Yes;
  AutomaticMount = yes;              # when device opened, read it
  RemovableMedia = no;
  AlwaysOpen = no;
}

Storage {                             # definition of myself
  Name = server-sd
  SDPort = 9103                  # Director's port
  WorkingDirectory = "/var/lib/bacula"
  Pid Directory = "/run/bacula"
  Plugin Directory = "/usr/lib/bacula"
  Maximum Concurrent Jobs = 20
  SDAddress = 0.0.0.0
}

Konfigurace klienta

Nakonec se budeme zabývat konfigurací klienta. Na klienta nainstalujeme Baculu, a upravíme soubor  bacula-fd.conf.

Director {
  Name = JMENO_DIRECTOR
  Password = "HESLO_DIRECTOR"
}

Jméno a heslo musí souhlasit s direktorem. Na serveru v souboru  bacula-dir.conf :

Client {
  Name = client-fd
  Address = localhost
  FDPort = 9102
  Catalog = MyCatalog
  Password = "HESLO_DIRECTOR"          # password for FileDaemon
  File Retention = 60 days            # 60 days
  Job Retention = 6 months            # six months
  AutoPrune = yes                     # Prune expired Jobs/Files
}

Zde pozor, ono to není moc jasné a dost mi to zamotalo hlavu. Heslo k directoru je napsané v directoru pod heslem ke klientovi (není to hlavní heslo directoru), a toto musí souhlasit! Zde je třeba být opravdu na pozoru, aby hesla souhlasila, jméno klienta a direktoru také.

V případě třeba hodně staré verze na Raspberry Pi je třeba použít i odpovídající starší verzi klienta na Windows, jinak se nehnete. Mně se pro Windows osvědčila verze bacula-win64–9.4.3.

Start služby

Poté budete pokračovat spouštěním služeb, samozřejmě že se vám director asi napoprvé nepodaří nastartovat. Podíváte se přes journalctl do logu a opravíte konfiguraci, tak aby fungovala.

systemctl enable --now bacula-director.service
systemctl restart bacula-sd
journalctl -u bacula-director

Po nastartování directoru spustíte ovládací aplikaci bconsole (pod rootem), a nastartujete přes příkaz run zálohování a podíváte se do messages, jestli proběhlo správně. To je vlastně všechno.

help
* run           Run a job
* messages      Display pending messages
* status        Report status
…

Tip: Grafana

Ještě přidám takový malý tip: ke Grafaně se dá jako zdroj připojit databáze MySQL a je možné najít dashboardy na Baculu nebo si můžete vytvořit vlastní.

Shrnutí

Co se mi na Bacule líbí, že jakmile se s ní jednou naučíte, je velmi rychlé ji zprovoznit. Přešel jsem na ni, protože mi nevyhovovala levná komerční řešení a pořádná enterprise řešení zase stojí tisíce dolarů. Bacula je něco mezi tím, hodně muziky za málo peněz.

(Autorem obrázků je Martin Koníček.)

Autor článku

V oboru informačních technologií se pohybuje přes 20 let. V současné době pracuje jako kontraktor pro DevOps.