Debian Backup

Aus Port23Wiki
Wechseln zu: Navigation, Suche

Ich betreibe zu Hause und in der Firma je einen Debian Lenny Server, dessen Daten gesichert werden sollen. Zu Hause sollen die Sicherungen auf einer externen USB-Platte gespeichert werden, in der Firma auf dem Fileserver, der täglich alle Daten auf Band speichert. Die Vielzahl der zur Verfügung stehenden Backup-Lösungen ist zunächst einmal verwirrend. Große Lösungen wie Bacula oder Amanda scheiden von vornherein aus, da der Konfigurationsaufwand für nur einen Server viel zu hoch ist. Auch die restlichen Client-Server-Lösungen passen nicht in mein kleines Szenario.

Die jetzt noch übrigen Lösungen machen mehr oder weniger alle das selbe. Unterschiede sind vor allem in der Tatsache begründet, mit oder ohne Hardlinks zu arbeiten. Da meine externe Platte mit ntfs formatiert ist, wollte ich erst gar nicht ausprobieren, ob damit Hardlinks vernünftig funktionieren. Stattdessen soll eine Kombination aus Voll- und inkrementellen Backup und gepackten Dateien Verwendung finden.

Der Konfigurationsaufwand und die Zeit die man zum Einlesen in das jeweilige Paket braucht ist sehr unterschiedlich - letztlich habe ich mich für backup2l entschieden. Dessen Konfiguration wird im Folgenden näher beschrieben.

Inhaltsverzeichnis

Installation

Unter Debian Lenny genügt ein

root@server:~# apt-get install backup2l afio

zum Installieren. Das Paket afio hat gegenüber tar und cpio einige Vorteile.

Unterstützung von .nobackup in Ordnern

Normalerweise stellt der Systemadministrator ein, welche Dateien und Ordner gesichert werden sollen. Will man seinen Usern erlauben, Ordner zu kennzeichnen, die nicht zu sichern sind, muss man in dem Bash-Script von backup2l ab Zeile 633 folgende Veränderung einbauen:

       | sort -k 6 \
       > $TMP.list
   IFS=$OLDIFS
echo "searching .nobackup folders ..." find / -name .nobackup | sed 's/\/.nobackup//' > $TMP.exclude.list echo "cleaning list of backup files ..." cp $TMP.list $TMP.pre.list for i in `cat $TMP.exclude.list` do grep -v $i $TMP.pre.list > $TMP.list cp $TMP.list $TMP.pre.list done
cat $TMP.skipped.dirs $TMP.skipped.files \ | sed -e 's# \([0-9]*\..* /.*\)# 00\1#' -e 's# \([0-9]*\..* /\)# 0\1#' \

Jetzt können die User in die Ordner, die nicht gesichert werden sollen, eine Datei .nobackup anlegen und damit dafür sorgen, dass diese Ordner und alles darunter nicht gesichert werden.

Konfiguration

Das Paket enthält bereits eine Konfigurationsdatei die man anpassen muss.

allgemeine Vorbemerkungen

Dateien zu sichern, während sie im (schreib) Zugriff von laufenden Prozessen sind, ist keine gute Idee. Man sollte den dazu gehörenden Dienst vorher beenden und hinterher wieder starten. Damit ist sichergestellt, dass die gesicherten Daten in einem konsistenten Zustand sind.

Den Zeitpunkt um die Dienste abzuschalten muss man so wählen, dass die User nicht übermäßig gestört werden. Und wenn man ausreichend Platz auf der internen Platte hat, kann man das wegschreiben der Daten auf ein externes Medium nach dem Sicherungsjob laufen lassen. Im Überblick sieht das dann in etwa so aus:

  1. Dienst beenden
  2. Daten sammeln, packen und ablegen
  3. Dienst starten
  4. Daten auf externes Medium speichern

In der Konfigurationsdatei von backup2l gibt es die Funktionen

# This user-defined bash function is executed before a backup is made
PRE_BACKUP ()
{
   echo "  pre-backup: nothing to do"
   # e. g., shut down some mail/db servers if their files are to be backup'ed
   # On a Debian system, the following statements dump a machine-readable list of
   # all installed packages to a file.
   #echo "  writing dpkg selections to /root/dpkg-selections.log..."
   #dpkg --get-selections | diff - /root/dpkg-selections.log > /dev/null || dpkg --get-selections > /root/dpkg-selections.log
}

und

# This user-defined bash function is executed after a backup is made
POST_BACKUP ()
{
   # e. g., restart some mail/db server if its files are to be backup'ed
   echo "  post-backup: nothing to do"
}

die sich sehr gut eignen, um Dienste zu beenden (PRE_BACKUP), zu starten und die Daten wegzuspeichern (POST_BACKUP). An dieser Stelle ist backup2l allerdings ein wenig zu einfach gestrickt. Ich hätte mir an dieser Stelle gewünscht, dass man mehrere PRE- und POST-Funktionen verwenden kann. Mal angenommen man möchte neben den üblichen Ordnern auch noch seine Mails die der Cyrus-Imapd verwaltet sichern. Und die MySQL-Datenbank des Wiki, welches im Apache läuft ebenfalls. Dann würde man also den Imapd, sicherheitshalber auch noch den fetchmail, den exim erst mal beenden. Damit könnte man die Mails problemlos wegsichern. Wegen der Datenbank fährt man auch noch den Apache und den mysqld runter. Dann macht man einen Dump der Datenbank und kann jetzt erst zu sichern beginnen. Am Ende fährt man alles wieder hoch und kann die Daten wegschreiben.

Da sind zu viele Dienste viel zu lange nicht verfügbar.

Die Lösung ist, mehrere Konfigurationsdateien zu benutzen - jede für einen Teil des Servers.

spezifisches für Debian

Es macht wenig Sinn, alle Dateien des Servers zu sichern, wenn man die Paketquellen eh im Zugriff (CD, DVD, Internet) hat. Viel eher muss man wissen, welche Pakete man installiert hat. Das Kommando

dpkg --get-selections

erzeugt eine Liste der installierten Pakete. Diese Liste wird gesichert.

Konfiguration Homeserver

Backup der Mails

Für das Backup der Mails verwende ich eine eigene Konfigurationsdatei /etc/backup2l-mail.conf

VOLNAME="mail"
SRCLIST=(/var/spool/cyrus \
         /var/spool/sieve \
         /var/spool/exim4 )
SKIPCOND=(-path "*.nobackup*" \ -o -name "*.o" )
BACKUP_DIR="/var/spool/backup/mail"
PRE_BACKUP () { echo " pre-backup running" echo " stopping Mail Daemons..." /etc/init.d/fetchmail stop /etc/init.d/cyrus2.2 stop /etc/init.d/exim4 stop }
POST_BACKUP () { echo " post-backup running" echo " starting Mail Daemons..." /etc/init.d/exim4 start /etc/init.d/fetchmail start /etc/init.d/cyrus2.2 start echo " move archive to ext. disc ..." mv /var/spool/backup/mail/*.afioz /mnt/ext-sata/n600-backup/mail echo " copy control files to ext. disc ..." cp /var/spool/backup/mail/* /mnt/ext-sata/n600-backup/mail }

Backup der Homedirectories

Für das Backup der Homedirectories verwende ich eine eigene Konfigurationsdatei /etc/backup2l-home.conf

VOLNAME="home"
SRCLIST=(/home)
SKIPCOND=(-path "*.nobackup*")
BACKUP_DIR="/var/spool/backup/home"

Backup des Systems

Für das Backup des Systems verwende ich eine eigene Konfigurationsdatei /etc/backup2l.conf. Um den Master-Boot-Record und die Partitionstabelle auch zu sichern, verwende ich dd und sfdisk. Wer ein anderes Bootdevice als ich hat, muss das /dev/rd/c0d0 natürlich anpassen.

VOLNAME="system"
SRCLIST=(/etc \ /boot \ /root \ /usr/local \ /var/spool \ /var/backups \ /var/cache/debconf \ /var/lib )
SKIPCOND=(-path "*.nobackup*" \ -o -name "*.o" \ -o -name "*.iso" \ -o -path "/var/spool/cups*" \ -o -path "/var/spool/exim4*" \ -o -path "/var/spool/squid*" \ -o -path "/var/spool/cyrus*" \ -o -path "/var/spool/sieve*" \ -o -path "/var/spool/backup*" \ -o -path "/var/spool/uucp/chico*" \ -o -path "/var/lib/apt/lists*" \ -o -path "/var/lib/amavis/tmp*")
BACKUP_DIR="/mnt/ext-sata/n600-backup/system"
PRE_BACKUP () { echo " pre-backup running" dpkg --get-selections | diff - /root/dpkg-selections.log \ > /dev/null || dpkg --get-selections > /root/dpkg-selections.log diff /etc/backup2l.conf /root/backup2l.conf > /dev/null \ || cp /etc/backup2l.conf /root diff /etc/apt/preferences /root/apt/preferences > /dev/null \ || cp /etc/apt/preferences /root/apt diff /etc/apt/sources.list /root/apt/sources.list > /dev/null \ || cp /etc/apt/sources.list /root/apt
dd if=/dev/rd/c0d0 of=/root/backup/mbr/mbr bs=512 count=1
sfdisk -l /dev/rd/c0d0 > /root/backup/mbr/partitions-human-readable sfdisk -d /dev/rd/c0d0 > /root/backup/mbr/partitions-sfdisk-readable }
POST_BACKUP () { echo " post-backup running" }

Backup ausführen

Mittels

root@server:~# backup2l -c /etc/name_der_konfigurationsdatei -b

geht's los. Es wird automatisch geprüft, welcher Backuplevel dran ist.

 root-> /usr/local/sbin/backup2l -c /etc/backup2l-mail.conf -b
 backup2l v1.4 by Gundolf Kiefer
Sun Sep 6 14:53:56 CEST 2009
Running pre-backup procedure... pre-backup running stopping Mail Daemons... Stopping mail retriever agent: fetchmail. Stopping Cyrus IMAPd: cyrmaster. Stopping MTA: exim4_listener.
Removing old backups...
Preparing differential level-3 backup <mail.1006> based on <mail.1005>... searching .nobackup folders ...
cleaning list of backup files ... 5 / 115516 file(s), 5 / 161 dir(s), 20.8MB / 1.5GB (uncompressed) skipping: 0 file(s), 0 dir(s), 0 B (uncompressed)
Creating archive using 'DRIVER_AFIOZ'... Checking TOC of archive file (< real file, > archive entry)... Creating check file for <mail.1006>...
Running post-backup procedure... post-backup running starting Mail Daemons... Starting MTA: exim4. Starting mail retriever agent: fetchmail. Starting Cyrus IMAPd: cyrmaster. move archive to ext. disc ... copy control files to ext. disc ...
Sun Sep 6 14:59:39 CEST 2009

Summary =======
Backup Date Time | Size | Skipped Files+D | New Obs. | Err. ------------------------------------------------------------------------------- mail.1 2009-09-03 21:54 | 1.7M | 0 115560 |115560 0 | 0 mail.1001 2009-09-03 22:20 | 848K | 0 115553 | 31 38 | 0 mail.1002 2009-09-04 15:29 | 849K | 0 115586 | 88 55 | 0 mail.1003 2009-09-05 16:40 | 852K | 0 115635 | 221 172 | 0 mail.1004 2009-09-06 10:27 | 850K | 0 115682 | 111 64 | 0 mail.1005 2009-09-06 13:02 | 849K | 0 115676 | 41 47 | 0 mail.1006 2009-09-06 14:59 | 8.1M | 0 115677 | 10 9 | 0
Filesystem Size Used Avail Use% Mounted on /dev/hda1 145G 105G 33G 77% /

Restore

Vor einem Restore möchte man vielleicht nachprüfen, ob die Auswahl der Dateien und Ordner auch passt. Dafür gibt es den Parameter -l (= locate):

server:~# backup2l -c /etc/backup2l.conf -l sans
backup2l v1.4 by Gundolf Kiefer
Active files in <all.1015>: 5 found in all.1015: 0 ( 5 left) found in all.1014: 0 ( 5 left) found in all.1013: 0 ( 5 left) found in all.1012: 0 ( 5 left) found in all.1011: 0 ( 5 left) found in all.101: 0 ( 5 left) found in all.1: 5 ( 0 left)
Listing locations... all.1: /etc/fonts/conf.avail/49-sansserif.conf all.1: /etc/fonts/conf.d/49-sansserif.conf all.1: /var/lib/defoma/pango.d/id-cache.sans_iso10646 all.1: /var/lib/defoma/pango.d/id-cache.sans_iso8859_X all.1: /var/lib/defoma/pango.d/id-cache.sans_other
All required archive files are present in /var/spool/backup.

Vor dem Restore muss man in den Ordner wechseln, in den die Dateien wiederhergestellt werden. Wählt man hier / werden die vorhandenen Dateien natürlich überschrieben! Der Restore selbst geht dann mit dem Parameter -r:

server:~# backup2l -c /etc/backup2l.conf -r sans
backup2l v1.4 by Gundolf Kiefer
Active files in <all.1015>: 5 found in all.1015: 0 ( 5 left) found in all.1014: 0 ( 5 left) found in all.1013: 0 ( 5 left) found in all.1012: 0 ( 5 left) found in all.1011: 0 ( 5 left) found in all.101: 0 ( 5 left) found in all.1: 5 ( 0 left)
Restoring files... all.1.afioz: 5 file(s) using 'DRIVER_AFIOZ'
Meine Werkzeuge