Vai al contenuto
⚠️ Warning: Extraordinary electrical maintenance – Scheduled shutdown of the Cloud garr-ct1 region (Catania) from 22 to 29 July 2025. For more details, please read the maintenance notice.

Configurare la sincronizzazione file live tra host remoti

La sincronizzazione tra host remoti è ottenuta più efficacemente usando programmi come rsync su SSH, possibilmente sotto crontab.

Discutiamo qui un paio di modi alternativi per live file-sync (sincronizzazione file live), ovvero una sincronizzazione continua in cui un trasferimento viene avviato ogni volta che un file cambia alla sorgente.

Lsyncd

Questo è disponibile a questo URL. Nelle parole degli sviluppatori, è più adatto per la sincronizzazione (unidirezionale, mio commento) tra un albero di directory locale con basso profilo di cambiamenti attesi e un mirror remoto. Per ulteriori informazioni consultare la pagina wiki.

Lsyncd osserva un filesystem per i cambiamenti (via Inotify o fsevents), attende alcuni secondi per aggregare i cambiamenti e infine attiva la sincronizzazione (via rsync+SSH).

Prima di installarlo:

  • Crea chiave SSH:
  ssh-keygen -o
  • Scambia le chiavi tra gli host. Su hostB aggiungi il contenuto di hostA:/root/.ssh/id_rsa.pub a hostB:/root/.ssh/authorized_keys, e viceversa.

  • Prova a connetterti da hostA a hostB e viceversa: assicurati che i Security Group lo consentano.

Procedi con l'installazione:

  • il pacchetto dovrebbe essere già disponibile, installazione rapida con:
  apt-get install -y lsyncd # installerà le dipendenze lua5.X e liblua5.X
  • oppure puoi ricompilare lsyncd:
  cd <some_base_dir>
  git clone https://github.com/axkibe/lsyncd
  # installa le dipendenze come da file INSTALL, ad esempio
  apt-get install -y gcc g++ cmake make binutils rsync
  # Leggi il file INSTALL e compila/installa, ad esempio
  mkdir build
  cd build
  cmake ..
  make
  sudo make install

Configura:

  • guarda in /etc/init.d/lsyncd e controlla qual è il nome atteso per il file di configurazione, nel mio caso (Ubuntu 16.04) era /etc/lsyncd/lsyncd.conf.lua

  • crea il tuo file di configurazione:

  mkdir /etc/lsyncd
  mkdir /var/log/lsyncd/
  touch /var/log/lsyncd/lsyncd.{log,status}
  cp -p /usr/share/doc/lsyncd/examples/lrsyncssh.lua /etc/lsyncd/lsyncd.conf.lua
  • modifica il file di configurazione come desiderato, nel mio caso il risultato era (per favore controlla l'opzione delete nel manuale):
  settings {
    logfile = "/var/log/lsyncd/lsyncd.log",
    statusFile = "/var/log/lsyncd/lsyncd.status",
  }

  sync {
    default.rsyncssh,
    source = "/home/diskVdb/dirPa",
    host = "<remoteHostIP>",
    targetdir = "/home/diskVdb/dirPa",
    delete = "running",
    rsync = {
      archive = true,
      compress = false,
      update = true,
      whole_file = false
    },
    delay = 5,
  }
  • riavvia il programma:
  systemctl enable lsyncd
  systemctl restart lsyncd

Eseguire lsyncd come mirroring bidirezionale può causare race conditions, e il programma potrebbe essere confuso dalla comparsa/scomparsa di file temporanei. A seconda del tuo caso d'uso specifico, potresti considerare:

  • alla luce di questo messaggio dell'autore, imposta temp_dir su un percorso fuori dall'albero di sincronizzazione,
  • usa exclude o excludeFrom nella sezione sync del file di configurazione, in modo che i nomi dei file che corrispondono a specifici pattern non siano considerati per il mirroring.

Mirror

Mirror è disponibile a questo URL. Le caratteristiche salienti di questa applicazione sono che è bidirezionale e che è attivata da eventi del filesystem (Inotify).

Possibili svantaggi sono che è progettata per sincronizzare una singola directory (sebbene tu possa eseguire più istanze del programma per gestire più directory), che la proprietà dei file non è preservata (i file sono posseduti dall'utente/gruppo che esegue mirror) e che la sincronizzazione non sfrutta la crittografia TLS: quest'ultimo inconveniente può essere superato eseguendo mirror all'interno di un tunnel SSH, vedi la documentazione per ulteriori informazioni.

Installazione:

  • installa Java 8 con:
          apt install openjdk-8-jre
  • installa watchman secondo le istruzioni, per favore leggile attentamente. Al momento della scrittura il set minimo di passaggi (ma di nuovo, controlla per configurazioni più sofisticate nella pagina web sopra) devi:
          apt-get install -y gcc g++ cmake make binutils
          apt-get install -y libssl-dev autoconf automake libtool python-dev pkg-config
          mkdir -p <someBaseDir>
          cd <someBaseDir>
          git clone https://github.com/facebook/watchman.git
          cd watchman
          git checkout v4.9.0  # the latest stable release
          ./autogen.sh
          ./configure
          make
          sudo make install
  • scarica gli eseguibili di mirror in qualche directory nel tuo path:
          cd /usr/local/bin
          wget http://repo.joist.ws/mirror-all.jar .
          wget http://repo.joist.ws/mirror .
          chmod u+x mirror
  • regola i limiti di inotify (vedi anche questa pagina):
          echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
          echo fs.inotify.max_queued_events=50000 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
  • eleggi uno dei tuoi host come server e avvia mirror:
          cd /usr/local/bin/
          ./mirror server
  • sull'altro host, esegui il client così:
          cd /usr/local/bin/
          ./mirror client -h remote-host -l /the/source/dir/ -r /the/remote/dir/