Comment sauvegarder des répertoires volumineux avec Unison sur Ubuntu 16.04

L'auteur a sélectionné lesFree and Open Source Fund pour recevoir un don dans le cadre du programmeWrite for DOnations.

introduction

Unison est un outil de synchronisation de fichiers open source. Il est très efficace pour la sauvegarde de corpus de données volumineux pour lesquels seuls quelques fichiers ont été ajoutés ou mis à jour. Cette situation se produit, par exemple, dans un serveur de fichiers d'entrepriseSamba ou un serveur de messagerie.

La majorité des fichiers de ces serveurs resteront identiques tandis qu'un petit nombre sera ajouté ou modifié chaque jour. Unison est capable de découvrir et de sauvegarder ces nouveaux fichiers extrêmement rapidement, même lorsqu'il existe des millions de fichiers et des téraoctets de données. Dans ces situations, les outils traditionnels tels quersync peuvent prendre plus de temps pour effectuer la même opération de sauvegarde.

Dans ce didacticiel, vous allez installer et configurer Unison sur une paire de serveurs et l’utiliser pour sauvegarder un répertoire. Vous allez également configurer Unison pour utiliser SSH comme protocole de communication sécurisé et créer uncron job pour exécuter régulièrement Unison.

Conditions préalables

Avant de commencer ce guide, vous aurez besoin des éléments suivants:

Ce guide utilisera deux serveurs:

  • Serveurprimary: Le serveur qui héberge les données que vous allez sauvegarder.

  • Serveurbackup: serveur qui hébergera les données sauvegardées.

[[step-1 -—- creating-additional-non-root-users]] == Étape 1 - Création d'utilisateurs non root supplémentaires

Le tutoriel deInitial Server Setup with Ubuntu 16.04 vous a guidé dans la création d'un utilisateur sudo non root appelésammy sur les serveursprimary etbackup. Dans cette étape, vous allez créer deux nouveaux utilisateurs, un sur le serveurprimary et un sur le serveurbackup. Cela évite toute confusion lorsque vous travaillez dans le guide, et un autre utilisateur sudo non root est requis sur le serveurbackup si la configuration de sécurité SSH est activée à la fin du guide.

Vous devrez vous connecter à la fois au serveurprimary et au serveurbackup en tant qu'utilisateursammy via SSH dans deux fenêtres de terminal. Les deux commandes SSH suivantes vous connecteront à ces serveurs:

ssh sammy@primary_server_ip
ssh sammy@backup_server_ip

Tout d'abord, sur le serveurprimary, créez un nouvel utilisateur appeléprimary_user avec cette commande:

sudo adduser primary_user

Donnez-leur ensuite les droits d'accès desudo:

sudo usermod -aG sudo primary_user

Enfin, passez au compteprimary_user:

su - primary_user

Ensuite, suivez les mêmes étapes sur le serveurbackup, mais créez un nouvel utilisateur appelébackup_user. Assurez-vous que vous êtes connecté aux serveursprimary etbackup en tant que ces utilisateurs pour le reste du guide.

Maintenant que vous avez créé les utilisateurs nécessaires sur les deux serveurs, vous pouvez maintenant installer le logiciel Unison.

[[step-2 -—- Installing-unison-on-both-servers]] == Étape 2 - Installation d'Unison sur les deux serveurs

Dans cette étape, vous installerez le package Unison sur les deux serveurs.

Vous utiliserez le gestionnaire de packages Ubuntuapt pour installer Unison sur les deux serveurs. Lorsque vous utilisezapt pour la première fois depuis longtemps, vous devez mettre à jour l'index du package local avec la commande suivante:

sudo apt-get update

Cela garantit que vous installerez la dernière version d'Unison. Cela aidera également à éviter les erreurs d'installation.

Ensuite, installez Unison:

sudo apt-get install unison

Vous avez maintenant terminé l'installation d'Unison. Dans l'étape suivante, vous allez configurer SSH afin qu'Unison puisse communiquer entre les deux serveurs.

[[step-3 -—- creating-ssh-keys-and-configuring-ssh]] == Étape 3 - Création de clés SSH et configuration de SSH

La première chose à faire est de créer une paire de clés SSH sur le serveurprimary car vous utiliserez l'authentification par clé pour la connexion SSH. L'authentification basée sur la clé présente l'avantage qu'une connexion sécurisée est possible sans entrer de mot de passe. Ceci est important car vous allez créer une procédure de sauvegarde automatisée qui doit avoir lieu sans que vous ne saisissiez un mot de passe à chaque fois.

Une fois que vous avez cette paire de clés sur le serveurprimary, vous copiez la clé publique sur le serveurbackup, puis testez qu'Unison est capable de communiquer entre les serveurs en utilisant SSH.

Lorsque vous créez une paire de clés SSH, vous utilisez généralement un mot de passe fort. Toutefois, Unison s’exécutera automatiquement. Il est donc impossible de saisir manuellement un mot de passe à chaque exécution. Appuyez sur la toucheENTER sans entrer de mot de passe. Cela générera une paire de clés SSH sans mot de passe.

Exécutez la commande suivante à partir du répertoire de base deprimary_user sur le serveurprimary pour générer une paire de clés SSH:

ssh-keygen -t rsa -b 4096 -f .ssh/unison-primary

Les options utilisées ici signifient:

  • -t rsa: Ceci définit le type de clé qui sera créée. Les clés RSA sont le type le plus compatible.

  • -b 4096: Ceci définit la longueur de la clé. Plus une clé est longue, plus elle est sécurisée. Une longueur de clé de4096 est la longueur de clé actuellement recommandée pour les clés RSA.

  • -f .ssh/unison-primary: Ceci définit le nom de la clé et l'emplacement où elle sera enregistrée. Dans ce cas, vous enregistrerez la clé dans le répertoire par défaut de SSH,.ssh, en utilisant un nom de votre choix.

La commande ci-dessus crée les clés SSH publiques et privées dans les deux fichiers suivants:

  • .ssh/unison-primary

  • .ssh/unison-primary.pub

Le premier est la clé privée SSH et le second est la clé publique. Vous devez copier le contenu du fichier de clé publique sur le serveurbackup. Le moyen le plus simple d'afficher le contenu du fichier de clé publique pour la copie est d'utiliser la commandecat pour imprimer le contenu sur le terminal:

cat .ssh/unison-primary.pub

Sur le serveurbackup dans le répertoire personnel debackup_user, ouvrez le fichier.ssh/authorized_keys avec un éditeur de texte. Ici, vous utilisereznano:

nano .ssh/authorized_keys

Collez la clé publique dans l'éditeur, puis enregistrez et quittez.

Vous pouvez maintenant tester que la configuration SSH fonctionne en vous connectant auxbackup depuis le serveurprimary via SSH. Ceci est important car vous devrez accepter et enregistrer l’empreinte digitale de la clé du serveur SSH du serveurbackup ou Unison ne fonctionnera pas. Dans votre terminal sur le serveurprimary, exécutez la commande suivante à partir du répertoire personnel deprimary_user:

ssh -i .ssh/unison-primary backup_user@backup_server_ip

L'option-i .ssh/unison-primary indique à SSH d'utiliser une clé ou un fichier d'identité spécifique. Ici, vous utiliserez la nouvelle cléunison-primary que vous avez créée.

Acceptez l'empreinte digitale en appuyant surY puis surENTER, puis connectez-vous et déconnectez-vous. Vous aviez juste besoin de confirmer que SSH fonctionne entre les serveurs et d'enregistrer l'empreinte SSH du serveurbackup. L'empreinte digitale ne pouvant être enregistrée que manuellement, vous devez donc le faire avant que le processus ne soit automatisé ultérieurement dans le didacticiel.

Ensuite, vérifiez qu'Unison se connecte en exécutant la commande suivante à partir du répertoire de base deprimary_user sur le serveurprimary:

ssh -i .ssh/unison-primary [email protected] unison -version

Dans cette commande, vous avez utilisé la même commande SSH que celle utilisée pour tester la connexion avec l’ajout de la commande Unison à la fin. Lorsqu'une commande est placée à la fin d'une connexion SSH, SSH se connecte, exécute la commande, puis se ferme. La commandeunison -version demande à Unison d'imprimer son numéro de version.

Si tout fonctionne, vous verrez une réponse indiquant la version d'Unison sur le serveurbackup:

Outputunison version 2.48.3

Maintenant que vous avez confirmé qu'Unison peut communiquer entre les serveurs à l'aide des clés SSH, vous êtes prêt à configurer uni.

[[step-4 -—- configuring-unison]] == Étape 4 - Configuration d'Unison

Dans cette étape, vous allez configurer Unison pour exécuter une simple sauvegarde unidirectionnelle sur un répertoire du serveurprimary au serveurbackup.

Pour configurer Unison, vous devez d'abord créer le répertoire de configuration sous le répertoire personnel deprimary_user sur le serveurprimary:

mkdir .unison

Ensuite, vous devez ouvrir un nouveau fichier avec le nomdefault.prf dans un éditeur de texte dans le répertoire.unison. Ce fichier contient la configuration Unison. Ouvrez le fichier avec la commande suivante:

nano .unison/default.prf

Puis entrez les informations suivantes:

default.prf

force = /home/primary_user/data
sshargs = -i /home/primary_user/.ssh/unison-primary

Ces deux lignes signifient:

  • force: Cela garantit que les modifications sontonly transmises du serveurprimary au serveurbackup. Le chemin/home/primary_user/data est l'emplacement du répertoire qui contient les données que vous souhaitez sauvegarder.

  • sshargs: cette option demande à Unison d'utiliser la clé SSH que vous avez générée.

Si le répertoire qui contient les données que vous souhaitez sauvegarder ne se trouve pas sous le répertoire personnel deprimary_user, vous devez vous assurer qu'il est lisible et inscriptible par lesprimary_user. Si vous n'êtes pas familier avec la propriété et les autorisations Linux, consultez le guideIntroduction to Linux Permissions pour en savoir plus.

Unison est maintenant configuré pour que vous puissiez le tester en sauvegardant un répertoire.

[[step-5 -—- backup-up-a-directory-with-unison]] == Étape 5 - Sauvegarde d'un répertoire avec Unison

Vous êtes prêt à sauvegarder un répertoire maintenant que Unison est configuré. Vous sauvegarderez le répertoire/home/primary_user/data sur le serveurprimary dans le répertoire/home/backup_user/data/ sur le serveurbackup. Le répertoire qui contient les données à sauvegardermust est le même que celui que vous avez placé dans.unison/default.prf à côté de l'optionforce.

Vous aurez besoin de certaines données à sauvegarder pour vérifier que Unison fonctionne. Créez des fichiers vides sur le serveurprimary, puis vérifiez si Unison les a transférés vers le serveurbackup.

Tout d'abord, créez le répertoire qui contiendra les données à sauvegarder en exécutant la commande suivante à partir du répertoire de base deprimary_user:

mkdir data/

Ensuite, utilisez la commandetouch pour créer cinq fichiers vides:

touch data/file{1..5}

La dernière partie de la commande,file{1..5}, utilise l'expansion des accolades Bash pour créer les cinq fichiers. Lorsque bash reçoit{1..5}, il remplit automatiquement les nombres manquants,2,3 et4. Cette technique est utile pour énumérer rapidement plusieurs fichiers.

Maintenant que vous avez le répertoiredata et quelques fichiers de test à sauvegarder, vous pouvez exécuter Unison pour sauvegarder les fichiers sur le serveurbackup. La commande suivante fera ceci:

unison -batch -auto /home/primary_user/data ssh://backup_user@backup_server_ip//home/backup_user/data

Ces options ont la signification suivante:

  • batch: Exécuter sans poser de questions.

  • auto: accepter automatiquement toutes les actions non conflictuelles.

Comme vous utilisez Unison dans un mode de synchronisation simple et unidirectionnel, vous n’aurez à résoudre aucun conflit. Cela signifie que vous pouvez définir ces options en toute sécurité.

Un conflit ne peut se produire que pendant l’autre mode de fonctionnement d’Unison, où il se synchronise dans les deux sens. Un tel cas d'utilisation consisterait à synchroniser un répertoire sur l'ordinateur portable et le bureau de quelqu'un. Lorsqu'ils mettent à jour un fichier sur le bureau, ils souhaitent que cette modification soit transmise à l'ordinateur portable, et inversement. Un conflit se produit si le même fichier est modifié aux deux extrémités avant qu'une synchronisation Unison ne se produise, et Unison ne peut pas automatiquement déterminer le fichier à conserver et celui à remplacer.

Dans un mode push unidirectionnel, les données duprimary sont toujours conservées et les données de la sauvegarde sont écrasées.

Cette commande imprimera un long message lors de sa première exécution. Le message se lit comme suit:

OutputContacting server...
Connected [//primary_server_ip//home/primary_user/data -> //primary_server_ip//home/backup_user/data]
Looking for changes
Warning: No archive files were found for these roots, whose canonical names are:
        /home/primary_user/data
        //backup_server_ip//home/backup_user/data
This can happen either
because this is the first time you have synchronized these roots,
or because you have upgraded Unison to a new version with a different
archive format.

Update detection may take a while on this run if the replicas are
large.

Unison will assume that the 'last synchronized state' of both replicas
was completely empty.  This means that any files that are different
will be reported as conflicts, and any files that exist only on one
replica will be judged as new and propagated to the other replica.
If the two replicas are identical, then no changes will be reported.

If you see this message repeatedly, it may be because one of your machines
is getting its address from DHCP, which is causing its host name to change
between synchronizations.  See the documentation for the UNISONLOCALHOSTNAME
environment variable for advice on how to correct this.

Donations to the Unison project are gratefully accepted:
http://www.cis.upenn.edu/~bcpierce/unison

  Waiting for changes from server
Reconciling changes
dir      ---->            /
Propagating updates
UNISON 2.48.3 started propagating changes at 16:30:43.70 on 03 Apr 2019
[BGN] Copying  from /home/primary_user/data to //backup_server_ip//home/backup_user/data
[END] Copying
UNISON 2.48.3 finished propagating changes at 16:30:43.71 on 03 Apr 2019
Saving synchronizer state
Synchronization complete at 16:30:43  (1 item transferred, 0 skipped, 0 failed)

Cette information avertit qu'il s'agit de la première synchronisation. Il fournit également des conseils sur la façon de résoudre un problème si ce message apparaît pour chaque exécution de synchronisation. La dernière section vous indique les données que Unison a synchronisées pendant cette exécution.

Lors de chaque exécution suivante, il imprimera beaucoup moins d’informations. Voici la sortie quand aucun fichier n'a été mis à jour:

OutputContacting server...
Connected [//primary_server_ip//home/primary_user/data -> //backup_server_ip//home/backup_user/data]
Looking for changes
  Waiting for changes from server
Reconciling changes
Nothing to do: replicas have not changed since last sync.

Voici la sortie lorsque/data/file1 est modifié sur le serveurprimary:

OutputContacting server...
Connected [//primary_server_ip//home/primary_user/data -> //backup_server_ip//home/backup_user/data]
Looking for changes
  Waiting for changes from server
Reconciling changes
changed  ---->            file1
Propagating updates
UNISON 2.48.3 started propagating changes at 16:38:37.11 on 03 Apr 2019
[BGN] Updating file file1 from /home/primary_user/data to //backup_server_ip//home/backup_user/data
[END] Updating file file1
UNISON 2.48.3 finished propagating changes at 16:38:37.16 on 03 Apr 2019
Saving synchronizer state
Synchronization complete at 16:38:37  (1 item transferred, 0 skipped, 0 failed)

Après chaque exécution de synchronisation, le serveurbackup aura une copie exacte du répertoiredata sur le serveurprimary.

[.warning] #Warning: Tous les nouveaux fichiers ou modifications dans le répertoiredata sur le serveurbackup seront perdus lorsque vous exécuterez Unison.
#

Vous pouvez maintenant exécuter Unison pour sauvegarder un répertoire. À l'étape suivante, vous automatiserez le processus de sauvegarde en exécutant Unison aveccron.

[[step-6 -—- Creating-a-unison-cron-job]] == Étape 6 - Création d'une tâche Unison Cron

Dans cette section, vous allez créer un travailcron qui exécutera Unison et sauvegardera le répertoiredata sur le serveurbackup à une fréquence spécifiée.

La crontab est un fichier qui est lu par le processus cron. Les commandes qu'il contient sont chargées dans le processus cron et sont exécutées aux intervalles spécifiés.

Vous pouvez afficher le contenu de la crontab pour votre utilisateur actuel en exécutant la commande suivante:

crontab -l

L'option-l répertorie le contenu de la crontab de l'utilisateur actuel. Si vous n'avez pas encore modifié la crontab, les informations suivantes s'afficheront:

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

Ensuite, exécutez la commandecrontab sur le serveurprimary avec l'indicateur-e pour l'ouvrir en mode édition:

crontab -e

Si aucun éditeur de ligne de commande par défaut n’est configuré, il vous sera demandé de choisir un éditeur la première fois que vous exécuterez la commande. Sélectionnez l'éditeur de votre choix pour ouvrir la crontab.

Une fois la crontab ouverte, ajoutez la commande suivante à la première ligne vide sous le texte existant:

...
* */3 * * * /usr/bin/unison -log -logfile /var/log/unison.log -auto -batch -silent /home/primary_user/data ssh://backup_user@backup_server_ip//home/backup_user/data

La commande que vous utiliserez est presque identique à celle que vous avez utilisée précédemment dans la sauvegarde manuelle, mais avec quelques options supplémentaires. Ces options supplémentaires sont les suivantes:

  • -silent: désactive toutes les sorties sauf les erreurs. Une sortie normale n'est pas requise lorsque Unison est exécuté à partir de la crontab car il n'y a personne pour le lire.

  • -log: demande à Unison de consigner ses actions.

  • -logfile: spécifie où Unison enregistrera ses actions.

Dans cet exemple, Unison est exécuté toutes les 3 heures. Vous pouvez modifier cette fréquence en fonction de la fréquence qui répond le mieux à vos besoins.

Chaque fois que vous éditez la crontab, vous devez toujours mettre une ligne vide en bas avant de sauvegarder et quitter. Cron risque de ne pas charger le fichier crontab correctement. Cela risquerait d'empêcher l'exécution des commandes.

Une fois ces modifications apportées, enregistrez et fermez le fichier.

Ensuite, créez le fichier journal dans lequel Unison écrira sur le serveurprimary. La commande suivante va créer ce fichier:

sudo touch /var/log/unison.log

Ensuite, faites deprimary_user le propriétaire du fichier.

sudo chown primary_user /var/log/unison.log

Vous pouvez vérifier l'état des sauvegardes Unison en lisant le fichier journal à/var/log/unison.log. Unison n'enregistrera quelque chose que s'il a sauvegardé un fichier nouveau ou mis à jour ou s'il a rencontré une erreur.

Unison effectue maintenant des sauvegardes périodiques à partir de la crontab. La dernière étape, facultative, consiste à sécuriser davantage la configuration SSH.

[[step-7-optional -—- securing-ssh]] == Étape 7 (Facultatif) - Sécurisation de SSH

Dans ce guide, vous avez créé et utilisé une clé SSH sans mot de passe. Il s'agit d'un problème de sécurité que vous pouvez résoudre en limitant ce que lesbackup_user sont capables de faire lorsqu'ils se connectent via SSH au serveurbackup.

Pour ce faire, configurez SSH pour autoriser uniquement lesbackup_user à exécuter une seule commande lorsqu'ils sont connectés via SSH. Cela signifie que la clé SSH que vous avez créée ne peut être utilisée que pour exécuter les sauvegardes Unison et rien d'autre. Cela a pour conséquence que vous ne pourrez pas vous connecter en SSH au serveurbackup en tant quebackup_user. En effet, la connexion nécessite plus que la seule commande autorisée.

Si vous devez accéder au serveurbackup en tant quebackup_user, vous devez d'abord vous connecter en tant qu'utilisateursammy, puis passer auxbackup_user en utilisantsu - backup_user.

Modifiez le fichier de configuration SSH sur le serveurbackup à/etc/ssh/sshd_config:

sudo nano /etc/ssh/sshd_config

Ajoutez ensuite les lignes suivantes au bas du fichier:

/etc/ssh/sshd_config

Match User backup_user
  ForceCommand unison -server

Ces options de configuration auront les effets suivants:

  • Match User: lorsque l'utilisateur répertorié se connecte, SSH appliquera l'option de configuration suivante et en retrait.

  • ForceCommand: cela restreint l'utilisateur correspondant à la commande suivante. Dans ce cas, lesbackup_user ne peuvent exécuter que la commandeunison -server.

Enregistrez et quittez votre éditeur de texte. Ensuite, rechargez le service SSH pour activer la nouvelle configuration:

sudo systemctl reload ssh.service

Vous pouvez tester cela en essayant de vous connecter au serveurbackup en tant quebackup_user via SSH à partir du serveurprimary.

ssh -i .ssh/unison-primary backup_user@backup_server_ip

Si les paramètres/etc/ssh/sshd_config fonctionnent, vous verrez ce qui suit:

OutputUnison 2.48

La session SSH sera suspendue jusqu'à ce que la session soit supprimée avec avecCTRL etC car Unison attend une commande.

Cela montre que le serveur Unison a été appelé automatiquement lors de la connexion et qu'aucun autre accès n'est possible en dehors de la communication avec le serveur Unison.

Vous disposez maintenant d'un système de sauvegarde Unison opérationnel et sécurisé, qui sauvegardera vos données aussi souvent que vous le souhaitez.

Conclusion

Dans ce guide, vous avez installé et configuré le logiciel de synchronisation de fichiers Unison pour la sauvegarde d'un répertoire sur SSH. Vous avez également configuré cron pour exécuter automatiquement les sauvegardes selon un calendrier spécifié et SSH sécurisé afin d'éviter toute utilisation abusive de la clé sans mot de passe.

Pour déterminer si vous devez utiliser Unison, vous devez prendre en compte quelques points:

  • Unison peut ne pas être le meilleur choix lorsque vous avez un nombre de fichiers réduit ou une quantité de données inférieure. Dans ce cas,rsync serait un choix plus approprié. Vous pouvez en savoir plus sur l'utilisation de rsync dans le guideHow To Use Rsync to Sync Local and Remote Directories on a VPS.

  • La sauvegarde de grandes quantités de données peut prendre beaucoup de temps et utiliser votre allocation de bande passante sur des interfaces réseau publiques. Si vos serveursprimary etbackup sont tous les deux des Droplets DigitalOcean, vous pourrez effectuer la sauvegarde Unison beaucoup plus rapidement et en toute sécurité si vous utilisez un réseau privé. Pour plus d'informations sur les réseaux privés gratuits de DigitalOcean, veuillez consulter la documentation dePrivate Network Overview.

Related