Synchronisez votre Linux avec Hubic d'OVH

par Korben -

Éric, lecteur de Korben.info m’a gentiment proposé un script et un tuto permettant de mettre en place une synchro Rsync entre votre ordinateur ou votre serveur et Hubic, l’espace de stockage d’OVH. Comme le client officiel pour Linux est un poil mort-vivant, j’ai trouvé que c’était une bonne idée de partager ça ici avec vous, histoire que vous puissiez bénéficier directement sur votre Linux d’un système de fichier de 5 à 10 To.

Si vous avez des remarques à ajouter ou des corrections à faire, n’hésitez pas. Encore merci à Éric d’avoir pris le temps de rédiger tout cela pour la communauté.

=====

Le but de ce Tuto est de présenter la mise en place d’un script de synchronisation basé sur l’indispensable et (bien ?) connu « rsync », entre un ordinateur local et un espace Cloud Hubic, mis à disposition par la Société OVH. L’objet n’est évidemment pas de présenter le client fourni par OVH, plutôt simple à mettre en place, et performant (quand il fonctionne ;-)), mais de proposer une solution tierce ou de secours, qui permet également un accès direct à l’espace de stockage comme un système « local », qui va de 25 Go (proposé gratuitement par OHV) à 10 To, pour 5 €/mois. J’ai également fait en sorte d’augmenter au maximum les performances de synchronisation par rapport à une « simple » commande rsync.

Ce script doit être analysé, et utilisé en fonction des besoins, sans aucune garantie : j’ai moi-même supprimé quelques gigas de mes données personnelles en le mettant au point. Heureusement que j’avais des sauvegardes, faites-en autant.

Montage du système de fichiers Hubic.

L’accès à l’espace de stockage se fait au travers de l’outil hubicfuse et ne sera pas détaillé ici, car d’autres l’ont déjà très bien fait. J’y amène juste quelques personnalisations qui peuvent servir.

Moi j’ai suivi cette page, simple et bien expliquée.

Voici mon fichier de config “.hubicfuse” après avoir suivi le Tuto de P. Diancourt :

client_id=api_hubic_XXXXXXXXXXXXXXXXXXXXXXXXXXX client_secret=XXXXXXXXXXXXXXXXXXXXXX refresh_token=XXXXXXXXXXXXXXXXXXXXXXX cache_timeout = 600 temp_dir = /home/mon_user/tmp

get_extended_metadata = true curl_verbose = false curl_progress_state = true cache_statfs_timeout = 15 debug_level = 0 enable_chmod = false enable_chown = false

Ajustements personnels :

  • Je modifie le répertoire temporaire par défaut ( /tmp ) que je reporte dans mon espace utilisateur pour des raisons d’espace. Car si comme moi vous avez une partition /tmp de 5 Go, celle-ci peut être rapidement saturée (ce qui m’est arrivé) si vous synchronisez plusieurs gros fichiers.
  • Les options de montage que j’utilise sont différentes. Je les ai ajustées après avoir « DuckDugué » sur différents blogs et cela semble fonctionner plutôt bien, donc voici ce que je rajoute au fichier /,etc./fstab :

hubicfuse /home/mon_user/hubic rw,noauto_cache,sync_read,allow_other,no_splice_write,no_splice_move

Vous n’êtes pas obligé de monter ce système de façon permanente, le script fourni plus loin le fera si nécessaire.

Comme le précise bien Pierre Diancourt, ce système de fichiers subit quelques limitations en termes de performances et de fonctionnalités, mais pourra fort bien s’accommoder d’un script basé sur rsync configuré en conséquence.

Le script de synchronisation HubicTool

Ce script, baptisé un peu pompeusement « hubictool » amène 6 arguments plutôt basiques :

  • La synchronisation (argument -sync) permet dans un premier temps de synchroniser un répertoire local de votre choix vers le répertoire distant « default » de hubic. Dans un second temps il fera l’opération inverse, pour le cas où vous remonteriez des fichiers dans hubic par client web, ou smartphone. Les options de synchro choisies ne suppriment rien, on se contente d’ajouter ou modifier dans un sens ou un autre.
  • L’envoi (argument -send) : met à jour le cloud uniquement
  • La réception (argument -receive) : met à jour le répertoire local uniquement
  • La sauvegarde (argument -backup) permet de sauvegarder votre répertoire local vers le répertoire de backup d’hubic. Son nom de répertoire dépend de celui que vous avez donné à votre synchronisation sous Hubic. Manquant cruellement d’imagination, je l’ai appelé « Synchro ». Mon répertoire de sauvegarde s’appelle donc « HubiC-DeskBackup_Synchro », au même niveau que « default ». Sinon créez un répertoire de votre choix. Vous rencontrerez alors votre première déconvenue due aux limitations suscitées. Pour contourner, créez un répertoire nommé comme vous le souhaitez sur votre bureau par exemple, puis déplacez-le vers votre espace Hubic. Car si vous le créez directement, vous ne pourrez pas le renommer !
  • La restauration (argument -restore) synchronisera l’espace de sauvegarde vers le répertoire local
  • Le montage du système de fichiers (argument -mount) sans autre action.

Ce script est fortement inspiré de celui que l’on peut trouver ici dans lequel le principe est de parcourir les répertoires avec un « find » et de lancer un thread rsync par répertoire. Le nombre de thread est limité pour ne pas mettre à genou la machine.

J’en ai repris le principe de parallélisation des threads rsync, mais en parallélisant au niveau des fichiers et pas des répertoires. Cela s’adapte mieux à des répertoires avec une forte disparité dans la taille des fichiers. Par exemple une multitude de répertoires avec des petits fichiers (DOC bureautiques, numérisation de papiers administratifs, etc.), et un répertoire avec des films. En parallélisant au niveau répertoire, les petits fichiers sont vite synchronisés, et il reste souvent un seul processus rsync pour le répertoire avec les gros fichiers.

J’ai également repris ce script pour qu’il travaille par niveau de répertoire (il synchronise d’abord la racine, puis les répertoires de niveau 1, 2 … <= $maxdepth

Le script est récupérable ici.

Voici quelques explications sur le code.

Le premier bloc permet d’initialiser les variables les plus courantes : les répertoires, exclusions et point de montage pour hubicfuse. Notez que les exclusions désignent « ce qui commence par ». Les différents PATTERNS sont séparés par des | (pipes). Les slashes sont échappés par des antislashes. Par exemple l’exclusion /NO permet d’exclure rapidement tout répertoire commençant par « NO ». Voir la commande egrep (REGEXP) pour la notation.

On trouve ensuite la fonction principale de synchronisation, avec ses variables, dont certaines peuvent être ajustées :

  • maxdepth : il est important de bien ajuster cette variable en fonction de la profondeur de répertoires à synchroniser. Mettre un chiffre trop petit exclura certains fichiers de la synchronisation, un chiffre trop grand augmentera sensiblement le temps de synchronisation. Une commande du type ‘find . -mindepth x -maxdepth x -type d -print’ (avec x strictement identiques) pourra vous permettre de déterminer quelle valeur choisir.
  • rsyncopts : De longues heures m’ont amené à faire ce choix, qui ne conviendra pas forcément à tout le monde. Cependant dans le contexte « Hubic » l’argument –inplace est indispensable, car rsync écrit par défaut dans un fichier temporaire dans le répertoire de destination, puis renomme le fichier. Mais le renommage échoue et le remplacement ne se fait pas.
  • t : conservation du timestamp. Indispensable pour que hubic sache si un fichier a été modifié et doit être resynchronisé.
  • LK : permettent de traiter les liens symboliques comme des répertoires « normaux ». Cela permet notamment d’aligner dans son répertoire de synchro des répertoires disséminés ailleurs sur la machine. Rajoutez un lien symbolique vers un répertoire « photos » suffit à le rendre « synchro » !. Vous pouvez également monter des systèmes distants (NAS, partages SMB …) dans votre répertoire de synchro … Et là tout à coup l’offre à 10 To prend du sens, non ? ( non non, je vous jure qu’OVH ne me verse rien pour ce Tuto).
  • W : j’ai lu quelque part que c’était mieux avec inplace, alors je l’ai rajouté
  • maxthreads : règle le nombre de threads rsync simultanés. Une commande rsync déclenchant 3 forks, on synchronisera une dizaine de fichiers simultanément avec la valeur actuelle de 30. À caler également en fonction de la bande passante disponible.
  • sleeptime : temps d’attente entre 2 vérifications du nombre de thread. La diminuer pourra faire gagner du temps sur un grand nombre de petits fichiers.

La fonction hubicmount : comme son nom l’indique monte le système de fichiers hubic, celui-ci n’est pas démonté quand le script se termine normalement.

Le « main » se veut simple puisqu’il est basé sur un « case » énumérant les 3 arguments de ce script : -sync, -backup, -restore.

Enfin un appui sur Ctrl-C pendant l’exécution du script permet de sortir en tuant TOUT les process « rsync ». Ceci n’est possible (pour le moment) qu’en tuant également le process hubicfuse.

C’est pourquoi il vous est demandé de faire un démontage forcé du système de fichier hubicfuse (sudo umount -l hubicfuse) en quittant, sinon il apparaîtra toujours comme monté pour le système.

=====

Merci à Eric pour le tuto et encore bravo pour ce petit script bien pratique. J’espère qu’il vous servira et si vous avez des remarques à faire dessus, les commentaires sont ouverts.