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