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.
2004 – 2017 ubuntuusers.de • Einige Rechte vorbehalten