inosync: Echtzeit-Synchronisation bei Dateiänderung durch Rsync

synchronize_128

Was ist inosync?

Inotify wird dazu verwendet, Änderungen am Dateisystem in Echtzeit zu überwachen. Seit Linux 2.6.13 ist das Subsystem Bestandteil des Kernels. In allen gängen Debian-Derivaten, die mir unter die Finger kamen, ist dieses im Kernel aktiviert:

grep -i inotify /boot/config-`uname -r`

Output: CONFIG_INOTIFY_USER=y

Rsync dürfte den meisten Benutzern als mächtiges Synchronisations-Werkzeug bekannt sein. Dateien zwischen lokalen oder über das Netzwerk erreichbaren Pfaden, können nach allen Regeln der Kunst abgeglichen werden.

inosync kombiniert diese Fähigkeiten in einer Python-Anwendung.

Auch wenn die Anwendung wohl primär darauf ausgelegt ist, über das Netzwerk (SSH) erreichbare Pfade mit lokalen abzugleichen, möchte ich mir die Vorzüge ausschließlich lokal zunutze machen.

Aber lsyncd kann das doch alles schon? Ja, ich habe mich dennoch für inosync entschieden, da es meiner Meinung nach etwas leichtgewichtiger und sauberer geschrieben ist. Auch kann ich hier schnell einen Blick in den Code werfen und ihn abändern. Wie so oft ist es am Ende Geschmackssache.

Das Szenario in diesem Artikel:
Pfad, der auf Änderungen überwacht werden soll: /quell/pfad
Pfad, der eine Echzeit-Kopie enthält: /ziel/pfad

Wie verhält sich inosync?

inosync legt eine exakte Kopie des definierten Ordners am festgelegten Ort an.
Wichtig zu wissen: Änderungen am Ziel-Pfad werden NICHT in den Quell-Pfad übertragen. Lediglich Änderungen am Quell-Pfad werden übernommen.

Beispiele:
1. Datei „sample.file“ wird in /quell/pfad angelegt:
> Datei wird ebenfalls in /ziel/pfad angelegt.
2. Datei „sample.file“ wird in /ziel/pfad angelegt:
> Datei wird gelöscht, da in /quell/pfad nicht vorhanden.

Rsync wird von inosync (mindestens) mit dem Parameter „-ltrp –delete“ aufgerufen. Je nach Konfiguration kommen natürlich noch „–exlude“ oder „–bwlimit“ hinzu.
Daraus folgt:
– „-l“ kopiert symbolische Links
– „-t“ behält Zeiten der Quelldatei bei
– „-r“ kopiert Unterverzeichnisse
– „-p“ behält Rechte der Quelldatei bei
– „–delete“ löscht Dateien/Ordner, die im Quellverzeichnis nicht oder nicht mehr vorhanden sind

Wer genau weiss, was er tut, kann diese Argumente in der Datei „inosync.py“ in Zeile 52 ändern. Zusätzliche Parameter können in der Konfiguration via „extra“ definiert werden.

inosync installieren, konfigurieren und automatisch starten

Ich verwende eine Kopie des Git-Repositorys und verzichte auf die Paketmanager-Version.

Vorab wenige Abhängigkeiten installieren:

sudo apt-get install git python-pyinotify

Das Repository nach „~/build“ klonen:

mkdir ~/build
cd ~/build
git clone https://github.com/hollow/inosync

Eine Installations-Routine ist nicht notwendig, die Anwendung/das Script wird einfach kopiert:

sudo cp ~/build/inosync/inosync.py /usr/local/bin

Nun erstelle ich die für meinen Fall gewünschte Konfiguration:

sudo nano /etc/inosync_config.py

Der Inhalt:

wpaths = ["/quell/pfad"]
rpaths = ["/ziel/pfad"]
rnodes = [""]
logfile = "/var/log/inosync.log"

Für meine gewünschte, lokale Synchronisation, sind diese Einstellungen ausreichend. Für die Synchronisation auf ein entferntes System via SSH, ergeben sich weitere Parameter. Hierzu einfach in die README https://github.com/hollow/inosync/blob/master/README.rst schauen.
„rnodes“ ist zwar leer, wird aber trotzdem benötigt.

Als nächstes zum Init-Script, welches ich erstelle:

sudo nano /etc/init.d/inosync

Mit dem Inhalt:

#!/bin/bash
### BEGIN INIT INFO
# Provides: inosync
# Required-Start: $local_fs
# Required-Stop: $local_fs
# Should-Start:
# Should-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start and stop inosync
# Description: Starts inosync
### END INIT INFO

BINDIR=/usr/local/bin
LOGFILE=/var/log/inosync.log
CFGFILE=/etc/inosync_config.py
PIDFILE=/var/run/inosync.pid
inosync_start()
{
  echo "Starting inosync..."
  $BINDIR/inosync.py -d -c $CFGFILE
  PID=`ps aux | grep [i]nosync.py | awk '{print $2}'`
  echo $PID > $PIDFILE
  return 0;
}

inosync_stop()
{
  echo "Terminating inosync, rsync jobs may still be running..."
  kill -TERM `cat /var/run/inosync.pid`
  rm $PIDFILE
  return 0;
}

is_inosync_running()
{
  if [[ -f $PIDFILE ]]; then
    return 1
  else
    return 0
  fi
}

case "$1" in
  start)
    is_inosync_running
    if ! test $? -eq 0
    then
      echo "inosync is already loaded"
      exit 1
    fi
    inosync_start
    ;;
  stop)
    is_inosync_running
    if test $? -eq 0
    then
      echo "inosync is not running."
      exit 1
    fi
    inosync_stop
    ;;
  restart)
    echo "Restarting inosync ..."
    inosync_stop
    is_inosync_running
    while ! test $? -eq 0
    do
      sleep 2
      is_inosync_running
    done
    inosync_start
    ;;
  *)
    echo "Usage: inosync.sh {start|stop|restart}"
    exit 1
esac

exit 0

Abschließend noch auszuführen, um das Script als ausführbar zu markieren und beim System-Start auszuführen:

sudo chmod +x /etc/init.d/inosync
sudo update-rc.d inosync defaults

Der Dienst kann nun gestartet werden:

sudo service inosync start

Die Log-Datei befindet sich am im Init-Script angegebenen Ort „/var/log/inosync.log“.

Optionale Konfiguration

Wieder verweise ich auf die README des Tools. Nur kurz zusammengefasst:

Verzögerung für die Synchronisation, um zu häufige Synchronisation zu drosseln:

edelay = 10

Nur synchroniseren, wenn eine Datei erstellt, gelöscht oder verschoben wurde:

emask = [
       "IN_CREATE",
       "IN_DELETE",
       "IN_MOVED_FROM",
       "IN_MOVED_TO",
]

Die Geschwindigkeit auf 200 KB/s drosseln:

rspeed = 200

Extra-Optionen für den Rsync-Aufruf festlegen:

extra = "--eine-extra-option"

Mehrere Verzeichnisse synchroniseren. Achtung: „wpath“ und „rpath“ stehen 1:1 gegenüber. Zweiter Eintrag in „wpath“ bezieht sich immer auf zweiten Eintrag in „rpath“ usw.:

wpaths = ["/erste/verzeichnis/quelle", "/zweite/verzeichnis/quelle"]
rpaths = ["/erstes/verzeichnis/ziel", "/zweites/verzeichnis/ziel]

Eine Antwort auf “inosync: Echtzeit-Synchronisation bei Dateiänderung durch Rsync

  1. Chris

    Ohne jetzt in den code zu schauen … klingt erstmal nur nach einem script, welches den rsync bedient und regelmäßig ausgeführt wird, um daten zu synchronisieren, oder?
    Woran liegt dann der Vorteil gegenüber einem Cron mit dem eigentlichen rsync Befehl?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.