Einfaches Backup mit rsync
rsync ist ein einfaches Tool auf Unixsystemen mit dem man ein Backup zwischen 2 Hosts realisieren kann. In diesem Beispiel gehen wir von einem Webserver und einem Host im lan des Serveradministrators aus. Wieso gerade rsync? rsync hat den Vorteil das es durch einen effiziennten Checksummenvergleich der Files nur Files uebertraegt die sich veraendert haben. So wird viel Traffic und Zeit gesparrt.
Naehere Angaben zur Theorie bitte der manpage entnehmen.
man rsync
SYNOPSIS (aus man rsync)
rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
rsync [OPTION]... [USER@]HOST:SRC DEST
rsync [OPTION]... SRC [SRC]... DEST
rsync [OPTION]... [USER@]HOST::SRC [DEST]
rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST
rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST
rsync einrichten?
Nunja, es empfieht sich erstmal die Software ueber http://www.rpmfind.net fuer LinuxUser zu besorgen. Nach einem einfachen ./configure mit anschliessendem make && make install sollte sich die software auch leicht von der Source aus installieren lassen. RPM user muessen halt rpm -i rsync.wad.weiss.ich.fuer.ne.version.rpm machen. FreeBSD user haben wie immer Glueck und kommen mit einem cd /usr/ports/net/rsync und anschliessendem make install clean davon.
Die Konfiguration von rsync wird in diesem Beispiel auf dem Webserver angelegt. Hierfuer muss das File /usr/local/etc/rsync.conf (bei Suse 8.2 unter /etc/rsync.conf) angelegt bzw. modifiziert werden.
Hier ein Beispiel:# rsyncd.conf uid = root gid = wheel max connections = 4 syslog facility = local5 pid file = /var/run/rsyncd.pid hosts allow = 213.239.192.xxx/32 [home] path = /home comment = rsync backup for /home [mysql] path = /var/db/mysql comment = rsync backup for /var/db/mysql -> learUid & Gid koennen gegebenenfalls geaendert werden. es ist jedoch selbstverstaendlich notwendig das der rsyncuser lesende rechte auf die zu sichernden Dateien hat.
- max connections beschreibt wieviele gleichzeitige Verbindungen aufgebaut werden koennen. Es wuerde auch eine Connection reichen in diesem Beispiel.
- syslog facility gibt an wohin rsync bei Fehlern logged. Siehe man syslog. In diesem beispiel werden nur errors gelogged.
Der Pfad zum PidFile. (in diesem ist die ProzessId gespeichert waehrend der rsync gestartet ist)
- hosts allow: Die IP-Adresse die der Remoterechner hat. Im Falle von NAT, muss gegebenenfalls die Uebersetzte Adresse eingetragen werden. User von dynamischen IP-Adressen haben hier ein Problem und muessen eine Wildcard [0.0.0.0/0] setzen.. bzw. die Adresse taeglich aendern. Naeheres spaeter in einer erweiterten Form.
- Die [] leiten einen Container ein. path = /der_pfad_zu_den_zu_sichernden.dateien. Es koennen beliebig viele Container angelegt werden. In diesem Beispiel verbirgt sich der Pfad /home in dem Container [home].
Wie bekommt man das ganze taeglich zu einer bestimmten Uhrzeit zum laufen?
Dies ist eine leichte Frage, mittels cronjob. Erstmal legt man sich auf dem Remoterechner ein Script wie das folgende an.#rsync -aHo --delete webserver.domain.de::containername /verzeichnis/in/dass/das/backup/soll rsync -aHo --delete --exclude-from=/etc/rsyncd.home webserver.domain.de::home /bak/home/ rsync -aHo --delete webserver.domain.de::mysql /bak/var/db/mysql.hamlet
Nun noch das ganze als z.b. backup.sh an einem Ort /root/bin speichern, und die rootcrontab editieren mit crontab -e.
#muster crontab SHELL=/bin/sh MAILTO=root@localhost PATH=/usr/local/bin:/usr/bin:/bin # min hour mday month wday command 00 03 * * * /root/bin/backup.sh
Was passiert also.. um 00:03 taeglich versucht der Client auf den Webserver zu connecten. Er wird zunaecht das Backup des Containers [home] durchzufuehren. Er schaut in der Datei /etc/rsyncd.home nach Verzeichnissen die er evtl nicht sichern soll. /etc/rsyncd.home ist eine einfache liste an Verzeichnisnamen in /home die rsync ignorieren soll. Nach dem Diff der Dateien beginnt er mit der Uebertragung. Dateien die es nicht mehr gibt auf dem Remoteserver werden geloescht durch den Anhang --delete. Wer also mehr als einen Tag Backup haben moechte muss local das Backupverzeichnis nocheinmal kopieren.