DSIW

Alles was interessant ist... (Linux, Programmierung, Datenschutz, Medien, uvm.)

Backups mit ccollect

| Comments

Ich mache meine Backups nun nicht mehr mit dem Bash-Skript aus dem UU-Wiki, sondern nutze dafür ccollect, das von Nico Schottelius programmiert wurde.

ccollect ist ein in sh geschriebenes Programm, das durch rsnapshot inspiriert wurde. Aufmerksam wurde ich durch die Sendung RadioTux Talk 144: RAID0 ====== Backup.

Installation

Das Programm ist eigentlich sehr einfach zu installieren, wenn man Arch Linux nutzt und somit Zugriff auf die Pakete im AUR hat. Denn hier gibt es das gleichnamige Paket. Die Installation ist wie gewohnt einfach:

$ yaourt -S ccollect

Während der Installation würde ich empfehlen in das PKGBUILD zu schauen. sh PKGBUILD (Auszug) pkgname=ccollect pkgver=0.8 pkgrel=2 pkgdesc="(pseudo) incremental backup with different exclude lists using hardlinks and rsync" arch=('any') url="http://www.nico.schottelius.org/software/ccollect/" license=('GPL3') depends=('rsync') makedepends=('asciidoc') source=(http://www.nico.schottelius.org/software/$pkgname/download/$pkgname-$pkgver.tar.bz2) md5sums=('4b7e0fb9c8d1ae989582d2020996fa67')

Daraus erkennt man, dass rsync eine Abhängigkeit ist, das bei Nichtvorhandensein nachinstalliert wird. Nach dem Kompilieren und Installieren des Programms ist es bereit für die Konfiguration.

Tipp: In meinem Fall brauchte ich das Paket asciidoc nicht mehr. Dieses kann deinstalliert werden:

# pacman -Ru asciidoc

Konfiguration

Die Konfiguration des Programms ist gewöhnungsbedürftig, hat aber ihren Scharm. Also ich finde es nicht schlecht.

Zuerst möchte ich euch das Konfigurationsverzeichnis zeigen. Hierbei sieht man, dass für jeden Backupjob ein source-Verzeichnis erstellt wird. In diesem sind die unterschiedlichen Einstellungen in verschiedenen Dateien verwaltet. ``` text Inhalt von /etc/ccollect /etc/ccollect/ ├── defaults │   └── intervals │   ├── daily │   ├── media │   ├── monthly │   ├── once │   ├── sys │   └── weekly └── sources

└── home
    ├── destination
    ├── exclude
    ├── post_exec -> /home/dsiw/bin/sys/mount/umountwd
    ├── pre_exec -> /home/dsiw/bin/sys/mount/mountwd
    ├── quiet_if_down
    ├── rsync_failure_codes
    ├── source
    └── summary

```

Intervalle

Der Inhalt der Dateien im Ordner defaults/intervals/ ist folgender und beschreibt die Anzahl der Backups, die nicht gelöscht werden sollen. Erst wenn die Anzahl die vorgeschriebene Anzahl überschritten wird, werden die ältesten Backups automatisch gelöscht.

Der Inhalt der Intervall-Dateien:

(weekly) download
1
4
(daily) download
1
7
(once) download
1
1
(monthly) download
1
6
(media) download
1
3
(sys) download
1
6

Quelle (mit Ausschluss) und Ziel

In der Datei source wird der Pfad zu dem Verzeichnis angegeben, das gesichert werden soll. Leider habe ich bis jetzt keine Möglichkeit gefunden, mehrere Pfad in der Datei source anzugeben. Deswegen hat meine exclude-Datei entsprechend viele Einträge (siehe unten).

Update vom 2012-07-15: Ich hatte deswegen den Autoren des Skript angeschrieben. Er meinte, dass man keine mehreren Dateien in der Datei source eintragen kann. Das ist aber nicht weiter tragisch, denn ich habe eine andere Möglichkeit gefunden, wie man die unendlich vielen auszuschließenden Dateien auf einfache Weise los wird. Dies ist weiter unten beschrieben.

(source) download
1
/

Meine Pfade, die gesichert werden, sind folgende. Eigentlich sollten diese in der Datei source stehen.

/usr/local/bin
/usr/local/sbin
/bin
/home
/etc
/opt
/boot
/var/log
/var/mail
/var/www
/var/lib/mysql

In der folgenden Datei sind alle Pfade angegeben, die nicht gesichert werden sollen:

Auszug (exclude.old) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/dev
/home/dsiw/.local/share/Trash
/home/dsiw/.gvfs
/lib
/media
/mnt
/proc
/root
/run
/sbin
/srv
/sys
/tmp
/usr/bin/
/usr/etc/
/usr/include/
/usr/lib/
[...]

Update vom 2012-07-15: Im RSYNC-Artikel vom Ubuntuusers-Wiki wird eine Möglichkeit gezeigt, wie mehrere Dateien ausgeschlossen werden können, ohne diese explizit anzugeben. Es wird mit Wildcards gearbeitet, somit sieht meine neue exclude folgendermaßen aus:

Auszug (exclude) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
+ /usr
+ /usr/local
+ /usr/local/bin
+ /usr/local/sbin
- /usr/local/*
- /usr/*

+ /home
- /home/dsiw/media
- /home/dsiw/.local/share/Trash
- /home/dsiw/.Trash
- /home/dsiw/.vifm/Trash
- /home/dsiw/.gvfs

+ /etc
+ /opt
+ /boot

+ /var
+ /var/log
+ /var/mail
+ /var/spool/
+ /var/spool/mail/
- /var/spool/*
+ /var/www
+ /var/lib
+ /var/lib/mysql
- /var/lib/*
- /var/*

- lost+found
- no-backup
- /*

Ich musste ein bisschen herumexperimentieren, damit alle gewünschten Verzeichnisse gesichert werden. Dadurch ist mir aufgefallen, dass ich bei Unterordnern spezielle Pfade ein- und ausschließen muss, damit es funktioniert:

sh Generisch + /.../to # Pre + /.../to/backup # Dieser Pfad soll gesichert werden. - /.../to/* # Post

Bei dem folgenden Beispiel soll nur der Pfad /var/lib/mysql gesichert werden, alle anderen Pfade werden ausgeschlossen.

diff Beispiel: Einschließen nur von /var/lib/mysql und Ausschließen aller anderen + /var + /var/lib + /var/lib/mysql - /var/lib/* - /var/* - /*

Hier erkennt man gut, dass das spezielle Ein- und Ausschließen für jede Pfad-Komponente gemacht werden muss.

Ich habe den folgenden Befehl genutzt, um die Datei exclude mit den richtigen Einträgen zu füllen:

/etc/ccollect/sources/home# rsync -apv --dry-run --exclude-from=exclude / /media/backup/test

In der Datei destination ist der Pfad enthalten, wo die Backups gespeichert werden sollen:

(destination) download
1
/media/backup

Wie man im Baum sehen kann, sind pre_exec und post_exec symbolische Links zu meinen beiden Skripten, die das Mounten und Unmounten meiner externen Festplatte steuern. Die Platte wird unter /media/backup gemounted -- deswegen auch der Inhalt in destination.

Funktionen

Die leeren Dateien quiet_if_down, summary und rsync_failure_codes werden zum Aktivieren von Funktionen benötigt. Möchte man diese nicht nutzen, dann können die Dateien ohne Probleme gelöscht werden.

  • pre_exec program to execute before backing up this source
  • post_exec program to execute after backing up this source
  • verbose whether to be verbose (passes -v to rsync)
  • very_verbose be very verbose (mkdir -v, rm -v and rsync -vv)
  • summary create a transfer summary when rsync finished
  • exclude exclude list for rsync. newline seperated list.
  • rsync_options extra options for rsync. newline seperated list.
  • delete_incomplete delete incomplete backups
  • remote_host host to backup to
  • rsync_failure_codes list of rsync exit codes that indicate complete failure
  • mtime Sort backup directories based on their modification time
  • quiet_if_down Suppress error messages if source is not connectable

Quelle: Dokumentation

Starten des Backups

Zum Starten von ccollect nutze ich ein kleines Skript. Die Verzweigung stellt sicher, dass das Skript mit Superuser-Rechten gestartet wurde.

(backup) download
1
2
3
4
#!/bin/sh
if [ $(id -u) -ne 0 ]; then exec sudo $0; fi
ccollect sys home # ccollect [interval] [source]
exit 0

Fazit

Ich bin mit der neuen Variante des Sichern von Dateien recht zufrieden. Leider können keine mehreren Pfade als Quelle angegeben werden. Dies liegt aber, glaube ich, an rsync. Vielleicht sollte ich mehrere Backupjobs anlegen, wobei das auch nicht eine komfortable Variante ist.
Wenn man nur sein Home-Verzeichnis sichern möchte, ist dies eine sehr schön Variante. Ich bleibe erstmal dabei.

Weitere Informationen

Comments