Mit „rsync“ können große Datenmengen an ein beliebiges Ziel synchronisiert werden.
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“.
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.
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.
#!/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;
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 |
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
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.
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"