<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Libre Experience &#187; rsync</title>
	<atom:link href="http://www.libre-experience.org/index.php/tag/rsync/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.libre-experience.org</link>
	<description>Bloc-notes sur les logiciels libres</description>
	<lastBuildDate>Tue, 22 Nov 2011 07:21:41 +0000</lastBuildDate>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Un script de sauvegarde en Python, sous GNU/Linux avec rsync</title>
		<link>http://www.libre-experience.org/index.php/2010/08/27/un-script-de-sauvegarde-en-python-sous-gnulinux-avec-rsync/</link>
		<comments>http://www.libre-experience.org/index.php/2010/08/27/un-script-de-sauvegarde-en-python-sous-gnulinux-avec-rsync/#comments</comments>
		<pubDate>Fri, 27 Aug 2010 10:12:55 +0000</pubDate>
		<dc:creator>Marco</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Planet-Libre]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[rsync]]></category>

		<guid isPermaLink="false">http://www.libre-experience.org/?p=297</guid>
		<description><![CDATA[Il y a quelques temps, j&#8217;avais écrit un article expliquant comment réaliser une sauvegarde différencielle avec rsync sous GNU/Linux. J&#8217;ai récemment décidé de le réécrire en Python pour plusieurs raisons&#8230; J&#8217;aime ce langage et ça me permet de progresser. Je ne suis pas un expert en script bash et le script Python m&#8217;autorise plus de [...]]]></description>
			<content:encoded><![CDATA[<p>Il y a quelques temps, j&#8217;avais écrit <a href="index.php/2008/02/09/sauvegarde-differentielle-sous-linux/">un article</a> expliquant comment réaliser une sauvegarde différencielle avec rsync sous GNU/Linux. J&#8217;ai récemment décidé de le réécrire en Python pour plusieurs raisons&#8230;<span id="more-297"></span></p>
<ul>
<li>J&#8217;aime ce langage <img src='http://www.libre-experience.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  et ça me permet de progresser.</li>
<li>Je ne suis pas un expert en script bash et le script Python m&#8217;autorise plus de souplesse ainsi qu&#8217;une maintenance plus aisée.</li>
</ul>
<p>L&#8217;idée principale, outre l&#8217;utilisation de la sauvegarde différentielle (et donc la notion de <em>snapshots</em> pour pouvoir &laquo;&nbsp;remonter dans le temps&nbsp;&raquo;) est de pouvoir utiliser plusieurs media. Ainsi en passant un argument en ligne de commande, il est possible de choisir le medium à utiliser. Il peut être de deux types : local (autre disque dur, appareil USB&#8230;) ou sur une machine distante via ssh.</p>
<p>Vous pouvez <a href="http://www.libre-experience.org/wp-content/uploads/2010/08/backup_rsync_py.txt">télécharger le script complet</a>. Pensez à changer l&#8217;extension <em>.txt</em> en <em>.py</em> !</p>
<p><strong>Quelques explications sur les constantes du début du programme :</strong></p>
<ul>
<li>La variable <em>NICE_LEVEL</em> permet simplement d&#8217;indiquer la priorité avec laquelle la copie des données via rsync va être effectuée.</li>
<li>On définit ensuite la variable <em>DIR_TO_BACKUP</em> qui va préciser quels sont les répertoires à sauvegarder et ceux à éventuellement exclure.</li>
<li><em>BACKUP_DEST</em> indique les paramètres de la destination vers laquelle les données seront copiées. Il s&#8217;agit d&#8217;un dictionnaire contenant un autre dictionnaire Python. Le premier identifie les différents media et le second les paramètres relatifs à ce dernier, qui sont :
<ul>
<li><em>dir</em> : obligatoire indique le répertoire destination (qui doit exister).</li>
<li><em>server</em> : optionnel, adresse du serveur en cas de copie par ssh.</li>
<li><em>port</em> : optionnel, port du serveur en cas de copie par ssh.</li>
<li><em>login</em> : optionnel, login utilisé pour se connecter au serveur en cas de copie par ssh.</li>
</ul>
<p>A noter qu&#8217;en cas de copie par ssh, je fais l&#8217;hypothèse qu&#8217;on utilise une clé ssh pour se connecter et qu&#8217;il n&#8217;y a donc pas besoin de mot de passe.</li>
<li><em>ARCHIVE_NB</em> précise le nombre de sauvegarde à conserver.</li>
</ul>
<p><strong>Ensuite il y a la fonction <em>backup </em>qui effectue comme son nom l&#8217;indique la sauvegarde :</strong></p>
<p>Je n&#8217;expliquerai pas ici le détail de la programmation, car il n&#8217;y a en principe rien à toucher à ce niveau. Voici les grandes étapes :</p>
<ul>
<li>On commence par supprimer l&#8217;archive la plus ancienne.</li>
<li>On effectue un décalage des archives : la 1 devient 2, la 2 devient 3 etc.</li>
<li>On effectue une copie par <a href="http://en.wikipedia.org/wiki/Hard_link">hardlink </a>de l&#8217;archive 0 vers l&#8217;archive 1. Cette technique permet d&#8217;éviter une duplication des données et économise beaucoup d&#8217;espace. Seules les données inexistantes sont copiées les autres sont des simples liens.</li>
<li>Enfin on effectue une synchronisation par rsync entre le(s) répertoire(s) à sauvegarder et l&#8217;archive 0.</li>
</ul>
<p>A noter que pour les opérations sur disque (copie, déplacement&#8230;), je n&#8217;ai pas utilisé les commandes &laquo;&nbsp;natives&nbsp;&raquo; Python, car dans le cas d&#8217;un serveur distant elles ne sont pas utilisables.</p>
<p><strong>L&#8217;analyse des paramètres passées en ligne de commande :</strong></p>
<p>Si vous souhaitez ajouter / supprimer des media, il faudra effectuer des modifications dans la partie <em>__main__</em> du programme ainsi que dans la traditionnelle fonction <em>usage</em> qui indique les arguments qui peuvent être passés à l&#8217;application. Je pense que le code parle de lui-même à ce niveau. A noter simplement que j&#8217;ai imposé d&#8217;être <em>root</em> pour pouvoir exécuter le programme et ainsi copier des dossiers système, mais il n&#8217;y a évidemment pas d&#8217;obligation&#8230;</p>
<p>Ce script peut très certainement être amélioré, n&#8217;hésitez pas à me faire part de vos commentaires.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.libre-experience.org/index.php/2010/08/27/un-script-de-sauvegarde-en-python-sous-gnulinux-avec-rsync/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Sauvegarde différentielle sous Linux</title>
		<link>http://www.libre-experience.org/index.php/2008/02/09/sauvegarde-differentielle-sous-linux/</link>
		<comments>http://www.libre-experience.org/index.php/2008/02/09/sauvegarde-differentielle-sous-linux/#comments</comments>
		<pubDate>Sat, 09 Feb 2008 12:39:47 +0000</pubDate>
		<dc:creator>Marco</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Planet-Libre]]></category>
		<category><![CDATA[rsync]]></category>
		<category><![CDATA[sauvegarde]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://88.191.51.26/wordpress/index.php/2008/02/09/sauvegarde-differentielle-sous-linux/</guid>
		<description><![CDATA[Toute la puissance de Linux&#8230; Ce script n&#8217;est pas de moi (je l&#8217;ai simplement légèrement adapté), mais j&#8217;ai malheureusement perdu la source&#8230; Il permet de gérer des sauvegardes différentielles avec historique. En plus grace à la technique des &#171;&#160;hardlinks&#160;&#187; la consommation en espace est minimale. Je l&#8217;utilise partout et franchement ça marche du feu de [...]]]></description>
			<content:encoded><![CDATA[<p>Toute la puissance de Linux&#8230; Ce script n&#8217;est pas de moi (je l&#8217;ai simplement légèrement adapté), mais j&#8217;ai malheureusement perdu la source&#8230;<br />
Il permet de gérer des sauvegardes différentielles avec historique. En plus grace à la technique des &laquo;&nbsp;<a href="http://en.wikipedia.org/wiki/Hard_link">hardlinks</a>&nbsp;&raquo; la consommation en espace est minimale. Je l&#8217;utilise partout et franchement ça marche du feu de de Dieu&#8230;<span id="more-10"></span></p>
<pre><code>
#!/bin/bash -x
#
# To launch it every day at 4AM, add the following line to /etc/crontab :
# 00 4 * * * root /usr/local/scripts/backupRsync.sh

### PARAMETRES A ADAPTER
LOGIN_USER="nom_utilisateur"
BACKUPSERVER="adresse_serveur"
SSH_PORT="port_ssh"
BACKUP_TO_DIR="repertoire_destination_backup"

DIRECTORIES2BACKUP="liste_des_reperoires_a_sauvegarder_separes_par_des_espaces"
EXCLUDES="liste_des_repertoires_ou_fichiers_a_exclure_separes_par_des_espaces"
NUMBER_OF_ARCHIVES=10
NICE_LEVEL=3
### FIN DES PARAMETRES A ADAPTER

#!/bin/bash
# ----------------------------------------------------------------------
# mikes handy rotating-filesystem-snapshot utility: daily snapshots
# See http://www.mikerubel.org/computers/rsync_snapshots/
# ----------------------------------------------------------------------

# make sure we're running as root
if (( `id -u` != 0 ));
then
  { echo "Sorry, must be root.  Exiting..."; exit; }
fi

# step 1: delete the oldest snapshot:
ssh -p $SSH_PORT -l $LOGIN_USER $BACKUPSERVER rm -rf \
    $BACKUP_TO_DIR/daily.$NUMBER_OF_ARCHIVES

# step 2: shift the middle snapshots(s) back by one, if they exist
for i in `seq $NUMBER_OF_ARCHIVES -1 2`; do
  PREVIOUS=`expr $i - 1`
  ssh -p $SSH_PORT -l $LOGIN_USER $BACKUPSERVER \
    mv $BACKUP_TO_DIR/daily.$PREVIOUS $BACKUP_TO_DIR/daily.$i
done

# step 3: make a hard-link-only (except for dirs) copy of the latest snapshot,
# if that exists

ssh -p $SSH_PORT -l $LOGIN_USER $BACKUPSERVER [ -d $BACKUP_TO_DIR/daily.0 ]
if [ $? -eq 0 ]
then
  echo "Moving DIRECTORY"
  ssh -p $SSH_PORT -l $LOGIN_USER $BACKUPSERVER \
    cp -al $BACKUP_TO_DIR/daily.0 $BACKUP_TO_DIR/daily.1
else
  echo "Creating DIRECTORY"
  ssh -p $SSH_PORT -l $LOGIN_USER $BACKUPSERVER mkdir $BACKUP_TO_DIR/daily.0
fi

# step 4: rsync from the system into the latest snapshot (notice that
# rsync behaves like cp --remove-destination by default, so the destination
# is unlinked first.  If it were not so, this would copy over the other
# snapshot(s) too!
for d in $DIRECTORIES2BACKUP
do
  nice --adjust $NICE_LEVEL rsync -va -e "ssh -p $SSH_PORT" --progress \
    --relative --delete --delete-excluded $EXCLUDES $d \
    $LOGIN_USER@$BACKUPSERVER:$BACKUP_TO_DIR/daily.0
done

# step 5: update the mtime of daily.0 to reflect the snapshot time
ssh -p $SSH_PORT -l $LOGIN_USER $BACKUPSERVER touch $BACKUP_TO_DIR/daily.0

</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.libre-experience.org/index.php/2008/02/09/sauvegarde-differentielle-sous-linux/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

