Un Semplice Backup con Rsync

Vediamo come fare

 

Qui è stato realizzato come esempio un piccolo script per eseguire dei backup guidati.

 

Quale server scegliere per il backup esterno

Dato che l’impegno di delle risorse hardware è minimo, le uniche risorse che dobbiamo considerare sono la capienza dei dischi e la velicità di connessione, quindi se volessimo acquistare un server dedicato con funzioni di backup valutiamo la connessione con esso e lo spazio a disposizione. Per farvi un’idea andate a vedere il sito di aruba nella sezione server dedicati. Nel nostro esempio andrea ad eseguire un backup dei dati in unserver della stessa rete.

 

Backup con Rsync su un server nella stessa rete

Verifichiamo la presenza del programma rsync, come? Facile aprire un terminale e dare il comando rsync e avremo il seguente output

 

In caso di errore dobbiamo installarlo con le utility apt o yum

Su Debian e Ubuntu:

SERVERTEST#apt-get install rsync

Su RedHat, CentOS, Fedora:

SERVERTEST#yum install rsync

 

Generare la chiave SSH

Il primo passo è quello di abilitare l’autenticazione con chiave rsa sul server destinazione:

SERVERTEST#vi /etc/ssh/sshd_config

e assicurarsi che siano presenti le tre linee seguenti:

RSAAuthentication yes

PubkeyAuthentication yes

AuthorizedKeysFile .ssh/authorized_keys

se è ok procediamo altrimenti modificare le righe sopra citate.

Spostiamoci sul server sorgente e creiamo la chiave rsa (consiglio, autenticatevi come root per non avere problemi di permessi)

Ora possiamo generare la chiave con i seguente comando:

SERVERTEST#ssh-keygen -t rsa

copiamo la chiave nel server che ospiterà i backup con il comando scp che serve a fare copie tra server:

SERVERTEST#scp /root/.ssh/id_rsa.pub root@192.168.0.2:/root/.ssh

A questo punto non rimane che creare uno script in modo da eseguire il backup automaticamente:

SERVERTEST#vi backup.sh

copiare quanto segue:

 

#!/bin/bash

# definisco le variabile

DAY=$(/bin/date +%d)
DAYSETTIMANA=$(/bin/date +%u)

if [ $DAYSETTIMANA -eq 6 ]; then
echo "GIORNO SABATO $DAY ESEGUO BACKUP CON SINCRONIA DATI"

sleep 2

rsync -e ssh --delete -axvzKHS /dati/* 192.168.0.2:/dati/ > /var/log/rsyncbackupsincronia_$(date +\%Y\%m\%d).txt

else

sleep 2

echo "GIORNO $DAY ESEGUO BACKUP INCREMENTALE"

rsync -e ssh -axvzKHS /dati/* 192.168.0.2:/dati/ > /var/log/rsyncbackup_$(date +\%Y\%m\%d).txt

fi

per salvare il file shift + zz oppure prendilo qui <<<<<<<

 

Backup con Rsync su una cartella condivisa della rete

Il comando rsync lo si può utilizare per sincronizzare il nostro server con un qualsiasi dispositivo di rete che abbia una cartella condivisa, vediamo come:

 

Ipotizziamo che abbiamo un NAS con una cartella condivisa sulla rete chiamata BACKUP-DATI, e volessimo salvare i dati del nostro file-server in quella cartella, dobbiamo crare uno script come segue:

SERVERTEST#vi backup-su-nas.sh

#!/bin/sh
DAY=$(/bin/date +%u)
echo "MI ASSICURO CHE ESISTA LA CARTELLA COME PUNTO DI MOUNT /backup SE non esiste lo creo";
if [ ! -d /backup ]; then
mkdir /backup 2>/dev/null
fi

echo "VERIFICO SE //192.168.0.2/backup-DATI NON MONTATA CASO CONTRARIO MONTO VOLUME DI RETE";
if mount | grep //192.168.0.2/backup-DATI > /dev/null; then
echo "VOLUME MONTATO"
else
/bin/mount -t cifs -osec=ntlmv2,username=administrator,password=Pino //192.168.0.2/backup-DATI /backup
fi
echo "VERIFICO mount TRAMITE PRESENZA DELLA CARTELLA /backup/backup-DATI"

if [ ! -d /backup/backup-DATI ]; then
echo "MOUNT ERRATO, BACKUP ANNULLATO";
exit

else
if [ $DAY -eq 6 ]; then
echo "ESEGUO BACKUP con SINCRONIA se SABATO"
/usr/bin/rsync -va --delete /dati/ /backup/Dati --log-file=/backup/log/backupsincronia_$(date +\%Y\%m\%d).txt
else
echo "ESEGUO BACKUP INCREMENTALE"
/usr/bin/rsync -va /dati/ /backup/Dati --log-file=/backup/log/backup_$(date +\%Y\%m\%d).txt
fi
if mount | grep //192.168.0.2/backup-DATI > /dev/null; then
echo "SMONTO VOLUME DI RETE"
/bin/umount /backup
fi
fi

if mount | grep //192.168.0.2/backup-DATI > /dev/null; then
echo "SMONTO IL VOLUME BACKUP"
/bin/umount /backup
fi

per salvare il file shift + zz oppure prendilo qui <<<<<<<

 

Ora bisogna schedulare il Backup

Per schedulare il backup bisogna editare i crontab dei job:

SERVERTEST#crontab -e

insterire la seguente riga:

00 21 * * * /root/backupnas.sh

per salvare il file shift + zz

Il backup sarà eseguito tutti i giorni alle 21.

 

Tutte le soluzioni per RSYNC

 

usare rsync per una sincronizzazione in locale

Come detto, grazie a rsync è possibile sincronizzare file e cartelle in modo facile e sicuro. Supponendo di voler sincronizzare due cartelle in locale (ad esempio per creare un backup o una copia "esportabile" su una chiavetta USB) potremmo usare una sintassi del genere:

rsync -avz /path/to/source /path/to/destination

Vediamo nel dettaglio le opzioni utilizzate:

  • a => modalità "archivio" (copia ricorsivamente tutti i file, preservando permessi, timestamp, link simbolici, owner e gruppi);
  • v => modalità "verbose", offre un output a video circa il risultato dell'elaborazione;
  • z => comprime i dati usando l'algoritmo gzip;

 

Non sovrascrivere i file modificati di recente

Si faccia attenzione: utilizzando la sintassi vista sopra, rsync andrà ad allineare il contenuto del path di destinazione con quello del path sorgente! Se nella cartella di destinazione si hanno dei file più recenti rispetto alla cartella sorgente e li si vuole preservare si dovrà aggiungere il comando -u, in caso contrario, infatti, la cartella di destinazione viene allineata con la sorgente a prescindere che i files in essa contenuti siano più recenti o meno.

rsync -auvz /path/to/source /path/to/destination

 

Sincronizzare un solo file

Volendo è possibile utilizzare rsync per effettuare il backup di un singolo file specificandone il nome in qualità di sorgente:

rsync -avz /path/to/source/filename /path/to/destination

Sincronizzare solo la struttura della directory

E' possibile decidere di sincronizzare solo la struttura della directory sorgente nella destinazione remota. Per farlo useremo l'opzione -d in questo modo:

rsync -avd /path/to/source/filename /path/to/destination

 

Eliminare i file non presenti nella posizione sorgente

Supponiamo di avere dei files nella cartella di destinazione che non sono presenti nella cartella sorgente. Come si comporta rsync in questa situazione? Normalmente ignora questi file e li lascia dove sono. Se, tuttavia, preferiamo eliminarli possiamo utilizzarel'opzione --delete in questo modo:

rsync -avd --delete /path/to/source/filename /path/to/destination

 

Sincronizzare solo i file già presenti nella cartella di destinazione

E' anche possibile dire ad rsync di sincronizzare esclusivamente i files già presenti nella folder di destinazione evitando cioè di crearne di nuovi qualora nella sorgente siano presenti files non rinvenibili nella directory target. Per una simile eventualità si utilizzerà l'opzione --existing in questo modo:

rsync -avd --existing /path/to/source/filename /path/to/destination

 

Usare rsync per una sincronizzazione da remoto

Come detto una delle principali caratteristiche di rsync è la possibilità di eseguiretrasferimenti cifrati tramite protocollo ssh grazie al quale è possibile gestire sincronizzazioni files e cartelle di due sistemi connessi alla Rete.

La grande potenzialità di Rsync over SSH consiste, appunto, in questo: nella possibilità di eseguire sincronizzazioni tra macchine remote in modo sicuro ed efficente.

Una simile procedura si rivela molto utile, ad esempio, per eseguire dei backup su server remoti piuttosto che per trasferire grandi moli di dati in vista della migrazione di un sito web da un server ad un altro.

Vediamo di seguito la sintassi per importare dati da un server remoto:

rsync -auvz user@host:/path/to/source /path/to/destination

Viceversa per esportare dati da locale verso un server remoto:

rsync -auvz /path/to/source user@host:/path/to/destination

Come potete vedere le opzioni sono le medesime viste per la sincro in locale, l'unica differenza tra le sintassi riguarda l'indicazione di un'accoppiata user@host a precedere la cartella sorgente o di destinazione.

E' evidente che una volta lanciato il comando il sistema remoto richiederà l'inserimento della password prima di procedere all'esecuzione dei compiti impostati.

Si noti che con questa sintassi rsync utilizza una connessione SSH agganciandosi alla porta di default (TCP 22); se invece il server remoto utilizzasse una porta diversa da quella di default sarà necessario specificare gli argomenti da passare ad SSH direttamente nel flag --rsh in questo modo:

rsync -auvz --rsh="ssh -p PORTA" user@host:/path/to/source /path/to/destination

Dove PORTA, ovviamente, può essere qualsiasi porta dalla quale ci sia un server ssh in ascolto.

 

Vedere lo stato di avanzamento del download/upload

Per vedere lo stato di avanzamento della sincro è sufficiente aggiungere il flag --progressin questo modo:

rsync -auvz --progress user@host:/path/to/source /path/to/destination

 

Escludere dalla sincro i file molto grandi

E' possibile impostare un filtro sulle dimensioni dei file in modo da escludere dalla sincronizzazione, ad esempio, i file troppo grandi o troppo piccoli. Per farlo si utilizzano i flag--max-size e --min-size in questo modo:

rsync -auvz --max-size='500K' user@host:/path/to/source /path/to/destination