Sauvegarde de données avec Unison

Karlesnine

Ce tutoriel vous accompagnera dans la mise en place de l'outil Unison, afin d'effectuer des sauvegardes entre machines Linux, mais aussi à partir de clients Windows.

Nous verrons de plus différents modes de connexion pour transférer les données.

- Titre : Sauvegarde de données avec Unison

- Auteur : Karlesnine

- Parution : 22 novembre 2006

- Mise à jour : 5 avril 2020

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2013 Karlesnine. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- II. Installation sur différentes plates-formes

- III. Première utilisation

- IV. Méthode : de disque à disque

- IV-A. Sous Linux avec NFS

- IV-B. Sous Windows

- V. Sous Linux via SSH

- V-A. Quels avantages ?

- V-B. Serveur de fichiers

- V-C. Serveur client

- V-C-1. Fichier de configuration Unison

- V-C-2. Exemple d'un shell script dee backup

- V-C-3. Exemple d'un shell script aix de backup

- VI. Remerciements et autres

I - Introduction

À la recherche d'une solution souple et adaptable pour effectuer des sauvegardes de données de stations de travail et de serveurs sur un gros serveur de fichiers distant avec une grappe raid6 de 1,2 To (8 disques), la logique me fit lancer un coup d'apt-get lorsque je tombai sur Unison Le man, Unison me donna alors cette brève description : « a file-synchronization tool for Unix and Windows » Toutes mes informations sont sur le site web d'Unison : cliquez ici. Il y a entre autres l'User Manual and Reference qu'il est indispensable de lire. Il débute par quelques exercices faciles pour comprendre le principe de base. Faites vos tests dans un coin pour mieux appréhender l'outil.

II - Installation sur différentes plates-formes

Installation Linux Debian

L'installation sous Debian est toujours aussi facile :

apt-get install Unison

Installation sous Windows XP

Il y a différents binaires disponibles en téléchargement sur le site d'Unison, mais je recommande de prendre la version stable en ligne de commande, facile à installer et à utiliser en batch avec l'ordonnateur de tâches. Comme cette version porte le nom d'Unison.win32-textui.exe je vous recommande de le renommer en Unison.exe et de le placer dans c:/windows/system32/ afin qu'il soit disponible via les variables d'environnement (path).

Installation sous Aix

Unison est disponible sous IBM Aix également, vous pouvez le télécharger sur la page bullfreeware.com. Les instructions d'installation via smitty sont disponibles sur le même site.

III - Première utilisation

Simple comme bonjour si vous avez au moins regardé l'User Manual and Reference qu'il est indispensable de lire.

Unison dir1 dir2

Par défaut Unison travaille en mode interactif. Il va donc préparer une liste des fichiers et répertoires présents dans dir1 avec leurs attributs (date, taille), puis il vous demandera pour chacun des différences avec dir2, la marche à suivre.

Par exemple pour recopier le fichier file-exemple de dir1 a dir2 voici le dialogue :

/dir1          /dir2

new file-exemple  ---->            /  [f] f

La commande f pour flush indique de procéder.

À la suite de cela il vous demande de valider la globalité de la synchronisation, répondez-y.

Proceed with propagating updates? []

Attention à l'ordre de présentation des répertoires à synchroniser ! Présenter dir2 avant dir1 implique que c'est le répertoire dir2 qui est le référent. Si celui-ci est vide, Unison supprimera tout de dir1.

Regardez bien avant de valider.

/dir2          /dir1

---->   delete file-exemple          /  [f] f

IV - Méthode : de disque à disque

Le plus facile reste encore de faire une synchronisation de disque à disque sur une même machine. Il est possible de le faire au travers d'un montage NFS également.

Voici deux exemples de scripts à placer dans la crontab ou dans l'ordonnateur de tâches.

IV-A - Sous Linux avec NFS

#!/bin/sh

/usr/bin/Unison /var/lib -path=mysql /mnt/serveur/host/ -batch -force /var/lib

/usr/bin/Unison /var -path=www  /mnt/serveur/host/ -batch

Ici en deux lignes je sauvegarde :

- mes bases de données présentes dans /var/lib/mysql ;

- mon site web dans /var/lib/www.

J'ai pris soin de monter un partage NFS du serveur dans /mnt/serveur. Pour cela, ajoutez la ligne suivante à /etc/fstab et lancez la commande mount -a : serveur.karlesnine.com:/partageNFS /mnt/serveur NFS defaults 0 0

Les options utilisées :

- -patch=mysql pour ne prendre en compte qu'un répertoire ou fichier dans un dossier racine pouvant en présenter plusieurs comme dans le cas de /var/lib ;

- -force /var/lib oblige Unison à synchroniser dans un seul sens. ici ne prenant en compte que les modifications locales force /var/lib et les imposant sur le partage NFS ;

- -batch mode batch, toutes les modifications sont validées par défaut il n'y a donc de confirmation à donner.

IV-B - Sous Windows

Sous Windows, il est possible de faire de même via un partage de fichier smb / samba préalablement activé. Je ne détaille pas ici cette manipulation propre a Windows.

>Unison "C:\Documents and Settings\Nat\Bureau" "Z:\Nat\Bureau" -batch -force "C:\Documents and Settings\Nat\Bureau"

>Unison "C:\Documents and Settings\Nat\Mes documents" "Z:\Nat\Mes documents" -batch -force

"C:\Documents and Settings\Nat\Mes documents"

>Unison "C:\Documents and Settings\Nat\Application Data\Thunderbird" "Z:\Nat\Thunderbird" -batch -force

"C:\Documents and Settings\Nat\Application Data\Thunderbird"

Sous Windows la syntaxe reste la même, seule change la présentation des chemins de répertoire. Cependant, faites attention aux doubles quotes.

V - Sous Linux via SSH

V-A - Quels avantages ?

Sauvegarder via une connexion SSH offre l'avantage de ne pas utiliser de NFS. On évite donc l'administration de montages non sécurisés par l'utilisation d'un tunnel crypté avec identification par clef.

Pas de NFS pour éviter :

- les accès root sur un serveur de fichiers distant ;

- les problèmes de montage ;

- la simple indication donnée par la présence ou le parcours d'une arborescence ;

- pallier la faible sécurité de NFS V3.

SSH pour :

- avoir des connexions ponctuelles, automatisées et masquées ;

- limiter les droits de connexion ;

- crypter les tunnels de connexion ;

- avoir une compression minimum du transfert de données ;

- pouvoir révoquer les droits de connexion de façon centralisée.

Unison pour :

- la synchronisation bidirectionnelle ;

- le filtrage sur les noms de fichiers ;

- l'intégration avec SSH.

V-B - Serveur de fichiers

Sur le serveur de fichiers, copiez la clef SSH publique créée spécialement pour cette connexion de backup en ajoutant l'option no-pty dans le fichier $HOME/.SSH/authorized_keys du compte choisi pour recevoir la connexion. Ceci, pour bloquer l'ouverture d'un shell (apportant un petit plus de sécurité) comme dans cet exemple :

no-pty SSH-dss AAAAB3NzaC...../ /...qxX/27ZZ9X5vAVA== backup

Attention à bien choisir le compte utilisé et à configurer les droits d'écriture sur l'arborescence de destination choisie. Dans mon architecture, j'ai pris le compte admin qui est qu'un simple compte utilisateur lamba. Ce fichier de configuration apporte le filtrage sur différents noms de fichiers qu'il est trop difficile à sauvegarder ou inutiles.

- ignore = Name pour exclure de la synchronisation des fichiers trop souvent modifiés ou volumineux ;

- ignore = Path .Unison pour le pas synchroniser le répertoire d'Unison présent dans le compte utilisateur qui lance la synchronisation. En effet Unison stocke ici ses tables de mise à jour qu'il modifie durant chaque synchronisation ;

- Logfile Pour que Unison sauvegarde les logs ailleurs que dans l'environnement utilisateur.

V-C - Serveur client

Ajouter dans le répertoire .SSH du compte servant à faire le backup, ici root pour parcourir l'arborescence quel que soit le propriétaire des répertoires, le fichier de configuration particulier nommé config suivant :

- Host backup ;

- Compression yes ;

- ForwardAgent no ;

- Cipher blowfish ;

- User admin ;

- IdentityFile ~/.SSH/backup ;

- HostName serveur.karlesnine.com.

Ce fichier apporte l'utilisation d'un alias backup pour un ensemble de paramètres. En voici l'explication dans l'ordre :

- la compression ;

- le blocage du forward de clé ;

- une cryptographie légère blowfish ;

- le compte utilisateur cible ;

- la définition de la clé ;

- le serveur de destination ;

- etc.

Je ne peux que vous conseiller de vous reporter au site officiel OpenSSH pour plus de documentation.

V-C-1 - Fichier de configuration Unison

La configuration d'Unison se fait avec un fichier default.prf placé dans le répertoire $HOME/.Unison du compte servant à faire le backup.

# Unison preferences file

ignore = Name {core,*.pyc,*.dat,*.xcu, *.dvi, *.log, *.pid, *.out, Unison.log}

ignore = Path .Unison

ignore = Name toto

ignore = Name tutu

ignore = Name tmp

ignore = Name temp

logfile = /var/log/Unison.log

V-C-2 - Exemple d'un shell script dee backup

#!/bin/sh

#

# Backup avec Unison

# http://www.cis.upenn.edu/~bcpierce/Unison/

# Charles-Christian CROIX

# 15/01/2005

# 15/07/2005

Unison="/usr/bin/Unison"

MYSQLDUMP="/usr/bin/mysqldump"

VARSQLDUMP="/var/lib/mysql/dump"

$Unison /etc SSH://backup//home/backupbyhost/$HOSTNAME/etc  -silent -backups -maxbackups 3 -batch -force /etc

$Unison /root SSH://backup//home/backupbyhost/$HOSTNAME/root -silent -backups -maxbackups 3  -batch -force /root

$MYSQLDUMP -u root  --all-databases | gzip > /var/lib/mysql/dump/FullDatabasesBackup_$HOSTNAME.sql.gz

$Unison /var/lib/mysql/dump SSH://backup//home/backupbyhost/$HOSTNAME/var/lib/mysql/dump/ -silent -batch -force $VARSQLDUMP

cat /var/log/Unison.log | mail admin@webank.fr -s "[$HOSTNAME] Backup"

cat /dev/null > /var/log/Unison.log

Option d'Unison :

- SSH ://backup//home/backupbyhost/$HOSTNAME/etc dans cette ligne nous voyons l'alias SSH backup utilisé ;

- -silent pour éviter que le cron utilisé pour lancer ce script ne vous spamme ;

- -batch pour éviter l'interactivité ;

- -force pour forcer la mise à jour du serveur de backup même si celui-ci semble être plus récent ;

- -backups pour demander de sauvegarder la version précédente d'un fichier devant être synchronisé avant son écrasement. Sur le serveur distant un fichier test.txt sera ainsi recopié en .test.txt.0.Unison.bak avant que la nouvelle version de test.txt ne soit écrite ;

- -maxbackups 3 Nombres maximum de sauvegarde avec l'option -backups. Ici trois versions comme dans cet exemple : .test.txt.0.Unison.bak .test.txt.1.Unison.bak .test.txt.2.Unison.bak ;

- etc.

Concernant l'utilisation de mysqldump

Dans cet exemple j'ai fait le choix d'extraire l'intégralité des informations des bases de données (data et structure) dans un fichier .sql que le gzip par la suite. C'est ce fichier qui est placé dans un répertoire devant être synchronisé. Plus facilement il est possible de sauvegarder l'arborescence de mysql en entier afin de disposer des fichiers base par base de données et table par table. Attention de stopper mysql si besoin pour accéder au fichier en dehors de toute écriture.

V-C-3 - Exemple d'un shell script aix de backup

Voici le même script que précédemment, mais adapté a l'environnement Aix qui ne comporte pas les mêmes variables d'environnement ($HOSTNAME) ni les mêmes emplacements pour Unison. En outre la commande Mail ne répond pas à la même syntaxe.

#!/bin/sh

#

# Backup avec Unison

# http://www.cis.upenn.edu/~bcpierce/Unison/

# Charles-Christian CROIX

# 15/01/2005

# 15/07/2005

# 04/08/2005 Aix version

HOSTNAME="aix3"

Unison="/usr/local/bin/Unison"

cat /dev/null > /root/.Unison/Unison.log

date > /root/.Unison/Unison.log

for I in `ls -l /home | grep ^d | grep -v lost+found | awk '{print $9}'`;

do /usr/local/bin/Unison /home/$I  SSH://backup//home/backupbyhost/$HOSTNAME/home/$I -silent -backups -maxbackups 2  -batch -force /home/$I;

done;

$Unison /etc SSH://backup//home/backupbyhost/$HOSTNAME/etc  -silent -backups -maxbackups 3 -batch -force /etc

$Unison /root SSH://backup//home/backupbyhost/$HOSTNAME/root -silent -backups -maxbackups 3 -batch -force /root

mail -s "[Aix3] Backup" admin@mon_mail.fr < /root/.Unison/Unison.log

La boucle for en shell est destinée à obtenir la liste des seuls répertoires présents dans /home (donc à l'exclusion des fichiers) et à filtrer ceux-ci par un grep -V pattern en fonction de l'environnement particulier de chaque machine aix, puis pour chaque élément de cette liste, réaliser une synchronisation.

VI - Remerciements et autres

Adapté par Katyucha.

Merci à Pharaonix pour sa relecture.