{"id":3763,"date":"2019-05-26T09:05:44","date_gmt":"2019-05-26T08:05:44","guid":{"rendered":"https:\/\/olivier.hoarau.org\/?p=3763"},"modified":"2019-05-26T09:32:59","modified_gmt":"2019-05-26T08:32:59","slug":"programmer-une-sauvegarde-incrementale-reguliere","status":"publish","type":"post","link":"https:\/\/olivier.hoarau.org\/?p=3763","title":{"rendered":"Programmer une sauvegarde incr\u00e9mentale r\u00e9guli\u00e8re"},"content":{"rendered":"\n<p>Mine de rien le cumul des donn\u00e9es partag\u00e9es pr\u00e9sentes sur mon <a href=\"https:\/\/olivier.hoarau.org\/?p=2195\">serveur Dell PowerEdge T310<\/a> approche des 3 To, elles ont beau \u00eatre install\u00e9es sur un volume RAID 5, je reste inquiet aux cons\u00e9quences de la perte de d\u00e9cennies de num\u00e9risation de mes donn\u00e9es personnelles. Aussi je me suis pench\u00e9 sur un syst\u00e8me annexe de sauvegarde incr\u00e9mentale. L&rsquo;id\u00e9e est de faire une copie compl\u00e8te des donn\u00e9es une fois, puis r\u00e9guli\u00e8rement une copie des seuls fichiers qui ont \u00e9t\u00e9 modifi\u00e9s, rajout\u00e9s et de supprimer les fichiers de la sauvegarde qui ont disparu des donn\u00e9es d&rsquo;origine.  Pour cela j&rsquo;ai achet\u00e9 un disque externe de 4To USB qui est connect\u00e9 par USB \u00e0 mon serveur Dell.<\/p>\n\n\n\n<iframe style=\"width:120px;height:240px;\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\" src=\"\/\/ws-eu.amazon-adsystem.com\/widgets\/q?ServiceVersion=20070822&amp;OneJS=1&amp;Operation=GetAdHtml&amp;MarketPlace=FR&amp;source=ss&amp;ref=as_ss_li_til&amp;ad_type=product_link&amp;tracking_id=blog0d24-21&amp;language=fr_FR&amp;marketplace=amazon&amp;region=FR&amp;placement=B0748NBRPG&amp;asins=B0748NBRPG&amp;linkId=2ce03601d27bd01dc14f138182695efc&amp;show_border=true&amp;link_opens_in_new_window=true\" frameborder=\"0\"><\/iframe>\n\n\n\n<p>Le but de la man\u0153uvre est de sauvegarder tous les jours de mani\u00e8re incr\u00e9mentale les donn\u00e9es de<strong> \/home <\/strong>et de mon r\u00e9pertoire<strong> \/data<\/strong> \u00e0 l&rsquo;exclusion de certains fichiers et r\u00e9pertoires Je me suis largement inspir\u00e9 du script qu&rsquo;on peut trouver par <a href=\"https:\/\/github.com\/tuxmika\/bash-scripts\/blob\/master\/Script_sauvegarde_rsync_v1.sh\">ici<\/a> que j&rsquo;ai adapt\u00e9 \u00e0 mes besoins. <\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Voici le code comment\u00e9 du script <strong>sauvegarde<\/strong> (droit d&rsquo;ex\u00e9cution 755) que j&rsquo;ai plac\u00e9 sous<strong> \/usr\/local\/sbin<\/strong> en question :<\/p>\n\n\n\n<pre data-mode=\"text\" data-theme=\"terminal\" data-fontsize=\"14\" data-lines=\"Infinity\" class=\"wp-block-simple-code-block-ace\">#!\/bin\/bash\n# Script sauvegarde rsync https:\/\/www.funix.org inspir\u00e9 par\n# celui de  Micka\u00ebl BONNARD ( https:\/\/www.mickaelbonnard.fr )\n# sous licence MIT ( http:\/\/choosealicense.com\/licenses\/mit\/ )\n\n# Variables\n# date et heure\njour=`date +%d-%B-%Y`\n# r\u00e9pertoire contenant les logs\nlog=\"\/var\/log\/sauvegarde\"\n\n# r\u00e9pertoires \u00e0 sauvegarder\nlocal1=\"\/data\"\nlocal2=\"\/home\"\n\n# point de montage du disque de sauvegarde\ndistant=\"\/media\/sauvegardes\"\n\n# fichiers et r\u00e9pertoires \u00e0 exclure de la sauvegarder\nexcludes1=\"\/root\/bin\/exclude-data.txt\"\nexcludes2=\"\/root\/bin\/exclude-home.txt\"\n\n# test de v\u00e9rification de la pr\u00e9sence du disque de sauvegarde\nif [ ! -e \"$distant\" ]\nthen\n    echo \"Le disque de sauvegarde n'est pas mont\u00e9, arr\u00eat du script\"\n    exit\nfi\n\necho \"-------------------------------------------------------------\" > $log\/sauvegarde_$jour.log\n\n# nom de la sauvegarde dans le journal\necho \"Sauvegarde de $local1 et $local2 du $(date +%d-%B-%Y)\" >> $log\/sauvegarde_$jour.log\n\necho \"-------------------------------------------------------------\" >> $log\/sauvegarde_$jour.log\n\n# heure de d\u00e9but du transfert dans le journal\necho \"Heure de demarrage de la sauvegarde : $(date +%H:%M:%S)\" >> $log\/sauvegarde_$jour.log\n\necho \"-------------------------------------------------------------\" >> $log\/sauvegarde_$jour.log\n\n# transfert des fichiers\n\nrsync -az --stats --delete-after --exclude-from=$excludes1 $local1 $distant >> $log\/sauvegarde_$jour.log\nrsync -az --stats --delete-after --exclude-from=$excludes2 $local2 $distant >> $log\/sauvegarde_$jour.log\n\n# -a : mode archivage ( \u00e9quivalent -rlptgoD ).\n# -z : compression des donn\u00e9es pendant le transfert.\n# -- stats donne des informations sur le transfert (nombre de fichiers\u2026).\n# --delete-after : supprime les fichiers qui n\u2019existent plus dans la source apr\u00e8s le transfert dans le dossier de destination.\n\nstatus=$?\n\necho \"\"  >> $log\/sauvegarde_$jour.log\n\n#code d'erreurs rsync\n\ncase $status in\n0) echo Succ\u00e8s >> $log\/sauvegarde_$jour.log;;\n1) echo Erreur de syntaxe ou d'utilisation >> $log\/sauvegarde_$jour.log;;\n2) echo Incompatibilit\u00e9 de protocole >> $log\/sauvegarde_$jour.log;;\n3) echo Erreurs lors de la s\u00e9lection des fichiers et des r\u00e9pertoires d'entr\u00e9e\/sortie >> $log\/sauvegarde_$jour.log;;\n4) echo Action non support\u00e9e : une tentative de manipulation de fichiers 64-bits sur une plate-forme qui ne les supporte pas \\\n ; ou une option qui est support\u00e9e par le client mais pas par le serveur. >> $log\/sauvegarde_$jour.log;;\n5) echo Erreur lors du d\u00e9marrage du protocole client-serveur >> $log\/sauvegarde_$jour.log;;\n6) echo D\u00e9mon incapable d'\u00e9crire dans le fichier de log >> $log\/sauvegarde_$jour.log;;\n10) echo Erreur dans la socket E\/S >> $log\/sauvegarde_$jour.log;;\n11) echo Erreur d'E\/S fichier >> $log\/sauvegarde_$jour.log;;\n12) echo Erreur dans le flux de donn\u00e9e du protocole rsync >> $log\/sauvegarde_$jour.log;;\n13) echo Erreur avec les diagnostics du programme >> $log\/sauvegarde_$jour.log;;\n14) echo Erreur dans le code IPC>> $log\/sauvegarde_$jour.log;;\n20) echo SIGUSR1 ou SIGINT re\u00e7u >> $log\/sauvegarde_$jour.log;;\n21) echo \"Une erreur retourn\u00e9e par waitpid()\" >> $log\/sauvegarde_$jour.log;;\n22) echo  Erreur lors de l'allocation des tampons de m\u00e9moire principaux >> $log\/sauvegarde_$jour.log;;\n23) echo Transfert partiel du \u00e0 une erreur >> $log\/sauvegarde_$jour.log;;\n24) echo Transfert partiel du \u00e0 la disparition d'un fichier source >> $log\/sauvegarde_$jour.log;;\n25) echo La limite --max-delete a \u00e9t\u00e9 atteinte >> $log\/sauvegarde_$jour.log;;\n30) echo D\u00e9passement du temps d'attente maximal lors d'envoi\/r\u00e9ception de donn\u00e9es >> $log\/sauvegarde_$jour.log;;\n35) echo Temps d\u2019attente d\u00e9pass\u00e9 en attendant une connection >> $log\/sauvegarde_$jour.log;;\n255) echo Erreur inexpliqu\u00e9e >> $log\/sauvegarde_$jour.log;;\nesac\n\necho \"-------------------------------------------------------------\" >> $log\/sauvegarde_$jour.log\n\n# heure de fin dans le journal\n\necho \"Jour de fin de sauvegarde : $(date +%d-%B-%Y)\" >> $log\/sauvegarde_$jour.log\necho \"Heure de fin de la sauvegarde : $(date +%H:%M:%S)\" >> $log\/sauvegarde_$jour.log\n\necho \"-------------------------------------------------------------\" >> $log\/sauvegarde_$jour.log\n\nexit<\/pre>\n\n\n\n<p>On lancera manuellement la premi\u00e8re fois le script pour faire la copie compl\u00e8te initiale. Pour mes presque 3 To de donn\u00e9es, \u00e7a a pris 30 heures ! Voil\u00e0 la trace de la commande :<\/p>\n\n\n\n<p>Le fichier d\u2019exclusion ressemblera \u00e0 \u00e7a, exemple avec le fichier <strong>exclude-home.txt<\/strong><\/p>\n\n\n\n<pre data-mode=\"text\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" class=\"wp-block-simple-code-block-ace\">- \/home\/benjamin\n- \/home\/benjamin\/**\n- \/home\/clamav\n- \/home\/clamav\/**\n- \/home\/lost+found\n- \/home\/lost+found\/**\n- \/home\/openvas\n- \/home\/openvas\/**\n\n- \/home\/*\/.gconf\n- \/home\/*\/.gconfd\n- \/home\/*\/.dbus\n- \/home\/*\/.gnome2\n- \/home\/*\/.qt\n- \/home\/*\/.thumbnails\n- \/home\/*\/.gvfs\n- \/home\/*\/.cache\n- \/home\/*\/tmp\n- \/home\/*\/T\u00e9l\u00e9chargements<\/pre>\n\n\n\n<p>On lancera manuellement la premi\u00e8re fois le script pour faire la copie compl\u00e8te initiale. Pour mes presque 3 To de donn\u00e9es, \u00e7a a pris 30 heures ! Voil\u00e0 la trace de la commande :<\/p>\n\n\n\n<pre data-mode=\"text\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" class=\"wp-block-simple-code-block-ace\">-------------------------------------------------------------\nSauvegarde de  du 19-mai-2019\n-------------------------------------------------------------\nHeure de demarrage de la sauvegarde : 10:52:00\n-------------------------------------------------------------\n\nNumber of files: 173,245 (reg: 164,016, dir: 7,932, link: 1,297)\nNumber of created files: 173,245 (reg: 164,016, dir: 7,932, link: 1,297)\nNumber of deleted files: 0\nNumber of regular files transferred: 164,016\nTotal file size: 3,206,903,342,348 bytes\nTotal transferred file size: 3,206,903,246,843 bytes\nLiteral data: 3,206,903,246,843 bytes\nMatched data: 0 bytes\nFile list size: 6,159,933\nFile list generation time: 0.001 seconds\nFile list transfer time: 0.000 seconds\nTotal bytes sent: 3,162,117,031,591\nTotal bytes received: 3,178,395\n\nsent 3,162,117,031,591 bytes  received 3,178,395 bytes  16,697,620.39 bytes\/sec\ntotal size is 3,206,903,342,348  speedup is 1.01\n\nNumber of files: 102,431 (reg: 93,409, dir: 8,992, link: 29, special: 1)\nNumber of created files: 102,431 (reg: 93,409, dir: 8,992, link: 29, special: 1)\nNumber of deleted files: 0\nNumber of regular files transferred: 93,409\nTotal file size: 76,774,345,955 bytes\nTotal transferred file size: 76,774,345,296 bytes\nLiteral data: 76,774,345,304 bytes\nMatched data: 0 bytes\nFile list size: 3,013,885\nFile list generation time: 0.001 seconds\nFile list transfer time: 0.000 seconds\nTotal bytes sent: 56,725,836,374\nTotal bytes received: 1,832,039\n\nsent 56,725,836,374 bytes  received 1,832,039 bytes  11,132,895.38 bytes\/sec\ntotal size is 76,774,345,955  speedup is 1.35\n\nSucc\u00e8s\n-------------------------------------------------------------\nHeure de fin de la sauvegarde : 16:53:10\n-------------------------------------------------------------<\/pre>\n\n\n\n<p>Ensuite pour que la sauvegarde devienne quotidienne, sous <strong>\/etc\/cron.daily <\/strong>j&rsquo;ai cr\u00e9\u00e9 le fichier ex\u00e9cutable <strong>sauvegarde<\/strong> contenant <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\n\/usr\/local\/sbin\/sauvegarde<\/code><\/pre>\n\n\n\n<p>Les sauvegardes incr\u00e9mentales avec cr\u00e9ation\/modification et suppression de fichiers sont ensuite, heureusement, bien plus rapides et durent \u00e0 peine quelques minutes. En voici une trace :<\/p>\n\n\n\n<pre data-mode=\"text\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" class=\"wp-block-simple-code-block-ace\">-------------------------------------------------------------\nSauvegarde de  du 24-mai-2019\n-------------------------------------------------------------\nHeure de demarrage de la sauvegarde : 13:39:04\n-------------------------------------------------------------\n\nNumber of files: 118,632 (reg: 110,799, dir: 6,536, link: 1,297)\nNumber of created files: 0\nNumber of deleted files: 54,618 (reg: 53,221, dir: 1,397)\nNumber of regular files transferred: 0\nTotal file size: 2,727,907,903,951 bytes\nTotal transferred file size: 0 bytes\nLiteral data: 0 bytes\nMatched data: 0 bytes\nFile list size: 3,342,069\nFile list generation time: 5.537 seconds\nFile list transfer time: 0.000 seconds\nTotal bytes sent: 3,357,594\nTotal bytes received: 11\n\nsent 3,357,594 bytes  received 11 bytes  447,680.67 bytes\/sec\ntotal size is 2,727,907,903,951  speedup is 812,456.47\n\nNumber of files: 102,427 (reg: 93,405, dir: 8,992, link: 29, special: 1)\nNumber of created files: 1 (reg: 1)\nNumber of deleted files: 11 (reg: 11)\nNumber of regular files transferred: 2\nTotal file size: 76,774,768,138 bytes\nTotal transferred file size: 72 bytes\nLiteral data: 72 bytes\nMatched data: 0 bytes\nFile list size: 3,014,166\nFile list generation time: 0.737 seconds\nFile list transfer time: 0.000 seconds\nTotal bytes sent: 3,043,261\nTotal bytes received: 69\n\nsent 3,043,261 bytes  received 69 bytes  2,028,886.67 bytes\/sec\ntotal size is 76,774,768,138  speedup is 25,227.22\n\nSucc\u00e8s\n-------------------------------------------------------------\nHeure de fin de la sauvegarde : 13:39:35\n-------------------------------------------------------------<\/pre>\n\n\n\n<p>Sauvegarder c&rsquo;est bien, mais quid de la restauration, en fait c&rsquo;est tr\u00e8s simple ! Dans le cas pr\u00e9sent les fichiers vont se retrouver (non compress\u00e9s) dans le r\u00e9pertoire <strong>\/media\/sauvegardes<\/strong>, il est donc tr\u00e8s simple de r\u00e9cup\u00e9rer une copie. C&rsquo;est donc un inconv\u00e9nient en terme de stockage de la sauvegarde (puisqu&rsquo;il faut a minima le m\u00eame espace de stockage que les r\u00e9pertoires \u00e0 sauvegarder) mais la restauration en est largement facilit\u00e9e.<\/p>\n\n\n\n<p>Plus fin encore si vous souhaitez faire une sauvegarde distincte pour chaque jour, chaque semaine (celle du lundi) et du mois (le 1er du mois) pour pouvoir revenir \u00e0 un \u00e9tat pr\u00e9cis d&rsquo;un jour particulier, je pouvais consulter ce <a href=\"http:\/\/grimaldi.me\/post\/backup-linux\/\">site<\/a>. Je pense que \u00e7a peut \u00eatre utile pour les d\u00e9veloppeurs ou pour tous ceux qui ont le besoin de r\u00e9cup\u00e9rer des fichiers \u00e0 un instant t de leur vie.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mine de rien le cumul des donn\u00e9es partag\u00e9es pr\u00e9sentes sur mon serveur Dell PowerEdge T310 approche des 3 To, elles ont beau \u00eatre install\u00e9es sur un volume RAID 5, je reste inquiet aux cons\u00e9quences de la perte de d\u00e9cennies de num\u00e9risation de mes donn\u00e9es personnelles. Aussi je me suis pench\u00e9 sur un syst\u00e8me annexe de &hellip; <a href=\"https:\/\/olivier.hoarau.org\/?p=3763\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">Programmer une sauvegarde incr\u00e9mentale r\u00e9guli\u00e8re<\/span>  <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false,"_share_on_mastodon":"0"},"categories":[5],"tags":[],"class_list":["post-3763","post","type-post","status-publish","format-standard","hentry","category-logiciels-libres"],"share_on_mastodon":{"url":"","error":""},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/peOjJ-YH","jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/olivier.hoarau.org\/index.php?rest_route=\/wp\/v2\/posts\/3763","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/olivier.hoarau.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/olivier.hoarau.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/olivier.hoarau.org\/index.php?rest_route=\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/olivier.hoarau.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3763"}],"version-history":[{"count":5,"href":"https:\/\/olivier.hoarau.org\/index.php?rest_route=\/wp\/v2\/posts\/3763\/revisions"}],"predecessor-version":[{"id":3769,"href":"https:\/\/olivier.hoarau.org\/index.php?rest_route=\/wp\/v2\/posts\/3763\/revisions\/3769"}],"wp:attachment":[{"href":"https:\/\/olivier.hoarau.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3763"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/olivier.hoarau.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3763"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/olivier.hoarau.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3763"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}