Bacula - howto AUTOR: Leszek 'crony' Miś MAIL: leszek.mis@gmail.com WWW: e-guardian.org I. Wstęp II. Instalacja i konfiguracja III. Administracja I. Wstęp Bacula to opensource'owy system do backupowania, odtwarzania i zarządzania danymi, nadający się w pełni do wdrożenia dla infrastruktury produkcyjnej. Ściśle połączony projekt z zewnętrzną bazą danych (PostregSQL, MySQL) pozwala na dużą różnorodność konfiguracyjną. Możliwe jest zapisywanie backupów zarówno na urządzenia taśmowe ( pojedyńcze drive'y jak i biblioteki ) oraz bezpośrednio na dyski. Bacula składa się z 3 podstawowych demonów: * bacula-dir : port 9101 * bacula-fd : port 9102 * bacula-sd : port 9103 Bacula wykorzystuje komunikację TCP obustronną. Pakiet SYN przy inicjalicji połączenia wysyłany jest od "bacula-dir [port:9101]" do "bacula-fd [port:9102]" (przy statusie baculi), ale i w drugą stronę również przy running job. Można to zaobserwować za pomocą narzędzia tcpdump. KOMUNIKACJA: * Console -> DIR: 9101 * DIR -> SD: 9103 * DIR -> FD: 9102 * FD -> SD: 9103 W sutuacji gdy posiadamy firewalla należy go odpowiednio zmodyfikować (na przykładzie iptables ): * na serwerze: INPUT -p tcp --dport 9101:9103 -j ACCEPT; OUTPUT -p tcp --dport 9102:9103 -j ACCEPT * na klientach: INPUT -p tcp --dport 9102 -j ACCEPT; OUTPUT -p tcp --dport 9103 - ACCEPT Jeżeli występowałyby timeouty związane z firewallami, istnieje coś takiego jak heartbeat interval... II. Instalacja i konfiguracja
a). kompilacja Baculi: Ściągamy najnowszą wersję oprogramowania ( na dzisiaj jest to wersja: 2.2.7 ) Rozpakowujemy archiwum i wydajemy następujące polecenie:./configure --prefix=/usr/local/bacula/ -- mandir=/usr/local/bacula/man \ --sysconfdir=/usr/local/bacula/etc -- infodir=/usr/share/info \ --with-subsys-dir=/var/lock/subsys --withopenssl=/usr/include/openssl/ \ --with-working-dir=/var/lib/bacula -- with-scriptdir=/usr/local/bacula/libexec \ --with-dir-user=bacula -- with-dir-group=bacula --with-sd-user=root \ --with-sd-group=bacula -- with-fd-user=root --with-fd-group=bacula \ --enable-smartalloc -- with-mysql-dir=/usr/include/mysql/ --with-readline=/usr \ --withpython --with-dump-email=dumps@crony --with-job-email=jobs@crony \ -- with-pid-dir=/var/run/ --enable-wx-console --enable-gnome \ --withincluded-gettext --with-gnu-ld --disable-rpath --disable-nls --withmysql make && make install Po poprawnej kompilacji stwórzmy symlink /etc/bacula do katalogu /usr/local/etc/bacula aby nie było problemu ze znalezieniem plików konfiguracyjnych. b). baza danych Baculi W naszym przypadku skompilowaliśmy Baculę z supportem dla MySQL-a. Przechodzimy do katalogu /usr/local/bacula/libexec/. Tutaj znajdują się skrypty, za pomocą których będziemy mogli stworzyć bazę, tabele i nadać odpowiednie uprawnienia. Aby stworzyć bazę należy wyedytować następujace skrypty i dodać do nich parametr -p, za pomocą którego zostaniemy zapytani o hasło administratora. - create_mysql_database - make_mysql_tables - grant_mysql_privileges head -n 8 make_mysql_tables if $bindir/mysql $* -p -f <<END-OF-DATA USE bacula; To samo wykonujemy dla reszty skryptów. Za pomocą skryptu drop_bacula_tables można w szybki sposób wyczyścić cały katalog baculi. W sytuacji gdy będziemy chcieli zupgrade'ować Baculę należy uruchomić skrypt: /usr/local/bacula/libexec/update_mysql_tables c.) Konfiguracja Konfiguracja opiera się o zdefiniowanie poszczególnych sekcji: - /etc/bacula/bacula-dir.conf:
Director { Name = crony-dir # nazwa directora. Description = "zarządzający" DIRport = 9101 # port na którym działa director DirAddress = crony.e-guardian.net # adres directora, QueryFile = "/usr/local/bacula/libexec/query.sql" # zapytania SQL WorkingDirectory = "/var/lib/bacula/" PidDirectory = "/var/run/bacula-dir/" Maximum Concurrent Jobs = 100 # ilość konkurencyjnych jobów Password = "haaaaslooo" Messages = Daemon # poziom logowania TLS Enable = yes # szyfrowanie połączenia # wymaganie TLS-a Ogólna definicja dla jobów: JobDefs { Name = "definicja1" # nazwa Type = Backup # typ: backup, restore, verify, archive Level = Full # czy ma backupowac wszystko, czy Incremental czy Differential FileSet = "Full Set" # zbiór plików, katalogów które będą backupowane Schedule = "dobowy" # nazwa schedulera, zdefiniowany w innej sekcji Storage = Autochanger # na jaki storage bacula ma zapisywać dane Messages = Standard # poziom logowania Pool = dzienny # pool Priority = 10 # priorytet job { Name = "bastard-full" # nazwa joba Client = "bastard-fd" # klient, w tym przypadku bastard JobDefs = "definicja1" # przypisanie definicji, patrz sekcja wyzej FileSet="Full Set" # zbiór plików, katalogów które będą backupowane SpoolData = yes # spooling danych czyli najpierw zapisujemy dane na dysk, następnie na tasiemki Write Bootstrap = "/var/lib/bacula/bastard.bsr" # pliczek bardzo pomocny przy rozwaleniu się bazy. Definicja joba-restore'a do odzyskiwania danych: Job { Name = "RestoreFiles" Type = Restore # typ odzyskiwania. Client=bastard-fd FileSet="Full Set" Pool = dzienny Storage = Autochanger Messages = Standard Where = /RESTORES
Definicja Filesetu, czyli zasobów, które będą backupowane: FileSet { Name = "Full Set" # nazwa filesetu Include { # zawierać powinna: Options { signature = MD5 # sygnatura MD5 File = /home/ # wszystko stad bedzie backupowane Definicja schedula: Schedule { Name = "dobowy" # nazwa Run = Full mon-fri at 2:00 # kiedy mają się uruchamiać konkretne joby. Schedule { Name = "weekend" Run = Full sat-sun at 3:00 Definicja klientów: Client { Name = bastard-fd # nazwa Address = bastard.e-guardian.net # adres klienta, również ważny przy certyfikatach FDPort = 9102 # port na którym nasłuchuje file daemon Catalog = Catalog Password = "haaaasloooo" TLS Enable = yes # szyfrowanko TLS CA Certificate File = /etc/bacula/certs/ca-cacert.pem TLS Certificate = /etc/bacula/certs/bastard-cert.pem TLS Key = /etc/bacula/certs/bastard-key.pem Definicja storagu: Storage { Name = Autochanger # nazwa Device = Autochanger # nazwa urządzenia zdefiniowana w bacula-sd.conf Address = crony.e-guardian.net # adres SDPort = 9103 # port na którym nasłuchuje SD Password = "haaaaslooo" Media Type = LTO-2 # typ nosnika Autochanger = yes # wykorzystanie autochangera. TLS Enable = yes # szyfrowanie TLS CA Certificate File = /etc/bacula/certs/ca-cacert.pem TLS Certificate = /etc/bacula/certs/bastard-cert.pem TLS Key = /etc/bacula/certs/bastard-key.pem Definicja katalogu - user i haslo do bazy: Catalog {
Name = Catalog dbname = bacula; user = bacula; password = "haaasloooo2" DB Socket = /var/run/mysqld/mysqld.sock # socket do bazy DB Address = localhost # adres bazy danych Definicja poziomu logowania i wysylania infa na maila: Messages { Name = Daemon # nazwa. mailcommand = "/usr/sbin/bsmtp -h localhost -f \"\(Bacula\) %r\" -s \"Bacula daemon message\" %r" # mechanizm wysyłania powiadomień mail = jobs@crony = all,!skipped # do kogo console = all,!skipped,!saved # logowanie na konsolę append = "/var/lib/bacula/log" = all,!skipped # logowanie do pliku Definicja pooli: Pool { Name = dzienny # nazwa poola Pool Type = Backup # typ poola Recycle = no # Recycle Oldest Volume = yes AutoPrune = no # kasuje przedawnione joby i tym sposobem czyści Volumen - /etc/bacula/bacula-sd.conf: Storage { Name = crony-sd # nazwa SD SDPort = 9103 # port WorkingDirectory = "/var/lib/bacula" Pid Directory = "/var/run/" Maximum Concurrent Jobs = 20 TLS Enable = yes TLS Verify Peer = no Sekcja definiująca directora: Director { Name = crony-dir Password = "hasloooo TLS Enable = yes TLS Verify Peer = no
Definicja autochangera: Autochanger { Name = Autochanger # nazwa Device = Drive-0 # tape-drive 1 Device = Drive-1 # tape-drive 2 Device = Drive-2 # tape-drive 3 Changer Command = "/usr/local/bacula/libexec/mtx-changer %c %o %S %a %d" #komenda uruchamiana podczas migracji tasiemek do odpowiednich slotów i urządzeń Changer Device = /dev/sg1 # urządzenie autochangera Definicja kolejnych tape-drive'ow : Device { Name = Drive-0 # nazwa tape-drive'a z sekcji autochangera Drive Index = 0 # pierwsze urządzenie Media Type = LTO-2 # typ tasiemek Archive Device = /dev/nst0 # urządzenie tape-drive'a Device Type = Tape # typ nośnika AutomaticMount = yes; # kiedy urządzenie otwarte, czytaj je. AlwaysOpen = no; Removable Media = yes # RandomAccess = no # dostęp do urządzenia losowy AutoChanger = yes # wykorzystanie autochangera Changer Device = /dev/sg1 Changer Command = "/usr/local/bacula/libexec/mtx-changer %c %o %S %a %d" # Alert Command = "sh -c 'tapeinfo -f %c grep TapeAlert cat'" informacja o błędzie Spool Directory = /stagging2 # katalog na spooling AutoSelect = yes # wybieranie automatyczne - /etc/bacula/bacula-fd.conf Director { Name = crony-dir Password = "hasloooo TLS Enable = yes TLS Verify Peer = no Definicja FD: FileDaemon { Name = bastard-fd # nazwa FDport = 9102 WorkingDirectory = /var/lib/bacula Pid Directory = /var/run/ Maximum Concurrent Jobs = 20 SD Connect Timeout = 1 min # gdy FD nie będzie potrafił się połączyć do SD, # timeout wynosi 1 minutę
III. Administracja Autorzy Baculi stworzyli cli za pomocą którego możemy w prosty sposób administrować mechanizmem. CLI nazywa się bconcole. bconcole -c /etc/bacula/bconsole.conf Przydatne komendy: * status all, director, storage, client - ukaże status poszczególnych elementów baculi * reload -> przeładowanie configa directora bez kasowania uruchomionych jobow. * add -> dodaje media do pooli * umount -> odmontowuje załadowaną tasiemkę * label -> labeling * restore -> odzyskiwanie danych, nawet pojedyńczego pliku. * run -> natychmiastowe uruchomienie wybranego joba. Być może komuś przydadzą się te informację...zakręcone, ale troche poświęconego czasu i restore/backup jak znalazł :) Istnieje również panel www Bacula-web, za pomocą którego możemy na bieżąco sprawdzać jak się ma nasza Bacula:>