Inhaltsverzeichnis

Rsync

Mit „rsync“ können große Datenmengen an ein beliebiges Ziel synchronisiert werden.

Rsync als Daemon

Der Rsync Daemon läuft unter dem Port 873 und ist effetiver als der Zugriff auf die Daten per Samba oder NFS.
Die Konfigurationsdatei /etc/rsyncd.conf muss erst erstellt werden und kann wie folgt aussehen:

use chroot = true
hosts allow = <IP_ADRESSE_IM_CIDR_FORMAT>
transfer logging = true
log file = /var/log/rsyncd.log
log format = %h %o %f %l %b

[<FREIGABENAME>]
comment = <KOMMENTAR>
# ohne abschließenden "/" in der Pfadangabe wird der Quellordner im Zielordner angelegt
# mit "/" werden lediglich die Dateien des Quellordners in den Zielordner kopiert
path = <ABSOLUTER_PFAD_ZU_FREIGABE_VERZEICHNIS>
read only = no
list = yes
# uid und gid mit nobody/nogroup verwenden um keine Änderungen an Besitzrechten vorzunehmen, sonst eine/-n beliebige/-n Gruppe/User verwenden
uid = nobody
gid = nogroup
# Benutzerauthentifizierung verwenden
auth users = <USERNAME>, <USERNAME>
secrets file = /etc/rsyncd.secrets

Verwendet man die Benutzerauthentifizierung muss noch die Datei /etc/rsyncd.secrets mit folgendem Inhalt erstellt werden.

<USERNAME>:<PASSWORD>
<USERNAME>:<PASSWORD>

Gestartet wird der Daemon dann mit

rsync --config=/etc/rsyncd.conf --daemon --no-detach 

Einen Rsync-Server kann man wie folgt nach seinen Freigaben abfragen:

rsync server-ip::

oder

rsync server-ip::Freigabename

Soll Rsync beim booten als Daemon automatisch gestartet werden, so editiert man die Datei /etc/default/rsync und setzt den Parameter „RSYNC_ENABLE“ auf „true“.

kopieren mit Rsync-Freigaben

Mit Rsync freigegebene Ordner werden wie folgt kopiert.

rsync [<OPTIONEN>] [<USERNAME>@]<HOSTNAME_ODER_IP>::<FREIGABENAME> [<ZIELORDNER>]

oder

  rsync [<OPTIONEN>] rsync://[<USERNAME>@]<HOSTNAME_ODER_IP>[:<PORT>]/<FREIGABENAME> [<ZIELORDNER>]

Werden Symlinks über eine Rsync-Freigabe kopiert, werden diese aus Sicherheitsgründen (Kopieren mit Root-Rechten „use chroot = true“) mit dem vorangestellten Zusatz /rsyncd-munged/ kopiert.
Das kann den Sicherheitsmechanismus mit der Rsync-Option „–no-munge-links“ oder dem Eintrag „munge symlinks = no“ in der „rsyncd.conf“ ausschalten.

Backup

Hier ein Backup-Script welches sich per ssh eine Verzeichniss liste holt und diese dann an ein angegebenes Ziel synchronisiert.
In dieser Datei sind div. Variablen die evtl. angepasst werden müssen, wie z.b:

src –> Quelle
dst –> Ziel
RSYNCSRC –> Angaben zum Rsync-Share

Wenn alles soweit angepasst ist braucht man nur eine Datei namens „dirlist“, welche die zu synchronisierenden Verzeichnisse beinhaltet (Script erstellt die „dirlist“).
Zusätzlich kann für einen rsync-Server ein Password, in der Datei passwd, angegeben werden.
Wenn keines benötigt wird, dann einfach diese Datei leer erstellen (touch passwd).
Evtl. muss noch ein Host-Key für die Authentifizierung per SSH vorbereitet werden. So kann das Script per „cron“ gestartet werden.

Script

#!/bin/bash
#
# by stizi.de 14.11.2012
#
CMDRSYNC=`which rsync`
CMDMKDIR=`which mkdir`
CMDFIND=`which find`
CMDMV=`which mv`
CMDLS=`which ls`
CMDSSH=`which ssh`
CMDECHO=`which echo`
CMDDATE=`which date`
CMDCAT=`which cat`

SSHUSER=<USERNAME>
SSHPASSWD=<PASSWORD>
SRCSERVER=<SERVER>
PROGHOMEDIR="<VERZEICHNISPFAD_ZU_RSYNC.SH>"
LOGDIR="${PROGHOMEDIR}/logs"
DIRLIST="${PROGHOMEDIR}/dirlist"
PASSWORDFILE="${PROGHOMEDIR}/passwd"
SRCDIR="<QUELLVERZEICHNIS>"
DSTDIR="<ZIELVERZEICHNIS>"
RSYNCSRC=<USER>@${SRCSERVER}::${SRCDIR}

if [ ! -d ${LOGDIR} ]; then
        ${CMDMKDIR} ${LOGDIR}
        if [ ! -d ${LOGDIR}/alt ]; then
                ${CMDMKDIR} ${LOGDIR}/alt
        fi
fi

if [ $(${CMDFIND} ${LOGDIR} -maxdepth 1 -type f | wc -l) != "0" ]; then
        ${CMDMV} ${LOGDIR}/*.log ${LOGDIR}/alt;
fi

${CMDSSH} ${SSHUSER}@${SRCSERVER} "${CMDLS} ${SRCDIR} > ${DIRLIST}"

for elem in `${CMDCAT} ${DIRLIST}`; do
        LOG=${LOGDIR}/${elem}.log
        #OPTIONS="-a --stats --progress --log-file=${LOG} --password-file=${PASSWORDFILE}"
        OPTIONS="-a --stats --progress --log-file=${LOG}"
        ${CMDECHO}  "rsync.sh started at `${CMDDATE}`" >> ${LOG} 2>> ${LOG};
        ${CMDECHO} "" >> ${LOG} 2>> ${LOG};
        ${CMDECHO} "" >> ${LOG} 2>> ${LOG};
        ${CMDECHO} "" >> ${LOG} 2>> ${LOG};
        ${CMDECHO} "+++ starting at `${CMDDATE}` syncing" ${elem}  >> ${LOG} 2>> ${LOG};
        ${CMDRSYNC} ${OPTIONS} ${RSYNCSRC}/${elem} ${DSTDIR} >> ${LOG} 2>> ${LOG};
        ${CMDECHO}  "rsync.sh finished at `${CMDDATE}`" >> ${LOG} 2>> ${LOG};
done
exit 0;

Erläuterung "-a"

Die Option -a, in rsync, bedeutet laut Hilfe „archive mode; equals -rlptgoD (no -H,-A,-X)“.
Hier die Erläuterung zu den einzelnen Optionen die -a beinhaltet:

Option Beschreibung
-a –archive: archive mode;
equals -rlptgoD (no -H,-A,-X)
-r –recursive: recurse into directories
-l –links: copy symlinks as symlinks
-p –perms: preserve permissions
-t –times: preserve modification times
-g –group: preserve group
-o –owner: preserve owner (super-user only)
-D same as –devices –specials
-H –hard-links: preserve hard links
-A –acls: preserve ACLs (implies –perms)
-X –xattrs: preserve extended attributes

Prüfsummencheck

Nach dem Rsyncen, kann man beide Datenbestände zusätzlich vergleichen.
Hier ein Script dazu:

#!/bin/bash
CMDHOSTNAME=`which hostname`
HOSTNAME=`${CMDHOSTNAME} -s`
CMDLS=`which ls`
CMDCFV=`which cfv`
CMDSORT=`which sort`
CMDSED=`which sed`
CMDCAT=`which cat`
CMDMD5SUM=`which md5sum`

CHECKDIR=<PFAD_ZU_CHECKVERZEICHNIS>
WORKDIR=<PFAD_ZU_ARBEITSVERZEICHNIS_VON_CHECKMD5.SH>
DIRLIST=${WORKDIR}/dirlist-${HOSTNAME}
MD5DIR=${WORKDIR}/md5
LOG=${WORKDIR}/md5-${HOSTNAME}.log
CHECKFILE=${WORKDIR}/gesamt-${HOSTNAME}.md5

if [ ! -d ${MD5DIR} ]; then
        mkdir ${MD5DIR}
fi

${CMDLS} -d ${CHECKDIR}/*/ | ${CMDSORT} | ${CMDSED} 's!/$!!' | ${CMDSED} 's!/.*/!!' > ${DIRLIST}

for elem in `${CMDCAT} ${DIRLIST}`; do
        if [ ! -f ${MD5DIR}/${elem}.md5 ]; then
                ${CMDCFV} -rr -C -t md5 -q -f ${MD5DIR}/${elem}.md5 ${CHECKDIR}/${elem}
        fi
done

${CMDMD5SUM} ${MD5DIR}/*.md5 > ${CHECKFILE}

exit 0;

Folgende Zip-Datei beinhaltet alle Scripte und eine Installationsanleitung: rsync-md5.zip

Rsync mit ssh

Um Daten auf/von einem entfernten Rechner zu kopieren, kann scp oder rsync über SSH verwendet werden.
Rsync hat den Vorteil, dass die zu kopierenden Daten komprimiert werden können.
Hier der Befehl mit den entsprechenden Parametern:

rsync -avze ssh <QUELLE> <USER>@<HOST>:<ZIEL>

Hier mit einem anderen ssh Port:

rsync -avze "ssh -p <PORT>" <QUELLE> <USER>@<HOST>:<ZIEL>

Ggf. kann man noch die Anmeldung am Remotehost automatisieren, siehe dazu Ssh Ohne Password.

Robocopy

Hier noch der Befehl für das rsync pendand in Windows namens „robocopy“

robocopy %1 %2 /MIR /Z /R:3 /W:1 /TBD /FFT /LOG+:K:\_Backup\__Backup\sync.log /TEE /XD *"System Volume Information" *"RECYCLER"