Backup su NAS con rsync

La gestione del backup, è un argomento poco gradito a noi programmatori, lo viviamo come un’attività noiosa, che non ci compete.

Sicuramente i sorgenti e documenti staranno al sicuro sul vostro server GIT aziendale e sulle directory condivise del fileserver, sistemi ridondati e dotati di backup.

Però gli incidenti capitano.

Anche solo dover ripristinare un ambiente di lavoro, gli strumenti di sviluppo, la propria home, può essere una discreta scocciatura (per usare un eufemismo).

rsync

Da qui la decisione di realizzare un semplice sistema di backup. Lo strumento che ho ritenuto più adatto è rsync, il noto tool unix a riga di comando per la copia e sincronizzazione di directory.

La destinazione del backup è il mio NAS, un Synology DS920+.

In uno dei miei primi tentativi ho utilizzato una connessione ssh. Soluzione piuttosto lenta, anche usando arcfour256, il ssh-cipher più leggero.

Poi ho scelto un’altro approccio. Utilizzare cifs per montare una directory condivisa del NAS ed eseguire rsync in locale, evitando del tutto ssh.

sudo apt install cifs-utils

Supponiamo di avere un utente synology sia sul nostro pc, che sul NAS.
Per automatizzare la fase di montaggio/smontaggio della directory condivisa, ho aggiunto (con visudo) in /etc/sudoers.d un file con questo contenuto:

synology ALL=(ALL) NOPASSWD: /bin/mount
synology ALL=(ALL) NOPASSWD: /bin/umount

La directory locale /home/synology/Shares/home, su cui sarà montata la directory remota, se non esiste, va creata. Questo è lo script di backup:

#!/bin/bash

#
# Backup home su NAS
#
set -e

NAS=192.168.1.20
HOME_DIR="/home/synology"
HOME_SHARE="/home/synology/Shares"
NAS_HOME_SHARE=${HOME_SHARE}'/home'
NAS_BACK_DIR=${NAS_HOME_SHARE}'/BACKUP_DELL'

uid="$(id -u)"
gid="$(id -g)"

echo "Mount shares .."
if grep -qs "${HOME_SHARE}" /proc/mounts; then
       echo "Already mounted."
else
	sudo mount -t cifs -o mfsymlinks,credentials=/home/synology/.cifs_data,uid=${uid},gid=${gid} //${NAS}/home ${NAS_HOME_SHARE}
	echo "Shares mounted on ${NAS_HOME_SHARE}"
fi

echo -e "Syncing ${HOME_DIR} with ${NAS_BACK_DIR}..\n"

# Sincronizza la home con il NAS
rsync -avhuW --exclude-from=$(dirname $0)/exclude.list --delete --delete-excluded ${HOME_DIR}/ ${NAS_BACK_DIR}

echo "Umount shares.."
sudo umount $NAS_HOME_SHARE

L’opzione di mount mfsymlinks, ci consente di poter generare link simbolici. L’uso di uid e gid fa in modo che i files montati abbiano i diritti dell’utente corrente.
Il file .cifs_data contiene le credenziali per accedere alla directory condivisa, per esempio:

user=synology
password=XXXXXXXXXXX
domain=ILDOMINIO

Per quanto riguarda rsync, oltre alle opzioni -avhuW (piuttosto standard), ho usato :

  • –delete, cancella i files estranei nella directory destinazione
  • –delete-excluded, cancella i files esclusi nella directory destinazione
  • –exclude-from, legge un file che contiene una lista di pattern di files o directory da escludere, per esempio:
- .cache/*
- .m2/repository/*
- Shares/*
- tmp/*
- Downloads/*

Sebbene la precedente soluzione sia interessante, è frutto di limitazioni passate.

Ad oggi esiste una soluzione con migliori prestazioni. Dobbiamo però configurare un server rsyncd sul NAS.

Questo meccanismo consente l’uso di una comunicazione diretta e non criptata, quindi più veloce. Non è necessario che le cartelle siano condivise con NFS, si può utilizzare il più comune SMB (come per la soluzione precedente).

Utilizzando Synology DSM 7.0 è sufficiente aprire il pannello di controllo, scegliere “Servizi file”, selezionare “rsync”, spuntare “Abilita servizio rsync” e “Abilita account rsync”.
Premendo il pulsante “Modifica account rsync”, potremo aggiungere ed abilitare utenti al servizio rsync (le password possono non coincidere con quelle degli utenti DSM).

Successivamente, da pannello di controllo, si deve scegliere “Privilegi applicazione” e modificare i permessi per l’uso di rsync, selezionando l’utente desiderato.

A questo punto lo script di backup si può ridurre al minimo indispensabile:

#!/bin/bash

#
# Backup home su NAS
#
set -e

NAS=192.168.1.20
HOME_DIR="/home/synology"
NAS_BACK_DIR="homes/synology/BACKUP_DELL"

echo -e "Syncing ${HOME_DIR} with ${NAS_BACK_DIR}..\n"

# Sincronizza la home con il NAS
rsync -avhuW --password-file=/home/synology/.rsync_pass --exclude-from=$(dirname $0)/exclude.list --delete --delete-excluded ${HOME_DIR}/ synology@${NAS}::${NAS_BACK_DIR}

Come è intuibile il file .rsync_pass contiene la password dell’utente synology del servizio rsyncd che abbiamo attivato sul NAS.

Consiglio di limitarne i diritti d’accesso con:

chmod 600 .rsync_pass
Subscribe
Notificami

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.

0 Commenti
Inline Feedbacks
View all comments