Ubuntu 12.04 Precise Pangolin
Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.
Dieser Abschnitt behandelt die Konfiguration des Bacula-Servers, der regelmäßig Backups von verschiedenen Clients erstellen und beispielsweise unter dem Verzeichnis /mnt/backup abspeichern soll.
Der Server besteht aus dem Director- und dem Storage-Daemon:
/etc/bacula/bacula-dir.conf: Konfiguration des Director
/etc/bacula/bacula-sd.conf: Konfiguration des Storage-Daemon
Dabei kann der Storage-Daemon jederzeit auf einen zweiten Server ausgelagert werden, muss aber nicht.
Die Authentifikation zwischen den Modulen erfolgt mit Passwörtern. Diese generiert Ubuntu bei der Installation automatisch. Überall, wo in den Beispielen "<PASSWORD-...>" steht, sollte dann das konkrete Kennwort stehen. Einzusehen sind diese in "/etc/bacula/common_default_passwords". Für die File-Daemons müssen neue ausgedacht oder (besser) generiert werden.
Die Konfiguration des Directors ist am aufwendigsten, da dieser alle anderen Dienste steuert und somit wissen muss, wann und wie Backups gemacht werden. Untergliedert ist /etc/bacula/bacula-dir.conf in folgende Abschnitte:
"Director" - Definition des Dienst selber
"JobsDefs" - Eine Default Job-Definition für alle Jobs, die nicht bekannt sind
"Job" - Ein Backup-Auftrag, der von Bacula verarbeitet wird (enthält Verweise auf FileSet, Schedule und Client)
"FileSet" - Definiert, wie und welche Dateien gesichert werden sollen
"Schedule" - Wann und welche Art von Sicherung ausgeführt werden soll
"Client" - Informationen zum File-Daemon auf den jeweiligen Client
"Storage" - Informationen zum Storage-Daemon auf dem Server
"Catalog" - Datenbank-Benutzer und Passwort
"Messages" - Bestimmte Aktionen ausführen (z.B. Senden einer Email bei Fertigstellung des Backups)
"Pool" - Einteilungen von verschiedene Jobs in Gruppen
Die Konfiguration des Directors sollte selbsterklärend sein. Man kann "Maximum Concurrent Jobs" erhöhen, wenn man ...
Director { Name = server-1-dir DIRport = 9101 QueryFile = "/etc/bacula/scripts/query.sql" WorkingDirectory = "/var/lib/bacula" PidDirectory = "/var/run/bacula" Maximum Concurrent Jobs = 1 Password = "<PASSWORD-dir>" Messages = Daemon DirAddress = 127.0.0.1 }
In "JobsDefs" werden die Standard-Optionen für die Jobs festgelegt, die bei allen anderen Jobs identisch sind.
JobDefs { Name = "DefaultJob" Type = Backup Level = Incremental Messages = Standard Storage = server-1-storage Priority = 10 Maximum Concurrent Jobs = 10 }
In der Standard-Installation sind schon mehrere Jobs definiert: ein Beispiel-Job sowie welche, um den Katalog zu sichern und um Dateien im Problemfall wiederherzustellen. Man muss hier schon auf verschiedene Konfigurationen verweisen, die noch folgen (Client, Schedule, Storage, Pool, FileSet). Der erste wird folgendermaßen angepasst:
Job { Name = "server-1-job" Jobdefs = "DefaultJob" Client = server-1-fd Schedule = "server-schedule" FileSet = "server-files" Pool = "server-pool" Messages = Standard Write Bootstrap = "/var/lib/bacula/server-1.bsr" } Job { Name = "server-2-job" Jobdefs = "DefaultJob" Client = server-2-fd Schedule = "server-schedule" FileSet = "server-files" Pool = "server-pool" Messages = Standard Write Bootstrap = "/var/lib/bacula/server-2.bsr" } Job { Name = "Home" Jobdefs = "DefaultJob" Client = server-2-fd Schedule = home-schedule FileSet = "home-files" Pool = "server-pool" Messages = Standard Write Bootstrap = "/var/lib/bacula/home.bsr" }
Der BackupCatalog-Job bleibt unverändert, aber der Restore-Job muss noch angepasst werden, indem man den Server ("Client") und den Pfad ("Where") definiert, wo die Backups wiederhergestellt werden sollen:
Job { Name = "BackupCatalog" JobDefs = "DefaultJob" Level = Full FileSet="Catalog" Schedule = "WeeklyCycleAfterBackup" RunBeforeJob = "/etc/bacula/scripts/make_catalog_backup.pl MyCatalog" RunAfterJob = "/etc/bacula/scripts/delete_catalog_backup" Write Bootstrap = "/var/lib/bacula/%n.bsr" Priority = 11 Messages = Standard } #Restore Job { Name = "RestoreFiles" Type = Restore Client=server-1-fd FileSet="server-files" Storage = server-1-storage Pool = Default Messages = Standard Where = /tmp }
In FileSet kann man angeben, welche Dateien gesichert und welche Dateien in Ruhe gelassen werden sollen. In diesem Szenario werden drei verschiedene Arten von Sicherungen definiert, einmal von dem normalen Server, dem Home-Verzeichniss und den Katalog. Mit "signature = MD5" kann Bacula die Backups signieren sowie überprüfen und mit "compression=gzip" werden alle Backups komprimiert angelegt:
FileSet { Name = "server-files" Include { File = / File = /var Options { signature = MD5 compression = gzip } } Exclude { File = /proc File = /tmp File = /home File = /dev File = /sys File = /var/tmp File = /mnt File = /media File = /var/ftp File = /var/lib/amavis/virusmails File = /var/lib/mysql/bacula/ File = /var/cache/apt File = /var/account File = /var/cache/squid File = /var/tmp } } FileSet { Name = "home-files" Include { File = /home Options { signature = MD5 compression=gzip } } Exclude { } } FileSet { Name = "Catalog" Include { Options { signature = MD5 } File = /var/lib/bacula/bacula.sql } }
Hier definiert man, zu welchem Zeitpunkt ein Backup gemacht wird:
Schedule { Name = "server-schedule" Run = Level=Incremental Pool=server-pool mon-sat at 1:00 Run = Level=Differential Pool=server-pool 2nd-5th sun at 1:00 Run = Level=Full Pool=server-pool 1st sun at 1:00 } Schedule { Name = "home-schedule" Run = Level=Full Pool=server-pool jan apr jul oct 1st sun at 1:00 Run = Level=Incremental Pool=server-pool sun-sat at 1:00 } Schedule { Name = "WeeklyCycleAfterBackup" Run = Full sun-sat at 4:00 }
"WeeklyCycleAfterBackup" ist für das Sichern des Katalogs zuständig.
Dieser Abschnitt enthält Informationen über den File-Daemon auf den Clients. Für jeden der Zwei sollte man ein eigenes Kennwort sich ausdenken oder generieren lassen, welches nachher auch in die Konfiguration der Clients eingetragen werden muss. "Adress" steht für den jeweiligen Hostname oder IP-Adresse, "File Retention" sagt aus, wie lange eine Datei zurückgehalten werden soll bis es gelöscht, analog dazu "Job Retention", welches die Verfallszeit von Jobs angibt:
Client { Name = server-1-fd Address = localhost FDPort = 9102 Catalog = MyCatalog Password = "<PASSWORD-server-1>" File Retention = 30 days Job Retention = 6 months AutoPrune = yes Maximum Concurrent Jobs = 10 } Client { Name = server-2-fd Address = server-2 FDPort = 9102 Catalog = MyCatalog Password = "<PASSWORD-server-2>" File Retention = 30 days Job Retention = 6 months AutoPrune = yes Maximum Concurrent Jobs = 10 }
Hier gibt man dem Director die Informationen, die er braucht, um sich mit dem Storage-Daemon zu verbinden:
Storage { Name = server-1-storage Address = localhost SDPort = 9103 Password = "<PASSWORD-storage>" Device = FileStorage Media Type = File Maximum Concurrent Jobs = 10 }
Hier muss man nichts verändern, weil der Account und das Passwort beim Installieren schon festgelegt und eingerichtet wurden:
# Generic catalog service (i.e. MySQL) Catalog { Name = MyCatalog dbname = "bacula"; DB Address = ""; dbuser = "bacula"; dbpassword = "GEHEIM" }
Um Benachrichtigungen bei einem erfolgreichen/fehlgeschlagenden Backup kümmert sich dieser Abschnitt. Die Standardkonfiguration sieht vor, eine E-Mail an localhost
zu senden. Man kann das localhost
durch eine interne IP-Adresse ersetzten.
Hier kann man die Jobs nochmal unterteilen und die Größe festlegen, wann das Backup recycelt wird. Außerdem noch ein Label davor setzen, damit man die erstellen Backup-Dateien unterscheiden kann:
Pool { Name = Default Pool Type = Backup Recycle = yes AutoPrune = yes Volume Retention = 31 days Maximum Volume Bytes = 1g Maximum Volume Jobs = 50 Label Format = "catalog-" } Pool { Name = server-pool Pool Type = Backup Recycle = yes AutoPrune = yes Volume Retention = 31 days Maximum Volume Bytes = 2g Maximum Volume Jobs = 400 Maximum Volumes = 400 Label Format = "server-" } # Scratch pool definition Pool { Name = Scratch Pool Type = Backup }
In diesem Fall ist die Festplatte 900 GiB groß (2x 400 GiB für die Server + 1x 50 GiB für den Katalog). Der "Scratch Pool" ist der Standard-Pool, aus denen die anderen dupliziert werden (nicht verändern).
Hier der Einfachheit halber nochmal die ganze Konfiguration:
Director { Name = server-1-dir DIRport = 9101 QueryFile = "/etc/bacula/scripts/query.sql" WorkingDirectory = "/var/lib/bacula" PidDirectory = "/var/run/bacula" Maximum Concurrent Jobs = 1 Password = "<PASSWORD-dir>" Messages = Daemon DirAddress = 127.0.0.1 } JobDefs { Name = "DefaultJob" Type = Backup Level = Incremental Messages = Standard Storage = server-1-storage Priority = 10 Maximum Concurrent Jobs = 10 Pool = "Default" Client = "server-1-fd" } Job { Name = "server-1-job" Jobdefs = "DefaultJob" Client = server-1-fd Schedule = "server-schedule" FileSet = "server-files" Pool = "server-pool" Messages = Standard Write Bootstrap = "/var/lib/bacula/server-1.bsr" } Job { Name = "server-2-job" Jobdefs = "DefaultJob" Client = server-2-fd Schedule = "server-schedule" FileSet = "server-files" Pool = "server-pool" Messages = Standard Write Bootstrap = "/var/lib/bacula/server-2.bsr" } Job { Name = "Home" Jobdefs = "DefaultJob" Client = server-2-fd Schedule = home-schedule FileSet = "home-files" Pool = "server-pool" Messages = Standard Write Bootstrap = "/var/lib/bacula/home.bsr" } Job { Name = "BackupCatalog" JobDefs = "DefaultJob" Level = Full FileSet="Catalog" Schedule = "WeeklyCycleAfterBackup" RunBeforeJob = "/etc/bacula/scripts/make_catalog_backup.pl MyCatalog" RunAfterJob = "/etc/bacula/scripts/delete_catalog_backup" Write Bootstrap = "/var/lib/bacula/%n.bsr" Priority = 11 Messages = Standard } #Restore Job { Name = "RestoreFiles" Type = Restore Client=server-1-fd FileSet="server-files" Storage = server-1-storage Pool = Default Messages = Standard Where = /tmp } FileSet { Name = "server-files" Include { File = / File = /var Options { signature = MD5 compression = gzip } } Exclude { File = /proc File = /tmp File = /home File = /dev File = /sys File = /var/tmp File = /mnt File = /media File = /var/ftp File = /var/lib/amavis/virusmails File = /var/lib/mysql/bacula/ File = /var/cache/apt File = /var/account File = /var/cache/squid File = /var/tmp } } FileSet { Name = "home-files" Include { File = /home Options { signature = MD5 compression=gzip } } Exclude { } } FileSet { Name = "Catalog" Include { Options { signature = MD5 } File = /var/lib/bacula/bacula.sql } } Schedule { Name = "server-schedule" Run = Level=Incremental Pool=server-pool mon-sat at 1:00 Run = Level=Differential Pool=server-pool 2nd-5th sun at 1:00 Run = Level=Full Pool=server-pool 1st sun at 1:00 } Schedule { Name = "home-schedule" Run = Level=Full Pool=server-pool jan apr jul oct 1st sun at 1:00 Run = Level=Incremental Pool=server-pool sun-sat at 1:00 } Schedule { Name = "WeeklyCycleAfterBackup" Run = Full sun-sat at 4:00 } Client { Name = server-1-fd Address = localhost FDPort = 9102 Catalog = MyCatalog Password = "<PASSWORD-server-1>" File Retention = 30 days Job Retention = 6 months AutoPrune = yes Maximum Concurrent Jobs = 10 } Client { Name = server-2-fd Address = server-2 FDPort = 9102 Catalog = MyCatalog Password = "<PASSWORD-server-2>" File Retention = 30 days Job Retention = 6 months AutoPrune = yes Maximum Concurrent Jobs = 10 } Storage { Name = server-1-storageQuerverlinkung eingefügt Address = localhost SDPort = 9103 Password = "<PASSWORD-storage>" Device = FileStorage Media Type = File Maximum Concurrent Jobs = 10 } Pool { Name = Default Pool Type = Backup Recycle = yes AutoPrune = yes Volume Retention = 31 days Maximum Volume Bytes = 1g Maximum Volume Jobs = 50 Label Format = "catalog-" } Pool { Name = server-pool Pool Type = Backup Recycle = yes AutoPrune = yes Volume Retention = 31 days Maximum Volume Bytes = 2g Maximum Volume Jobs = 400 Maximum Volumes = 400 Label Format = "server-" } # Scratch pool definition Pool { Name = Scratch Pool Type = Backup } # Generic catalog service (i.e. MySQL) Catalog { Name = MyCatalog dbname = "bacula"; DB Address = ""; dbuser = "bacula"; dbpassword = "GEHEIM" } # Reasonable message delivery -- send most everything to email address # and to the console Messages { Name = Standard # # NOTE! If you send to two email or more email addresses, you will need # to replace the %r in the from field (-f part) with a single valid # email address in both the mailcommand and the operatorcommand. # What this does is, it sets the email address that emails would display # in the FROM field, which is by default the same email as they're being # sent to. However, if you send email to more than one address, then # you'll have to set the FROM address manually, to a single address. # for example, a 'no-reply@mydomain.com', is better since that tends to # tell (most) people that its coming from an automated source. # mailcommand = "/usr/lib/bacula/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula: %t %e of %c %l\" %r" operatorcommand = "/usr/lib/bacula/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula: Intervention needed for %j\" %r" mail = root@localhost = all, !skipped operator = root@localhost = mount console = all, !skipped, !saved # # WARNING! the following will create a file that you must cycle from # time to time as it will grow indefinitely. However, it will # also keep all your messages if they scroll off the console. # append = "/var/lib/bacula/log" = all, !skipped catalog = all } # # Message delivery for daemon messages (no job). Messages { Name = Daemon mailcommand = "/usr/lib/bacula/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula daemon message\" %r" mail = root@localhost = all, !skipped console = all, !skipped, !saved append = "/var/lib/bacula/log" = all, !skipped } # # Restricted console used by tray-monitor to get the status of the director # Console { Name = ubuntu-server-mon Password = "<PASSWORD-mon>" CommandACL = status, .status }
Nach Änderungen an der Konfiguration muss der Director neu gestartet werden:
sudo /etc/init.d/bacula-director restart
Die Konfiguration des Storage-Daemon verläuft ähnlich. Erstmal definiert man selbigen:
Storage { Name = server-1-sd SDPort = 9103 WorkingDirectory = "/var/lib/bacula" Pid Directory = "/var/run/bacula" Maximum Concurrent Jobs = 50 }
Nachdem man den Storage-Daemon definiert hat, muss man noch regeln, welcher Director-Daemon sich mit ihm verbinden darf. Dabei muss natürlich das Passwort mit denjenigen im Director übereinstimmen:
Director { Name = server-1-dir Password = "<PASSWORD-storage>" }
Unter dem Eintrag "Device" kann man definieren, unter welchem Verzeichnis man Backups sichern will:
Device { Name = FileStorage Media Type = File Archive Device = /mnt/backup LabelMedia = yes; Random Access = Yes; AutomaticMount = yes; RemovableMedia = no; AlwaysOpen = no; }
Sollte wieder selbsterklärend sein. Um die Datensicherheit nochmal zu steigern, könnten die in /mnt/backup eingehängten "Datenträger" ein Software-RAID besitzen.
Damit alle Fehlermeldungen vom Storage auch am Director einsehbar sind, werden hier die Logs zurückgeschickt:
Messages { Name = Standard director = server-1-dir = all }
Nach Änderungen an der Konfiguration muss der Storage-Daemon neu gestartet werden:
sudo /etc/init.d/bacula-sd restart
Nachdem man den Director und Storage funktionstüchtig eingerichtet hat, müssen noch die benötigten Volumina erstellt werden, in denen Backups gesichert werden. Dazu muss ein Shell-Skript (z.B. create-volumes.sh) mit folgendem Inhalt erstellt werden:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #!/bin/bash echo -e "\t(1) Print Only\n\t(2) Execute" read -p 'Choice: ' choice echo -e "\tNumber:" read num if [ $choice -eq 2 ]; then pipe=bconsole else pipe=cat fi for i in $(seq 2 $num) do cat <<-_ label server-$(printf "%04d" $i) 3 _ done | $pipe |
Nun macht man das Skript ausführbar und startet es mit Root-Rechten:
chmod +x ./create-volumes.sh sudo ./create-volumes.sh
Nun hat man die Möglichkeit, zwischen "Print only" und "Execute" zu wählen. Bei "Print only" wird angezeigt, welche Befehle der bconsole übergeben werden, bei "Execute" werden diese ausgeführt. Außerdem ist die Anzahl der Volumina, die man unter dem Server-Pool angegeben habt, wichtig.
Diese Revision wurde am 18. Mai 2015 10:23 von frustschieber erstellt.