ubuntuusers.de

Server-Konfiguration

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Artikel für fortgeschrittene Anwender

Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

./bacula_logo.png 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.

Hinweis:

Die nachfolgende Konfiguration bezieht sich auf Bacula Version 9.0.6 (selbst kompiliert unter Ubuntu Xenial). Bionic hat diese Version in den Paketquellen.

Der Server besteht aus dem Director- und dem Storage-Daemon:

Dabei kann der Storage-Daemon jederzeit auf einen zweiten Server ausgelagert werden, muss aber nicht.

Hinweis:

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.

/etc/bacula/bacula-dir.conf

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

  • "JobDefs" - Eine Default-Job-Definition von der Jobs abgeleitet werden können

  • "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 verschiedenen Storage-Volumes (Tapes, Dateien) in Gruppen

Director

Die Konfiguration des Directors sollte selbsterklärend sein.

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

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
}

Jobs

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. Es wird hier schon auf verschiedene Konfigurationen verwiesen, 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
# The FileSet and Pool directives are not used by Restore Jobs
# but must not be removed
  Pool = Default
  Messages = Standard
  Where = /tmp
}

FileSet

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
  }
}

Schedule

Hier definiert man, zu welchem Zeitpunkt ein Backup gemacht wird:

Schedule {
  Name = "server-schedule"
    Run = Incremental Pool=server-pool mon-sat at 1:00
    Run = Differential Pool=server-pool 2nd-5th sun at 1:00
    Run = Full Pool=server-pool 1st sun at 1:00
}
Schedule {
  Name = "home-schedule"
   Run = Full Pool=server-pool jan apr jul oct 1st sun at 1:00
   Run = 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.

Client

Dieser Abschnitt enthält Informationen über den File-Daemon auf den Clients. Für jeden der Zwei sollte man sich ein eigenes Kennwort ausdenken oder generieren lassen, welches nachher auch in die Konfiguration der Clients eingetragen werden muss. "Address" steht für den jeweiligen Hostnamen oder IP-Adresse, "File Retention" sagt aus, wie lange eine Datei zurückgehalten werden soll bis sie aus dem Catalog (Datenbank) gelöscht wird, 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
}

Storage

Hier gibt man dem Director die Informationen, die er braucht, um sich mit dem Storage-Daemon zu verbinden:

Hinweis:

In älteren Bacula-Versionen heißt dieser Abschnitt Storage, in neueren wird Autochanger verwendet, der dann auf den Eintrag im Storage-Daemon zeigt.

Autochanger {
  Name = server-1-storage
# Do not use "localhost" here
  Address = localhost                # N.B. Use a fully qualified name here
  SDPort = 9103
  Password = "<PASSWORD-storage>"
  Device = FileStorage
  Media Type = File
  Maximum Concurrent Jobs = 10
  Autochanger = server-1-storage     # point to ourself
}

Catalog

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 = ""
  user = bacula
  password = "GEHEIM"
  DB Port == 3306
}

Messages

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.

Pools

Hier kann man die Volumes (Tapes, Dateien) 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 dem leere Volumes entnommen werden können wenn diese in anderen Pools fehlen (nicht verändern).

Monitor

Console {
  Name = server-1-mon
  Password = "<PASSWORD-mon>"
  CommandACL = status, .status
}

Neustarten

Nach Änderungen an der Konfiguration muss der Director neu gestartet werden:

sudo systemctl restart bacula-director 

/etc/bacula/bacula-sd.conf

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
}

Director

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>"
}

Autochanger

Autochanger {
  Name = FileStorage
  Device = File1
  Changer Command = ""
  Changer Device = /dev/null
}

Device

Unter dem Eintrag "Device" kann man definieren, unter welchem Verzeichnis man Backups sichern will:

Device {
  Name = FileStorage
  Media Type = File1
  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.

Messages

Damit alle Fehlermeldungen vom Storage auch am Director einsehbar sind, werden hier die Logs zurückgeschickt:

Messages {
  Name = Standard
  director = server-1-dir = all
}

Neustarten

Nach Änderungen an der Konfiguration muss der Storage-Daemon neu gestartet werden:

sudo systemctl restart bacula-sd 

Erstellen der Volumina

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 hat, wichtig.

Diese Revision wurde am 1. November 2018 09:24 von Into_the_Pit erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Server, Netzwerk, Datensicherung