<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Artisan Numérique</title>
  <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1606"/>
  <link rel="self" type="application/atom+xml" href="http://artisan.karma-lab.net/node/1606/atom/feed"/>
  <id>http://artisan.karma-lab.net/node/1606/atom/feed</id>
  <updated>2008-11-23T14:25:50+01:00</updated>
  <entry>
    <title>Faire ses sauvegardes soi-même</title>
    <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1606" />
    <id>http://artisan.karma-lab.net/node/1606</id>
    <published>2008-11-10T17:03:51+01:00</published>
    <updated>2008-11-23T14:25:50+01:00</updated>
    <author>
      <name>Ulhume</name>
    </author>
    <category term="Architecture Domestique" />
    <category term="OK" />
    <category term="Planet Libre" />
    <category term="Tutoriel" />
    <summary type="html"><![CDATA[<p>
  Un domaine doté d'un nombre impressionnant d'outils libres est celui de la sauvegarde. Et pourtant, lorsque l'on fait tourner sa petite toutouille perso, des monstres comme <a class='external' target='_blank' href='http://www.amanda.org/' >Amanda</a> font l'effet de massues à écraser les mouches. L'objectif de ce billet est donc le même que ça précèdent version : permettre de faire nos sauvegardes en tout simplicité, en mettant en oeuvre des concepts professionnels (synchronisation distante, mirroring, historisation) mais simplement armé des outils basiques que sont rsync et ssh. 
</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>
  Un domaine doté d'un nombre impressionnant d'outils libres est celui de la sauvegarde. Et pourtant, lorsque l'on fait tourner sa petite toutouille perso, des monstres comme <a class='external' target='_blank' href='http://www.amanda.org/' >Amanda</a> font l'effet de massues à écraser les mouches. L'objectif de ce billet est donc le même que ça précèdent version : permettre de faire nos sauvegardes en tout simplicité, en mettant en oeuvre des concepts professionnels (synchronisation distante, mirroring, historisation) mais simplement armé des outils basiques que sont rsync et ssh. 
</p>
<!--break-->

	<a name='chapter_1'></a>
  <h2>avant-propos</h2>
	
<p>
   Ce type de sauvegarde ne convient qu'au <a class='external' target='_blank' href='/node/1310%2523contexte' >contexte d'une architecture domestique</a> ou approchant (TPME, Indépendant, etc.). Pour tous les autres, il existe des outils tout faits et même dans certains cas plus ergonomiques (typiquement pour la sauvegarde de son seul poste de travail). 
</p>
<p>
   Je devance donc un peu certains commentaires : ce n'est pas la peine de me dire qu'il existe des outils faisant tout cela très bien car le but ici est justement de faire le sien aux petits oignons, adapté au plus prés de nos besoins. L'avantage est qu'un outil que l'on connaît est plus facile à mettre au point qu'une usine à Gaz qui change à chaque version. De plus il vous sera possible d'ajouter des petits détails propres à votre installation qu'un système de sauvegarde trop simple ne saura pas gérer. 
</p>


	<a name='chapter_2'></a>
  <h2>Principe de l'historisation</h2>
	

<p>
 Le principe d'historisation est repris de <a class='external' target='_blank' href='/node/1278' >cet article</a>. Je ne reviens donc pas dessus. Cependant la manière d'utiliser ici les hardlinks est un peu différente. L'idée est d'avoir dans notre dossier de stockage, deux sous dossiers <kbd>current</kbd> et <kbd>history</kbd>. A chaque rotation, le dossier current, qui contient les dernières données sauvegardées est hardlinké de manière récursive dans un sous-dossier de history portant comme nom la date et l'heure de la rotation. Ensuite on ne va garder que les N dossiers les plus récents en détruisant les plus anciens. 
</p>
<p>
  Ainsi, si vous lancez une sauvegarde toutes les 15 minutes et que l'on garde, disons 100 rotations, vous disposez de la possibilité de remonter en arrière dans le temps de 50 heures par tranches de 15 minutes. 
</p>
<p>
  Dans la précédente version de ce tutoriel, j'avais utilisé <kbd>rdiff-backup</kbd> pour effectuer ce travail. L'expérience m'a prouvé qu'utilisé massivement, cet outil n'est juste pas fiable. A deux reprises je me suis retrouvé avec des deltas corrompus et l'impossibilité de revenir en arrière dans le temps. De plus le système par hard-links permet de récupérer très simplement un snapshot en faisant un rsync. Avec <kbd>rdiff-backup</kbd>, on doit passer par divers paramètres pour arriver d'une utilisation beaucoup moins évidente, même s'il s'agit là d'une question d'habitude. 
</p>


	<a name='chapter_3'></a>
  <h2>Sauvegarder pour quoi faire ?</h2>
	
<p>
  Le meilleur moment dans la vie pour prendre conscience de l'intérêt d'une sauvegarde est celui où notre disque se met à crépiter tel un joyeux feu de la Beltane. Un tera gavé à bloc des photos et vidéos du petit dernier qui n'est alors plus qu'une brique aussi fumante que votre compagne qui vous interroge de cet air redoutablement inquiet : <q>T'as bien une copie quelque part, dis...</q>. A ce stade, on se fait généralement la remarque qu'une sauvegarde automatisée aurait été bien utile...  Car c'est reconnu par une utilisation quelque peu foireuse de la loi de Murphy : la sauvegarde automatique est réputée pour éloigner le mauvais oeil et allonger la durée de vie des disques durs...
</p>


	<a name='chapter_4'></a>
  <h2>Sauvegarder quoi ?</h2>
	
<p>
  La bonne réponse est <q>tout !!!</q>. Du moins tout ce qui n'est pas installable : documents de travail, photos, vidéos, configurations, etc. Mais il est possible de distinguer trois catégories dans ce "tout" 
  <ul>
  	<li>Les données qui changent régulièrement : documents de travail, configuration de machines, etc...</li>
  	<li>Les bases de données au sens large : courriels d'un serveur IMAP, base mySql ou PostgreSQL, gestionnaire de version (CVS, Subversion, etc.). </li>
  	<li>Les données lourdes qui changent peu mais qui augmentent en de grandes portions : vidéos, photos, ressources en tout genre.</li>
  </ul> 
</p>
<p>
  Les deux derniers cas, s'accommodent généralement assez bien d'une sauvegarde journalière simple, sans historisation. En revanche pour la première catégorie, il nous faut quelque chose de plus régulier avec la possibilité de remonter dans le temps. Cela permet de tordre le cou au cas classique de l'effacement accidentel du dossier <q>BétaDur</q> que vous étiez sur le point de livrer au client, ou celui de la mise à jour pour laquelle les mainteneurs de la Mandriva ont décidés pour dieu sait quelle raison que la configuration de votre PostFix était toute pourrie et qu'il fallait impérativement vous la pourrir plus encore plus... 
</p>



	<a name='chapter_5'></a>
  <h2>L'approche Perl</h2>
	

<p>
   La précédente version de ce tuto utilisait <kbd>bash</kbd> (elle est encore disponible en <a class='external' target='_blank' href='/node/1606/revisions/2196/view' >révision</a>). Le problème de bash c'est que l'on est vite gêné aux entournures, obligé à faire de terribles jonglages à coup de tubes, awk et autres sed. Perl est donc devenu peu à peu mon langage de script favoris. Sa syntaxe permet d'écrire à peu prés aussi rapidement qu'en bash avec plus de rigueur, et donc moins d'effets de bord. Enfin ses librairies sont tellement nombreuses qu'il est rare de ne pas en trouver une qui colle parfaitement à un besoin.
</p>
<p>
   Notre but est donc de fabriquer une librairies Perl très simple que nos scripts de sauvegarde utiliseront. Pour ce faire nous allons utiliser quelques concepts clef qui convient de bien comprendre :
   <ul>
     <li>Utilisation de SSH pour aller chercher les données à sauvegarder sur les autres machines que celle qui fait physiquement la sauvegarde. Pour cela nous "lions" les machines les unes aux autres grâce à des clefs publiques/privées. Notre librairie n'aura donc besoin d'aucun mot de passe car elle sera utilisée par "root". Si le serveur SSH utilise un port non standard, ce qui est conseillé pour une machine accessible du réseau publique, le fichier <kbd>/etc/ssh_config</kbd> sera paramétré pour que l'accès se fasse sans avoir à spécifier le port. Si vous ne vous sentez pas à l'aise avec tout cela, allez faire un tout <a class='external' target='_blank' href='/node/82' >ici</a></li>
     <li>Le transport des fichiers d'une machine à l'autre utilise <kbd>rsync</kbd> selon que l'historisation est nécessaire ou pas. Ces deux outils permettent de synchroniser via SSH deux dossiers (local et distant) en ne faisant circuler sur le réseau que ce qui est différent. Faites un petit coup de <kbd>man rsync</kbd> pour avoir plus d'idée sur le sujet.</li>
   </ul> 
</p>

<p>
  Maintenant, histoire de savoir où l'on avance, nous allons commencer par la fin, avec ce à quoi ressemblerait un script de sauvegarde "live", c'est à dire celui correspondant à notre première catégorie de choses à sauvegarder : les données qui changent souvent.
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co1">#! /usr/bin/perl</span><br />
<br />
<span class="co1"># import de notre librairie</span><br />
<a target="blank" href="http://perldoc.perl.org/functions/unshift.html"><span class="kw3">unshift</span></a><span class="br0">&#40;</span><span class="re0">@INC</span><span class="sy0">,</span><span class="st0">&quot;/usr/share/tools/libraries/perl&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<a target="blank" href="http://perldoc.perl.org/functions/require.html"><span class="kw3">require</span></a> <span class="st0">&quot;backup.pm&quot;</span><span class="sy0">;</span><br />
<br />
<span class="co1"># définition de la destination des backups</span><br />
use_storage<span class="br0">&#40;</span><span class="st0">&quot;/backups&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<br />
<span class="co1"># définition du serveur (local car c'est aussi lui qui lance les sauvegardes, pas besoin de ssh)</span><br />
<span class="kw1">if</span> <span class="br0">&#40;</span>check_host<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; name<span class="sy0">=&gt;</span><span class="st0">&quot;serveur_interne&quot;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; fs<span class="sy0">=&gt;</span><span class="st0">&quot;local&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<br />
&nbsp; <span class="co1"># ajout d'un dossier distant à sauvegarder localement, ici /etc en utilisant </span><br />
&nbsp; <span class="co1"># les exclusions de type &quot;etc&quot;. &nbsp;</span><br />
&nbsp; add_folder<span class="br0">&#40;</span><span class="st0">&quot;/etc&quot;</span><span class="sy0">,</span> <span class="st0">&quot;etc&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="co1"># définition d'un poste de travail</span><br />
<span class="kw1">if</span> <span class="br0">&#40;</span>check_host<span class="br0">&#40;</span>name<span class="sy0">=&gt;</span><span class="st0">&quot;poste_travail&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; add_folder<span class="br0">&#40;</span><span class="st0">&quot;/etc&quot;</span><span class="sy0">,</span> <span class="st0">&quot;etc&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; add_folder<span class="br0">&#40;</span><span class="st0">&quot;/home&quot;</span><span class="sy0">,</span> <span class="st0">&quot;homes&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="co1"># définition du serveur publique</span><br />
<span class="kw1">if</span> <span class="br0">&#40;</span>check_host<span class="br0">&#40;</span>name<span class="sy0">=&gt;</span><span class="st0">&quot;serveur_publique&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; add_folder<span class="br0">&#40;</span><span class="st0">&quot;/etc&quot;</span><span class="sy0">,</span> <span class="st0">&quot;etc&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="co1"># définition d'une machine windows</span><br />
<span class="kw1">if</span> <span class="br0">&#40;</span>check_host<span class="br0">&#40;</span><br />
&nbsp; &nbsp; name<span class="sy0">=&gt;</span><span class="st0">&quot;machine_windows&quot;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; fs<span class="sy0">=&gt;</span><span class="st0">&quot;cifs&quot;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; root<span class="sy0">=&gt;</span><span class="st0">&quot;C&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; add_folder<span class="br0">&#40;</span><span class="st0">&quot;/Users/gaston&quot;</span><span class="sy0">,</span> <span class="st0">&quot;windows&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
release_storage<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
  </div>
  
  </div>
</p>

<p>
   Pas si compliqué n'est-ce pas ? Voyons un peu comment tout cela se goupille. 
</p>   


	<a name='chapter_6'></a>
  <h2>La librairie</h2>
	
<p>
  L'idée n'est pas ici de donner un cours de perl, je ne vais donc pas coller le code de la dizaine de procédure que la librairie contient mais plutôt en expliquer l'utilisation. Les sources sont dans tous les cas disponibles <a class='external' target='_blank' href='/subversion/tools/trunk/tools/libraries/perl/' >ici</a>.
</p>

<h3>Préparation et libération du stockage</h3>
<p>

  <div class='code-block code-block-fragment'>
  <div class='container'>
  use_storage<span class="br0">&#40;</span><span class="st0">&quot;/backups&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
...<br />
<br />
release_storage<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
  </div>
  
  </div>
</p>
<p>
   La fonction <kbd>use_storage</kbd> et <kbd>release_storage</kbd> ne font rien d'extraordinaire. La première va juste créer du dossier cible et surtout y coller un fichier vide, <kbd>lock</kbd> pour éviter que la procédure soit ré-entrante. Ainsi si un autre programme travaille sur notre dossier de stockage, la procédure <kbd>user_storage</kbd> va nous bloquer jusqu'à ce que le précédent programme ait terminé. <kbd>release_storage</kbd> détruit donc ce <kbd>lock</kbd>.  
</p>

<h3>Définition des machines</h3>
<p>

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="kw1">if</span> <span class="br0">&#40;</span>check_host<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; name<span class="sy0">=&gt;</span><span class="st0">&quot;machine_windows&quot;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; fs<span class="sy0">=&gt;</span><span class="st0">&quot;cifs&quot;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; root<span class="sy0">=&gt;</span><span class="st0">&quot;C&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; ...<br />
<span class="br0">&#125;</span>
  </div>
  
  </div>
</p>
<p>
  Une fois le stockage définit, l'idée est de vérifier que la machine que l'on cherche à backuper est bien présente sur le réseau. Pour cela nous utilisons la fonction <kbd>check_host</kbd> qui exploite la libraire <a class='external' target='_blank' href='http://search.cpan.org/perldoc?Net::Ping' >Net::Ping</a>. La seule astuce est de régler le protocole à <kbd>icmp</kbd>. En effet par défaut cette librairie fait un ping via tcp, ce qui n'est pas compatible avec une machine ayant un firewall qui restera du coup invisible à la sauvegarde. 
</p>
<p>
  L'autre objectif de la fonction <kbd>check_host</kbd> est de définir la machine source tout d'abord par son nom usuel (<kbd>name</kbd>) puis optionnellement par son adresse IP (<kbd>address</kbd>). Si l'adresse IP est mise, c'est le nom de la machine qui est utilisé. 
</p>

<p>
  Dans tous les cas un sous-dossier du nom de cette machine va être créé sous celui défini dans <kbd>use_storage</kbd>. C'est là que ce feront toutes les sauvegarde. Lorsque la sauvegarde se fera, la structure complète du dossier à sauvegardé sera créé en dessous de se sous-dossier. Le paramètre <kbd>root</kbd> permet quant à lui de tronquer une partie du début du chemin en indiquant une racine distante de sauvegarde. Ainsi dans le cas d'une sauvegarde CIFS (windows), la racine indique de ne pas prendre en compte le <kbd>C</kbd> mais de commencer directement avec le début du chemin à sauvegarder.
</p>
<p>  
   La paramètre <kbd>fs</kbd> permet de nuancer la manière dont est vue la machine. Par défaut c'est <kbd>ssh</kbd>, signifiant que ssh sera utilisé pour se lier à la machine distante. La méthode <kbd>local</kbd> indique quant à elle que nul n'est besoin de SSH, qu'il faut faire une copie local. Enfin nous avons la méthode <kbd>cifs</kbd> qui va consister à monter le dossier windows avant de sauvegarder et <kbd>ftp</kbd> qui va utiliser <kbd>wget</kbd> plutôt que <kbd>rsync-backup</kbd>. 
</p>
<div class='inline-box note'>
  Lors de l'utilisation de <kbd>CIFS</kbd>, les autorisations sont directement recherchées dans le dossier <kbd>/etc/backup/nom_machine.credentials</kbd> et utilise la syntaxe de <kbd>mount.cifs</kbd>. 
</div>

<p>
  Enfin le paramètre <kbd>method</kbd> définit l'outil utilisé pour la synchronisation. Il peut s'agir <kbd>rsync</kbd> (par défaut). 
</p>
</p>

<h3>Synchronisation</h3>
<p>

  <div class='code-block code-block-fragment'>
  <div class='container'>
  ...<br />
add_folder<span class="br0">&#40;</span><span class="st0">&quot;/home&quot;</span><span class="sy0">,</span> <span class="st0">&quot;homes&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
...
  </div>
  
  </div>
</p>
<p>
  La définition de la machine faire par la commande <kbd>check_host</kbd> permet de simplifier au maximum la syntaxe des dossier à sauvegarder. La librairie sait en effet déjà quelle est l'adresse de la machine, la destination de sauvegarde, le type de système de fichier (local, ssh, ftp ou cifs) et l'outil de synchronisation à utiliser (rsync). Il ne reste plus donc qu'à donner les dossiers à sauvegarder par la commande <kbd>add_folder</kbd>. 
</p>
<p>
  <kbd>add_folder</kbd> prend en premier paramètre le chemin local sur la machine à sauvegarder et en second, optionnellement, un nom de fichier d'exclusions. Ce fichier utilise le format natif de la commande de synchronisation utilisé (rsync) et doit se trouve dans le dossier <kbd>/etc/backup</kbd>, dans un fichier nommé </kbd>nom_exclusion.exclusions</kbd>. Les exclusions portent ici assez mal leur nom car ces fichiers permettent aussi de force la sauvegarde d'un fichier. Par exemple pour un dossier <kbd>home</kbd>, cela donne :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="re7">- **/.purple/icons</span><br />
<span class="re8">+ **/.purple</span><br />
<span class="re8">+ **/.evolution/calendar/local/system/calendar.ics</span><br />
<span class="re8">+ **/.evolution/addressbook/local/system/addressbook.db</span><br />
<span class="re8">+ **/.gconf</span><br />
<span class="re8">+ **/.liferea_*/feedlist.opml</span><br />
<span class="re7">- **</span>
  </div>
  <div class='caption'>/etc/backup/homes.exclusion</div>
  </div>
</p>


	<a name='chapter_7'></a>
  <h2>Mirroring</h2>
	
<p>
  Comme nous l'avons vu en introduction, nous allons avoir deux types de sauvegardes. Celles effectuées très souvent, contenant les dossiers qui changent régulièrement. Et celles que l'on fait chaque nuits, contenant les bases de données (mail, postgresql, etc.) et les données lourdes (photos, vidéo, etc.). 
</p>
<p>
  Chacune de ces deux sauvegardes va donner lieu à un script en perl comme celui montré plus haut. Celui de la sauvegarde régulière va être très simple et demande à peu prés aucune adaptation. Celui de la sauvegarde journalière est un peu différent car nous allons <kbd>rsync</kbd> car historiser les changements sur des photos ou des bases de données n'a que peu d'intérêt (à vous de voir ceci dit).
</p>
<p>
  Ensuite la sauvegarde n'est pas faite en local, mais sur <external ref="node/1130">un disque USB</external>. Cette approche permet de limiter les risques électriques entres le serveur et le disque dur externe. Ceci dit ce n'est pas encore le top, et le mieux serait un petit montage qui allume physiquement le disque au moment de la sauvegarde, un électronicien avec une idée simple à mettre en oeuvre ? 
</p>
<p>
  Dernier aspect, cette grosse sauvegarde va comprendre nos bases, nos fichiers lourds mais aussi notre précédent dossier de sauvegarde régulière. Ainsi nos fichiers qui changent souvent sont non seulement historisés en local, mais aussi recopiés sur le disque USB pour plus de sécurité.
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  &nbsp;<span class="co1">#! /usr/bin/perl</span><br />
<br />
<span class="kw2">use</span> File<span class="sy0">::</span><span class="me2">Path</span><span class="sy0">;</span><br />
<a target="blank" href="http://perldoc.perl.org/functions/unshift.html"><span class="kw3">unshift</span></a><span class="br0">&#40;</span><span class="re0">@INC</span><span class="sy0">,</span><span class="st0">&quot;/usr/share/tools/libraries/perl&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<a target="blank" href="http://perldoc.perl.org/functions/require.html"><span class="kw3">require</span></a> <span class="st0">&quot;backup.pm&quot;</span><span class="sy0">;</span><br />
<br />
<span class="co1"># montage du disque de sauvegarde en lecture-écriture</span><br />
<span class="kw1">my</span> <span class="re0">$mount_point</span><span class="sy0">=</span><span class="st0">&quot;/mnt/backup&quot;</span><span class="sy0">;</span><br />
`mount <span class="sy0">/</span>dev<span class="sy0">/</span>disk<span class="sy0">/</span>by<span class="sy0">-</span>label<span class="sy0">/</span>backup <span class="re0">$mount_point</span> <span class="sy0">-</span>o remount<span class="sy0">,</span>rw`<span class="sy0">;</span><br />
<br />
<span class="co1"># ouverture du stockage pour notre sauvegarde</span><br />
use_storage<span class="br0">&#40;</span><span class="st0">&quot;$mount_point/mirroring&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="co1"># comme d'habitude, définition de la machine distante, mais cette fois utilisant &quot;rsync&quot;</span><br />
<span class="kw1">if</span> <span class="br0">&#40;</span>check_host<span class="br0">&#40;</span>name<span class="sy0">=&gt;</span><span class="st0">&quot;serveur_distant&quot;</span><span class="sy0">,</span> method<span class="sy0">=&gt;</span><span class="st0">&quot;rsync&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; <span class="co1"># sauvegarde des bases de données (postgresq, subversion, imap, etc)</span><br />
&nbsp; add_folder<span class="br0">&#40;</span><span class="st0">&quot;/databases&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="co1"># sauvegarde des fichiers &quot;lourds&quot;</span><br />
&nbsp; add_folder<span class="br0">&#40;</span><span class="st0">&quot;/videos&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="co1"># sauvegarde de nos &quot;sauvegardes régulières&quot;</span><br />
&nbsp; add_folder<span class="br0">&#40;</span><span class="st0">&quot;/backups&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
release_storage<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="co1"># remontage du disque en lecture seule</span><br />
`mount <span class="re0">$mount_point</span> <span class="sy0">-</span>o remount<span class="sy0">,</span>ro`<span class="sy0">;</span> &nbsp; &nbsp; &nbsp;
  </div>
  <div class='caption'>script lancé toutes les nuits</div>
  </div>
</p>


	<a name='chapter_8'></a>
  <h2>CRON</h2>
	
<p>
  Dernière étape une fois que nos deux scripts sont écrits et testés, les mettre en musique en passant par un <a class='external' target='_blank' href='/node/1692' >planning cron</a> :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co0"># toutes les 15 minutes...</span><br />
<span class="sy0">*/</span><span class="nu0">15</span> <span class="sy0">*</span> <span class="sy0">*</span> <span class="sy0">*</span> <span class="sy0">*</span> root <span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span>backup-live<br />
<br />
<span class="co0"># Tous les matins, à l'heure des voleurs...</span><br />
<span class="nu0">4</span> <span class="nu0">4</span> <span class="sy0">*</span> <span class="sy0">*</span> <span class="sy0">*</span> root <span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span>backup-daily
  </div>
  
  </div>
</p>


	<a name='chapter_9'></a>
  <h2>Conclusion</h2>
	
<p>
   La librairie de backup fait en 150 lignes tout ce que je lui demande, sans broncher, et sans prendre plus de ressources que nécessaires avec une adaptation à un besoin particulier très rapide à mettre en oeuvre.
</p>

    ]]></content>
  </entry>
</feed>
