Linux.rsync
rsync als Backup Hilfsmittel
rsync ist ein leistungsstarker Verzeichnis-Replikator. Ein rsync-Server stellt gewissen Verzeichnissbereiche im "Nur-Lesen" Modus zur Verfügung. Ein rsync-Client kann einen eigenen Verzeichnisbereich mit dem des Servers abgleichen. Am Ende des rsync-Prozesses sollten beide Verzeichnisbäume gleich sein (wenn der Server nicht ständig Änderungen macht). Der OrgaMon Server stellt im wesentlichen 2 Verzeichnisse zur Verfügung:
/etc/ # für die Gesamte Server konfiguration /srv/ # ./fdb/ für firebird Datenbanken # ./ftp/ für FTP Ablagen # ./www/ für das ganze Onlineangebot # ./smb/ für alle Samba Freigaben
Ein Client wird in einem gewissen Intervall per WOL aufgeweckt. Dieser macht per rsync eine Verzeichnisreplikation und schaltet sich danach wieder ab!
Vorbereitungen
- am Quell-Server
rsync Dämon muss laufen
rcrsyncd status
wenn nicht lässt sich die Konfiguration um die entsprechenden Runlevel erweitern. mit YaSt Runlevel 3 und 5 setzten und für den Moment aktivieren. Nun den Dämon konfigurieren:
chkconfig --add rsyncd
Nun geht es an den Umfang der Angebote die dieser Dienst machen darf
joe /etc/rsyncd.conf
Der Inhalt der Datei sollte folgendermassen aussehen.
gid = users read only = true use chroot = true transfer logging = true log format = %h %o %f %l %b log file = /var/log/rsyncd.log hosts allow = 192.168.115.0/255.255.255.0 [srv] path = /srv read only = yes list = yes uid = nobody ODER root? gid = nobody ODER root? hosts allow = 192.168.115.94
Zugriffsprobleme auf Quelldateien: Werden nicht alle Dateien übertragen sollten die Zugriffsrechte, mit denen rsync die Dateien auf dem Quellsystem lesen kann erhöht werden.
uid = root gid = root
- Einstellungen auf dem Backup-System
rsync einfach mal ohne Parameter eingeben! muss gehen! Wenn nicht "rsnyc" installieren
rsync
Oder sehe ich den rsync-Server?
telnet <HostIP> 873 // oder rsync <HostName>:
es muss das Wort RSYNC erscheinen, ansonsten hört dir niemand zu! Oder eine Firewall verhindert die Verbindung.
Backup-Ziel-Verzeichnis vorbereiten:
Ich wollte ein backup von "heute" und eines von "gestern" haben. Also habe im in meinem /backup-Pfad zwei Unterverzeichnise gemacht: (immer chmod 0777 nur so zur Sicherheit)
backup/0 und backup/1
hat man also eine Datei heute ausversehen gelöscht ist sie im anderen Pfad sicher noch vorhanden. Es ist dem Konzept der alternierenden Bänder üblich, bei der man Datensicherungen mit 3 Bändern immer alternierend durchführt 0,1,2,0,1,2 usw.
Datensicherungslauf automatisch mit cron starten
cron ist ein Dämon der zeitgesteuert Programme startet. Hierbei
Stelle sicher, dass cron als Dienst läuft (YaST2->System->runlevel editor)
jetzt noch /etc/crontab editieren, und folgenden Eintrag machen:
#min hour daymo month daywk usr cmd 0 9,12,15,18,22 * * * root /root/backup.sh
Datensicherungs Script backup.sh
das /root/backup.sh sollte so aussehen
------------------------------snip #!/bin/bash # # Bestimmen hier, wieviele Backup-Sätze du bevorraten willst. # In meinem Fall "2", also heute und gestern, bei entsprechendem # Plattenplatz kann das aber auch 20 oder 30 sein! # ANZAHL_BAENDER=2 # # Hier wird eine alsolute Tag-Nummer ermittelt. Mit Hilfe des Modulo- # Operator erhöht man die entsprechende "Band-Nummer", beginnen bei # Null (0). # BAND=$((($(date +%s)/86400)%$ANZAHL_BAENDER)) # # mit dem touch ist es leicht m?ch zu sehen wann der rsync # zuletzt "0", "1", ... bearbeitet hat. # touch /backup/$BAND # # jetzt der rsync an sich bwlimit verhindert, dass und rsync die ganze Bandbreite des Netzes # wegnimmt. # rsync -av --delete --force --ignore-errors --bwlimit=200 192.168.115.92::srv/ /backup/$BAND ------------------------------snap
kann man ja erst mal so per Hand aufrufen!
Autostart des ./etc/backup.sh
Auf dem Rechner, der automatisch durch WOL gestartet wird sollte das Backup Skript automatisch starten.
# # # joe /etc/init.d/boot.local # # ganz unten Eintrag sicherstellen: # startproc /etc/backup.sh
ACHTUNG1: Links mitsichern
andere Verzeichnisse, die man via symbolischem Link einfach mitsichern will: DAS GEHT NICHT!!!
ln -s /var/lib/mysql mysql
Besser ist es für diese Verzeichnisse wiederum eine weitere, eigene rsync-Freigabe anzulegen!
ACHTUNG: die Quelle nicht mit "*" angeben, dadurch verbleiben Verzeichnisse auf dem Replikat. die auf dem Original längst gelöscht sind. Ausserdem können dadurch mit einem Punkt beginnende Dateien nicht gesehen werden. Einfach die Root Verzeichnisse angeben.
ACHTUNG2: Umlaute
geht einfach nicht. Ev. erst ab Mai 2005: also rsync ev. selbst compileiren. landet bei mir im /usr/local/bin. Muss aber nach /usr/sbin als rsynd und nach /usr/bin nach rsync.
noch'n Script
#!/bin/bash echo "OrgaMon Backup startet";
sleep 300 ANZAHL_BAENDER=1 BAND=$((($(date +%s)/86400)%$ANZAHL_BAENDER)) OPTIONS="-avK --delete --force --ignore-errors --copy-unsafe-links" mkdir "/srv/smb/freigabe/"$BAND chmod 777 "/srv/smb/freigabe/"$BAND touch "/srv/smb/freigabe/"$BAND
# # /srv # DEST=/srv/smb/freigabe/$BAND/srv mkdir $DEST chmod 777 $DEST rsync $OPTIONS 192.168.115.90::srv/ $DEST
# # /etc # DEST=/srv/smb/freigabe/$BAND/etc mkdir $DEST chmod 777 $DEST rsync $OPTIONS 192.168.115.90::etc/ $DEST
# # Log! # php /srv/smb/mail/phpmailer/mail.php
# # Halt! # sleep 30 ethtool -s eth0 wol g halt
Mailen, mit Hilfer der php-Mailer-Class
Diese Mail-Benachrichtigung wird mit Hilfe des "phpmailers" verwirklicht!
http://phpmailer.sourceforge.net/
<?php
require("class.phpmailer.php");
$mail = new PHPMailer();
$mail->IsSMTP(); // send via SMTP $mail->Host = "raib90"; // SMTP servers $mail->SMTPAuth = true; // turn on SMTP authentication $mail->Username = "mail-af1"; // SMTP username $mail->Password = "ZQ21P1X8Z"; // SMTP password
$mail->From = "raib86@orgamon.de"; $mail->FromName = "Sicherungsserver"; $mail->AddAddress("andreas.filsinger@orgamon.com"); $mail->AddReplyTo("andreas.filsinger@orgamon.org","Information");
$mail->WordWrap = 50; // set word wrap
$mail->Subject = "-- rsync Lauf beendet --"; $mail->Body = round((((disk_free_space("/") / 1024) / 1024) / 1024)) . " Giga-Byte(s) noch frei!";
if(!$mail->Send()) {
echo "Message was not sent
"; echo "Mailer Error: " . $mail->ErrorInfo; exit; } echo "Message has been sent"; ?>