Subsections


Die Bootstrap-Datei

Die Informationen in diesem Kapitel sollen Ihnen helfen, entweder eigene Bootstrap-Dateien zu erstellen, oder die von Bacula erzeugten zu editieren. Da die Bootstrap-Datei automatisch beim ausführen des restore Console-Kommandos, oder wenn Sie Write Bootstrap in den Job-Einträgen der Director-Dienst-Konfiguration angeben, erzeugt wird, brauchen Sie das genaue Format eigentlich nicht wissen.

Die Bootstrap-Datei enthält Informationen im ASCII-Format, die präzise angeben, welche Dateien wiederhergestellt werden sollen, auf welchem Volume sie liegen und wo auf dem Volume. Es ist ein relativ kompaktes Format diese Informationen anzugeben, aber es ist lesbar für Menschen und kann mit einem Texteditor geändert werden.

Bootstrap-Datei Format

Das generelle Format der Bootstrap-Datei ist:

<Schlüsselwort> = <Wert>

Wobei jedes Schlüsselwort und sein Wert angeben, welche Dateien wiederhergestellt werden. Genauer gesagt, das Schlüsselwort und sein Wert dienen dazu, zu limitieren welche Dateien wiederhergestellt werden, sie verhalten sich wie ein Filter. Das Fehlen eines Schlüsselwort bedeutet, dass alle Dateien angenommen werden.

In der Bootstrap-Datei werden Leerzeilen und Zeilen beginnent mit # ignoriert.

Es existieren Schlüsselwörter, die die Filterung nach Volume, Client, Job, Fileindex, Session ID, Session Time usw. erlauben.

Je mehr Schlüsselwörter Sie angeben, desto genauer ist die Auswahl der Dateien, die wiederhergestellt werden. Alle Schlüsselwörter werden über UND verknüpft.

Ein Beispiel:

Volume = Test-001
VolSessionId = 1
VolSessionTime = 108927638

veranlasst den Storage-Dienst (oder das bextract Programm), nur die Dateien wiederherzustellen, die auf dem Volume Test-001 vorhanden sind UND eine VolumeSessionID mit 1 haben UND deren VolumeSessionTime gleich 108927638 ist.

Hier ist eine Liste aller erlaubten Schlüsselwörter in der Reihenfolge in der sie auf die auf dem Volume befindlichen Daten angewendet werden:

Volume
Dieser Wert gibt an, auf welches Volume die folgenden Schlüsselwörter angewendet werden sollen. Falls in der Bootstrap-Datei ein zweites Volume angegeben wird, beziehen sich die darauf folgenden Schlüsselwörter auf dieses Volume. Wenn der Name des Volumes Leerzeichen enthält, muss er in Anführungszeichen gesetzt werden. Mindestens ein Volume muss angegeben werden.

Count
Dieser Wert ist die Gesamtanzahl der Dateien, die von dem Volume gelesen werden sollen. Daran erkennt der Storage-Dienst, wann er das Lesen beenden soll. Dieser Wert ist optional.

VolFile
Dieser Wert gibt eine Dateinummer oder eine Liste bzw. einen Bereich von Dateinummern an, die auf dem aktuellen Volume gefunden werden soll. Die Dateinummer stellt die physikalische Datei auf dem Volume da, wo die Daten gespeichert sind. Bei einem Tape wird dieser Wert benutzt, um das Band richtig zu positionieren und wenn das Laufwerk die letzte angegebene Datei gelesen hat, wird der Lesevorgang gestoppt.

VolBlock
Dieser Wert gibt eine Blocknummer oder eine Liste bzw. einen Bereich von Blocknummern an, die auf dem aktuellen Volume gefunden werden soll. Die Blocknummer stellt die physikalischen Blöcke auf dem Volume da, wo die Daten gespeichert sind.

VolSessionTime
Dieser Wert gibt die Volume-Session-Zeit an, die auf dem aktuellen Volume gefunden werden soll.

VolSessionId
Dieser Wert gibt eine Volume-Session-ID oder eine Liste bzw. einen Bereich von Volume-Sesion-IDs an, die auf dem aktuellen Volume gefunden werden soll. Jedes Paar aus Volume-Session-ID und Volume-Session-Zeit, stimmt mit einem einzelnen Job überein, der auf dem Volume gespeichert ist.

JobId
Dieser Wert gibt eine Job-ID oder eine Liste bzw. einen Bereich von Job-Ids an, die auf dem aktuellen Volume gefunden werden soll. Beachten Sie bitte, dass die Job-ID eventuell nicht eindeutig ist, falls Sie mehrere Director-Dienste haben, oder falls Sie Ihre Datenbank neu initialisiert haben sollten. Der Job-ID-Filter funktioniert nicht, wenn Sie mehrere Jobs gleichzeitig haben laufen lassen. Dieser Wert ist optional und wird von Bacula nicht zum zurücksichern benötigt.

Job
Dieser Wert gibt einen Job-Namen oder eine Liste von Job-Namen an, die auf dem aktuellen Volume gefunden werden sollen. Der Job-Name stimmt mit einem einzigartigen Paar aus Volume-Session-Zeit und VolumeSessionID überein, allerdings ist er für Menschen ein bischen leichter zu lesen. Gewöhnliche reguläre Ausdrücke können benutzt werden, um einen entsprechenden Job-Namen zu finden. Der Job-Name-Filter funktioniert nicht, wenn Sie mehrere Jobs gleichzeitig haben laufen lassen. Dieser Wert ist optional und wird von Bacula nicht zum zurücksichern benötigt.

Client
Dieser Wert gibt einen Client-Namen oder eine Liste von Client-Namen an, dia auf dem aktuellen Volume gefunden werden soll. Gewöhnliche reguläre Ausdrücke können benutzt werden, um einen entsprechenden Job-Namen zu finden. Der Client-Filter funktioniert nicht, wenn Sie mehrere Jobs gleichzeitig haben laufen lassen. Dieser Wert ist optional und wird von Bacula nicht zum zurücksichern benötigt.

FileIndex
Dieser Wert gibt einen File-Index oder eine Liste bzw. einen Bereich von File-Indexen an, die auf dem aktuellen Volume gefunden werden soll. Jedes File (Datei) das auf einem Volume gespeichert ist, hat für seine Session einen einzigartigen File-Index. Bei jeder Session wird für das erste gespeicherte File der File-Index auf eins gesetzt und dann mit jedem weiteren File um eins erhöht.

Für ein beliebiges Volume bedeutet das, dass die drei Werte von Volume-Session-ID, Volume-Session-Time und File-Index zusammen eine einzelne einzigartige Datei auf einem Volume angeben. Diese Datei ist eventuell mehrfach auf dem Volume vorhanden, aber für jedes Vorkommen gibt es eine einzigartige Kombination dieser drei Werte. Diese drei Werte sind für jede Datei in der Katalog-Datenbank gespeichert.

Um eine Datei wiederherzustellen, ist die Angabe eines Wertes (oder einer Liste von File-Indexen) erforderlich.

Slot
Dieser Wert gibt den Autochanger-Slot an. Für jedes Volume darf nur ein Slot angegeben werden.

Stream
Dieser Wert gibt einen Stream (Strom) oder eine Liste bzw. einen Bereich von Streams an. Solange Sie nicht wirklich wissen, was Sie tun, (wenn Sie das interne Arbeiten von Bacula kennen), sollten Sie auf diese Angabe verzichten. Dieser Wert ist optional und wird von Bacula nicht zum zurücksichern benötigt.

*JobType
Noch nicht implementiert.

*JobLevel
Noch nicht implementiert.

Bei der Angabe des Volume ist zu bedenken, dass dies der erste Parameter sein muss. Alle anderen Parameter können in beliebiger Reihenfolge und Anzahl hinter einem Volume-Eintrag angegeben werden.

Mehrere Volume-Einträge können in der selben Bootstrap-Datei vorkommen, aber mit jedem Vorkommen beginnt ein neuer Satz an Filter, gültig für das abgegebene Volume.

Beim verarbeiten der Bootstrap-Datei werden alle Schlüsselwörter unterhalb eines Volume-Eintrags mit UND verknüpft. Also wird:

Volume = Test-01
Client = "My machine"
FileIndex = 1

auf alle Dateien auf dem Volume Test-01 UND von Client My machine UND mit dem Fileindex 1 passen.

Mehrfach angegebene Schlüsselwörter werden mit ODER verknüpft. Also wird:

Volume = Test-01
Client = "My machine"
Client = "Backup machine"
FileIndex = 1

auf alle Dateien auf dem Volume Test-01 UND von Client My machine ODER vom Client Backup machine UND mit dem Fileindex 1 passen.

Für Zahlenwerte können Sie einen Bereich oder eine Liste angeben, für alle anderen Parameter, bis auf Volumes, nur eine Liste. Eine Liste ist gleichbedeutend mit mehrfachen Angaben eines Parameters. Ein Beispiel

Volume = Test-01
Client = "My machine", "Backup machine"
FileIndex = 1-20, 35

passt auf alle Dateien auf dem Volume Test-01 UND von Client My machine ODER vom Client Backup machine UND mit dem Fileindex 1 ODER 2 ODER 3 ... ODER 20 ODER 35.

Wie oben erwähnt, können mehrere Volume-Einträge in der selben Bootstrap-Datei stehen. Jedes Vorkommen eines Volume-Eintrags beginnt einen neuen Satz an Filterregeln der auf dem angegebenen Volume angewendet wird und mit weiteren Volume-Einträgen über ODER verknüpft wird.

Als ein Beispiel nehmen wir an, dass wir, mit dem Console-Kommando query , nach dem Satz Volumes fragen, die benötigt werden, um alle Dateien des Clients Rufus wiederherstellen zu können:

Using default Catalog name=MySQL DB=bacula
*query
Available queries:
     1: List Job totals:
     2: List where a file is saved:
     3: List where the most recent copies of a file are saved:
     4: List total files/bytes by Job:
     5: List total files/bytes by Volume:
     6: List last 10 Full Backups for a Client:
     7: List Volumes used by selected JobId:
     8: List Volumes to Restore All Files:
Choose a query (1-8): 8
Enter Client Name: Rufus
+-------+------------------+------------+-----------+----------+------------+
| JobId | StartTime        | VolumeName | StartFile | VolSesId | VolSesTime |
+-------+------------------+------------+-----------+----------+------------+
| 154   | 2002-05-30 12:08 | test-02    | 0         | 1        | 1022753312 |
| 202   | 2002-06-15 10:16 | test-02    | 0         | 2        | 1024128917 |
| 203   | 2002-06-15 11:12 | test-02    | 3         | 1        | 1024132350 |
| 204   | 2002-06-18 08:11 | test-02    | 4         | 1        | 1024380678 |
+-------+------------------+------------+-----------+----------+------------+

Die Ausgabe zeigt uns, dass wir vier Jobs wiederherstellen müssen. Der erste ist eine vollständige Sicherung, und die drei folgenden sind inkrementelle Sicherungen.

Die folgende Bootstrap-Datei wird benötigt um alle Dateien wiederherzustellen:

Volume=test-02
VolSessionId=1
VolSessionTime=1022753312
Volume=test-02
VolSessionId=2
VolSessionTime=1024128917
Volume=test-02
VolSessionId=1
VolSessionTime=1024132350
Volume=test-02
VolSessionId=1
VolSessionTime=1024380678

Als letztes Beispiel nehmen wir an, dass die erste vollständige Sicherung sich über zwei verschiedene Volumes erstreckt. Die Ausgabe des Console-Kommandos query sieht eventuell so aus:

+-------+------------------+------------+-----------+----------+------------+
| JobId | StartTime        | VolumeName | StartFile | VolSesId | VolSesTime |
+-------+------------------+------------+-----------+----------+------------+
| 242   | 2002-06-25 16:50 | File0003   | 0         | 1        | 1025016612 |
| 242   | 2002-06-25 16:50 | File0004   | 0         | 1        | 1025016612 |
| 243   | 2002-06-25 16:52 | File0005   | 0         | 2        | 1025016612 |
| 246   | 2002-06-25 19:19 | File0006   | 0         | 2        | 1025025494 |
+-------+------------------+------------+-----------+----------+------------+

und die folgende Bootstrap-Datei wird benötigt, um diese Dateien wiederherzustellen:

Volume=File0003
VolSessionId=1
VolSessionTime=1025016612
Volume=File0004
VolSessionId=1
VolSessionTime=1025016612
Volume=File0005
VolSessionId=2
VolSessionTime=1025016612
Volume=File0006
VolSessionId=2
VolSessionTime=1025025494

automatische Erzeugung der Bootstrap-Datei

Eine Sache ist vermutlich wissenswert: die Bootstrap-Dateien die automatisch am Ende eines jeden Jobs erzeugt werden, sind nicht so optimiert wie die, die durch das Console-Kommando restore erzeugt werden. Das ist so, weil die Bootstrap-Dateien, die am Ende des Jobs erstellt werden, alle Dateien enthalten, die für diesen Job auf das Volume geschrieben wurden. Die Konsequenz ist, dass alle Dateien die wärend eines inkrementellen oder differenziellen Jobs geschrieben wurden, beim Wiederherstellen zunächst von der vollständigen Sicherung wiederhergestellt werden und dann von der inkrementellen oder differenziellen Sicherung.

Wenn die Bootstrap-Datei für die Wiederherstellung erstellt wird, wird immer nur eine Version der Datei (die aktuellste) zur Wiederherstellung aufgelistet.

Falls Ihr Rechner noch ein bischen Zeit übrig hat, können Sie Ihre Bootstrap-Dateien optimieren, indem Sie das folgende tun:

   ./bconsole
   restore client=xxx select all
   done
   no
   quit
   Backup bootstrap file.

Das wird allerdings nicht funktionieren, wenn Ihr Client mehrere Filesets hat, denn dann wird noch eine weitere Eingabe erforderlich. Das Console-Kommando restore client=xxx select all erstellt den Restore-Dateibaum und wählt alle Dateien aus, done beendet den Auswahlmodus, dann wird die Bootstrap-Datei für diesen Wiederherstellungs-Job geschrieben. Das no beantwortet die Frage Do you want to run this (yes/mod/no). quit beendet das Console-Programm, danach kann die neu erstellte Bootstrap-Datei gesichert werden.

Bootstrap-Datei für bscan

Wenn Sie mit dem bscan-Programm sehr viele Volumes abfragen müssen, wird Ihr Kommando eventuell das Limit der Kommandozeilelänge überschreiten (511 Zeichen). In dem Fall, können Sie eine einfache Bootstrap-Datei erzeugen, die nur Volume-Namen enthält. Ein Beispiel:

Volume="Vol001"
Volume="Vol002"
Volume="Vol003"
Volume="Vol004"
Volume="Vol005"

ein weiteres Beispiel der Bootstrap-Datei

Wenn Sie nur einen einzigen Job vom Volume lesen wollen, können Sie das durch auswählen der Job-Id tun (Funktion nicht getestet), oder besser noch, Sie geben die VolumeSessionTime und VolumeSessionID an, falls Sie sie wissen. (Die beiden Werte werden auf dem Job-Report ausgegeben und sind in der Katalog-Datenbank zu finden.) Die VolumeSessionTime und VolumeSessionID anzugeben ist auch die Art, wie Bacula Wiederherstellungen durchführt. Eine Bootstrap-Datei kann dann wie folgt aussehen:

Volume="Vol001"
VolSessionId=10
VolSessionTime=1080847820

Wenn Sie wissen, wie viele Dateien gesichert wurden (siehe den Job-Report), können Sie die Auswahl enorm beschleunigen, indem Sie der Bootstrap-Datei folgendes hinzufügen (angenommen es waren 157 Dateien):

FileIndex=1-157
Count=157

Letztendlich, wenn Sie auch die File-Nummer wissen, wo auf dem Volume die ausgewählten Dateien liegen, können Sie das bcopy-Programm veranlassen, zum richtigen File auf dem Volumen zu springen, ohne jeden Eintrag lesen zu müssen:

VolFile=20

Bootstrap-Dateien sind weder magisch noch kompliziert. Sie zu lesen und Bacula sinnvoll mit ihnen arbeiten zu lassen *ist* magisch, aber darum brauchen Sie sich nicht kümmern.

Wenn Sie eine *echte* Bootstrap-Datei sehen wollen, starten sie das Console-Programm und geben Sie restore ein, wählen ein paar Dateien aus und antworten mit no, wenn Sie gefragt werden, ob Sie die Wiederherstellung starten wollen. Dann finden Sie die Bootstrap-Datei im Arbeitsverzeichnis des Director-Dienstes (z.B. unter /var/lib/bacula/backup-dir.restore.2.bsr).


Installing and Configuring MySQL

Installing and Configuring MySQL -- Phase I

If you use the ./configure --with-mysql=mysql-directory statement for configuring Bacula, you will need MySQL version 3.23.53 or later installed in the mysql-directory. Bacula has been tested on MySQL version 4.1.12 and works providing you are running it in the default installation that is compatible with MySQL 3.23.x. If you are using one of the new modes such as ANSI/ISO compatibility, you may experience problems.

If MySQL is installed in the standard system location, you need only enter --with-mysql since the configure program will search all the standard locations. If you install MySQL in your home directory or some other non-standard directory, you will need to provide the full path to it.

Installing and Configuring MySQL is not difficult but can be confusing the first time. As a consequence, below, we list the steps that we used to install it on our machines. Please note that our configuration leaves MySQL without any user passwords. This may be an undesirable situation if you have other users on your system.

Beginning with Bacula version 1.31, the thread safe version of the MySQL client library is used, and hence you must add the --enable-thread-safe-client option to the ./configure as shown below:

  1. Download MySQL source code from www.mysql.com/downloads

  2. Detar it with something like:

    tar xvfz mysql-filename

    Note, the above command requires GNU tar. If you do not have GNU tar, a command such as:

    zcat mysql-filename | tar xvf -

    will probably accomplish the same thing.

  3. cd mysql-source-directory

    where you replace mysql-source-directory with the directory name where you put the MySQL source code.

  4. ./configure --enable-thread-safe-client --prefix=mysql-directory

    where you replace mysql-directory with the directory name where you want to install mysql. Normally for system wide use this is /usr/local/mysql. In my case, I use ~kern/mysql.

  5. make

    This takes a bit of time.

  6. make install

    This will put all the necessary binaries, libraries and support files into the mysql-directory that you specified above.

  7. ./scripts/mysql_install_db

    This will create the necessary MySQL databases for controlling user access. Note, this script can also be found in the bin directory in the installation directory

The MySQL client library mysqlclient requires the gzip compression library libz.a or libz.so. If you are using rpm packages, these libraries are in the libz-devel package. On Debian systems, you will need to load the zlib1g-dev package. If you are not using rpms or debs, you will need to find the appropriate package for your system.

At this point, you should return to completing the installation of Bacula. Later after Bacula is installed, come back to this chapter to complete the installation. Please note, the installation files used in the second phase of the MySQL installation are created during the Bacula Installation.

Installing and Configuring MySQL -- Phase II

At this point, you should have built and installed MySQL, or already have a running MySQL, and you should have configured, built and installed Bacula. If not, please complete these items before proceeding.

Please note that the ./configure used to build Bacula will need to include --with-mysql=mysql-directory, where mysql-directory is the directory name that you specified on the ./configure command for configuring MySQL. This is needed so that Bacula can find the necessary include headers and library files for interfacing to MySQL.

Bacula will install scripts for manipulating the database (create, delete, make tables etc) into the main installation directory. These files will be of the form *_bacula_* (e.g. create_bacula_database). These files are also available in the <bacula-src>/src/cats directory after running ./configure. If you inspect create_bacula_database, you will see that it calls create_mysql_database. The *_bacula_* files are provided for convenience. It doesn't matter what database you have chosen; create_bacula_database will always create your database.

Now you will create the Bacula MySQL database and the tables that Bacula uses.

  1. Start mysql. You might want to use the startmysql script provided in the Bacula release.

  2. cd <install-directory> This directory contains the Bacula catalog interface routines.

  3. ./grant_mysql_privileges This script creates unrestricted access rights for the user bacula. You may want to modify it to suit your situation. Please note that none of the userids, including root, are password protected. If you need more security, please assign a password to the root user and to bacula. The program mysqladmin can be used for this.

  4. ./create_mysql_database This script creates the MySQL bacula database. The databases you create as well as the access databases will be located in <install-dir>/var/ in a subdirectory with the name of the database, where <install-dir> is the directory name that you specified on the --prefix option. This can be important to know if you want to make a special backup of the Bacula database or to check its size.

  5. ./make_mysql_tables This script creates the MySQL tables used by Bacula.

Each of the three scripts (grant_mysql_privileges, create_mysql_database and make_mysql_tables) allows the addition of a command line argument. This can be useful for specifying the user and or password. For example, you might need to add -u root to the command line to have sufficient privilege to create the Bacula tables.

To take a closer look at the access privileges that you have setup with the above, you can do:

mysql-directory/bin/mysql -u root mysql
select * from user;

Re-initializing the Catalog Database

After you have done some initial testing with Bacula, you will probably want to re-initialize the catalog database and throw away all the test Jobs that you ran. To do so, you can do the following:

  cd <install-directory>
  ./drop_mysql_tables
  ./make_mysql_tables

Please note that all information in the database will be lost and you will be starting from scratch. If you have written on any Volumes, you must write an end of file mark on the volume so that Bacula can reuse it. Do so with:

   (stop Bacula or unmount the drive)
   mt -f /dev/nst0 rewind
   mt -f /dev/nst0 weof

Where you should replace /dev/nst0 with the appropriate tape drive device name for your machine.

Linking Bacula with MySQL

After configuring Bacula with

./configure --enable-thread-safe-client --prefix=<mysql-directory> where <mysql-directory> is in my case /home/kern/mysql, you may have to configure the loader so that it can find the MySQL shared libraries. If you have previously followed this procedure and later add the --enable-thread-safe-client options, you will need to rerun the ldconfig program shown below. If you put MySQL in a standard place such as /usr/lib or /usr/local/lib this will not be necessary, but in my case it is. The description that follows is Linux specific. For other operating systems, please consult your manuals on how to do the same thing:

First edit: /etc/ld.so.conf and add a new line to the end of the file with the name of the mysql-directory. In my case, it is:

/home/kern/mysql/lib/mysql then rebuild the loader's cache with:

/sbin/ldconfig If you upgrade to a new version of MySQL, the shared library names will probably change, and you must re-run the /sbin/ldconfig command so that the runtime loader can find them.

Alternatively, your system my have a loader environment variable that can be set. For example, on a Solaris system where I do not have root permission, I use:

LD_LIBRARY_PATH=/home/kern/mysql/lib/mysql

Finally, if you have encryption enabled in MySQL, you may need to add -lssl -lcrypto to the link. In that case, you can either export the appropriate LDFLAGS definition, or alternatively, you can include them directly on the ./configure line as in:

LDFLAGS="-lssl -lcyrpto" \
   ./configure \
      <your-options>

Installing MySQL from RPMs

If you are installing MySQL from RPMs, you will need to install both the MySQL binaries and the client libraries. The client libraries are ususally found in a devel package, so you must install:

  mysql
  mysql-devel

This will be the same with most other package managers too.

Upgrading MySQL

If you upgrade MySQL, you must reconfigure, rebuild, and re-install Bacula otherwise you are likely to get bizarre failures. If you install from rpms and you upgrade MySQL, you must also rebuild Bacula. You can do so by rebuilding from the source rpm. To do so, you may need to modify the bacula.spec file to account for the new MySQL version.

Kern Sibbald 2008-01-31