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.)


