====== Rsnapshot ====== ===== Description ===== rsnapshot est un outil de sauvegarde basé sur rsync. Grâce à rsnapshot, il est possible de prendre des instantanés de vos systèmes de fichiers à différents instants. Utilisant les liens durs, rsnapshot créé l'illusion de l'existance de multiples sauvegardes complétes, tout en n'occupant que la place d'une seule plus les différences. Couplé avec ssh, il est également possible de prendre des instantanés de systèmes de fichiers distants. Ce document est un tutoriel d'installation et de configuration de rsnapshot. rsnaphost est écrit en Perl et dépends de rsync. OpenSSH, GNU cp et le programme BSD logger sont également recommandés mais pas necessaires. Tous ceux-ci devraient être présents sur la plupart des systèmes Linux. rsnapshot est écrit avec le plus petit dénomitateur commun en tête. Au minimum il ne requiert que Perl 5.0004 et rsync. Ceci fait qu'il fonctionne sur quasiment n'importe quel système UNIX vous voudrez l'installer. Il a été testé avec succès avec Perl 5.0004 à 5.8.2, sur Debian, Redhat, Fedora, Solaris, Mac OS X, FreeBSD, OpenBSD, et IRIX. source: http://www.rsnapshot.org/howto/1.1/rsnapshot-HOWTO.fr.html ===== Installation ===== aptitude install rsnapshot vi /etc/rsnapshot.conf Configurer votre répertoire de stockage, pour ma part, un disque dur externe snapshot_root /media/backup/ Décommenter les lignes cmd_cp /bin/cp cmd_ssh /usr/bin/ssh L'option suivante est intéressante, elle permet d'utiliser ''rsync'' pour la création de lien dur, plutôt que la commande ''cp -al'' link_dest 1 Modifier l'intervalle de sauvegarde ######################################### # BACKUP INTERVALS # # Must be unique and in ascending order # # i.e. hourly, daily, weekly, etc. # ######################################### retain hourly 6 retain daily 7 retain weekly 4 #retain monthly 3 hourly ne veut pas dire toutes les heures mais toutes les 4 heures par défaut, donc le 6 permet d'avoir des sauvegardes sur 24h (6*4). Cela étant dit, il est possible de définir hourly s'exécutant toutes les heures.\\ daily s’exécute tous les jours et garde un historique sur 7 jours.\\ weekly s'exécute toutes les semaines et garde un historique sur 4 semaines. Dans mon cas, je voudrais garder les 30 derniers jours et pourquoi pas garder les 12 derniers mois. retain daily 30 retain monthly 12 Modifier ensuite à la fin du fichier la section ############################### ### BACKUP POINTS / SCRIPTS ### ############################### Comme bon vous semble. Pour mon cas, je veux sauvegarder tout le répertoire /var/www de mon serveur web distant vers mon serveur de backup ou rsnapshot est installé et ce de façon journalière. Je vais donc mettre backup root@edmc73.com:/var/www/ edmc73.com/ La sauvegarde du répertoire /var/www de mon serveur web se fera sur mon serveur de backup dans /media/backup/edmc73.com/var/www Si votre serveur web à un port ssh différent, vous pouvez le spécifier de cette façon. backup root@edmc73.com:/var/www/ edmc73.com/ ssh_args=-p1234 Séparez bien vos colonnes par une tabulation et non par un espace !!! Mettez toujours un / après un nom de répertoire !! ===== Test ===== Pour tester si notre config fonctionne, utilisez la commande rsnapshot configtest qui devrait retourner Syntax OK Ensuite la simulation d'un backup journalier :~# rsnapshot -t daily echo 11500 > /var/run/rsnapshot.pid mkdir -m 0755 -p /media/backup/daily.0/edmc73.com/ /usr/bin/rsync -a --delete --numeric-ids --relative --delete-excluded \ --rsh=/usr/bin/ssh root@edmc73.com:/var/www \ /media/backup/daily.0/edmc73.com/ touch /media/backup/daily.0/ On voit ici ce que va faire rsnapshot. Créer un fichier de lock, créer le répertoire cache, faire un rsync via ssh dans les répertoires qui vont bien. ===== Dernière vérification ===== Assurez vous que votre serveur de backup est bien accès au serveur à sauvegarder via ssh avec une clé public (voir [[linux:ssh|]]) Et assurez-vous d'avoir installez **rsync** sur la machine à sauvegarder aptitude install rsync ===== Activation ===== Pour programmer l'exécution, nous allons configurer le cron de rsnapshot vi /etc/cron.d/rsnapshot Toujours dans mon cas, décommentez la ligne daily et monthly. Vous pouvez lancer la commande suivante à la main rsnapshot -v daily Mais sachez qu'à chaque fois que vous la lancerez, vous décalerez votre sauvegarde. daily.0 deviendra daily.1 et la nouvelle sauvegarde sera daily.0 De ce fait, l'écart entre les 2 daily ne sera pas d'une journée. Donc à éviter ! ===== Sauvegarder un pc sous windows ===== ==== Installer le service rsync ==== Sous windows, un service rsync existe, il s'appelle **cwRsync Server** et est disponible normalement ici => https://www.itefix.no/i2/cwrsync mais à l'heure ou j'écris ces lignes, le site ne répond pas et j'ai trouvé un site non officiel proposant le téléchargement ici => http://www.backupassist.com/rsync/ Exécutez **cwRsyncServer_4.1.0_Installer.exe** et suivez les instructions, n'installez pas SSH (nous sommes dans mon cas dans un réseau local, pas la peine de crypter nos données).\\ Un mot de passe est proposé pour faire tourner le service, laissez ceci par défaut, nous n'en avons pas besoin. ==== Configuration du server ==== Modifiez le fichier **C:\Program Files\cwRsyncServer\rsyncd.conf** ou **C:\Program Files\ICW\rsyncd.conf** use chroot = false strict modes = false hosts allow = * log file = rsyncd.log # Module definitions # Remember cygwin naming conventions : c:\work becomes /cygwin/c/work # [test] path = /cygdrive/c/Documents and Settings/Moi read only = false transfer logging = no UID = 0 GID = 0 exclude from =/cygdrive/C/Program Files/ICW/exclude.txt * Les 4 premières lignes se sont écrites automatiquement et je pense que vous pouvez spécifier le **hosts allow** pour mettre l'adresse ip du server rsnapshot pour les plus parano d'entre nous. * **test** est le nom du module qui sera appelé par notre rsnapshot * **path** comme le dit le commentaire par défaut, le chemin d'accès à sauvegarder doit s'écrire en commençant par /cygdrive/la lettre du lecteur/le répertoire .... * **read only** peut importe, rsnapshot ne fait que lire, mais pour les plus parano... * **transfert logging** si vous voulez logguer chaque fichier transférer. Bien pour le débug, sinon à part remplir inutilement l'espace disque, je vois pas. * **uid=0 et gid=0** j'ai rajouté ces 2 lignes car j'avais l'erreur **Invalid uid nobody** * **exclude from** Fichier contenant la liste des dossiers/fichiers à exclure Exemple : - /Recent/ - /Local Settings/Temp/ - /Local Settings/Historique/ - /Local Settings/Temporary Internet Files/ - /Cookies/ - /Favoris/ - /IECompatCache/ - /IETldCache/ - /PrivacIE/ - /SendTo/ - /UserData/ - /Voisinage*/ - Thumbs.db - desktop.ini - NTUSER.DAT - ntuser.dat.LOG En savoir plus sur les exclusions => https://www.itefix.no/i2/content/excluding-directories-cwrsync ==== Démarrer le service ==== Allez dans votre gestionnaire de service ou pour aller plus vite **[Touche Windows]+r** tapez **services.msc** puis **Entrée** Recherchez **RsyncServer**. Par défaut il est en **Manuel**, double-cliquez dessus, mettez le type de démarrage en automatique pour qu'il se lance à l'ouverture de Windows puis cliquez sur Démarrer pour lancer le service. Pensez à ouvrir le port 873 de votre firewall \\ "Pare-feu Windows Defender" / "Paramètres avancés"\\ "Règles de trafic entrant" "RsyncServer" \\ "Protocoles et ports" : TCP : 873 \\ "Etendue" : ajouter l'adresse ip de votre serveur Pour vérifier votre config, allez sur votre serveur de backup et listez les fichiers qui seront synchronisés avec la commande rsync -n 192.168.0.1::test Aucune modification ne sera faite. ==== Configurer rsnapshot ==== Coté rsnapshot, j'ai créé un répertoire différent pour ma machine windows, je vais l'appeler **/media/backup/windows** Je crée un nouveau fichier de config en copiant celui existant cp /etc/rsnapshot.conf /etc/rsnapshot_windows.conf Je m'assure de modifier le répertoire de sauvegarde snapshot_root /media/backup/windows De commenter l'option de rsync à traver ssh # Uncomment this to enable remote ssh backups over rsync. # #cmd_ssh /usr/bin/ssh Adaptez vos intervalles de backup dans la section qui va bien ######################################### # BACKUP INTERVALS # # Must be unique and in ascending order # # i.e. hourly, daily, weekly, etc. # ######################################### Modifiez le **lockfile** si votre sauvegarde est indépendante des autres sauvegardes déjà présentent sur votre serveur. lockfile /var/run/rsnapshot_windows.pid Je conseillerai de décommenter l'option suivante et la mettre à 1. Cela permet que si votre PC est éteint, rsnapshot ne fera pas tourner son cycle de sauvegarde, ce qui évite de perdre de vieilles sauvegarde et de faire une copie pour rien. sync_first 1 L'option **sync first** doit être à **0** la 1ère fois que vous lancerez rsnapshot, sinon rien ne se passe. Si cette option ''sync_first'' pose problème, j'ai trouvé une alternative qui est peut être mieux.\\ Il suffit de tester si le PC est dispo avant de lancer la copie et cela grâce à la pre-commande dispo dans le fichier de config. cmd_preexec /etc/rsnapshot_pre Mettez le script suivant dans **/etc/rsnapshot_pre** /usr/bin/rsync 192.168.0.1::Test # ou votre nom de partage if [ $? -ne 0 ] # on test si le code de retour de la commande rsync est différente de zéro then echo "rsyncd indisponible. PC éteint?" exit 1 fi Et le point de backup backup 192.168.0.1::test PC-MOI/ On retrouve l'adresse ip du PC windows à sauvegarder, le double **"::"** qui permet de spécifier le module sur lequel on se connecte. On retrouve notre **test** et le nom du répertoire à destination de la sauvegarde. Il ne reste plus qu'a configurer notre cron.d vi /etc/cron.d/rsnapshot Ajoutez les lignes suivantes suivant vos intervalles 0 20 * * * root /usr/bin/rsnapshot -c /etc/rsnapshot_windows.conf daily 30 19 1 * * root /usr/bin/rsnapshot -c /etc/rsnapshot_windows.conf monthly Ici j'ai décidé de lancer le backup à 20h, l'option **-c** de rsnaphot permet de définir un fichier de config spécifique. Et voila, il ne vous reste plus qu'à installer un petit [[linux:samba|server samba]] afin d'accéder facilement à vos backup depuis windows et vous voila tranquille ;) ===== Logguer les étapes rsync ===== Créer un script intermédiaire qui sera appelé par rsnapshot en tant que programme rsync (voir fichier de conf) # Votre traitement pour logguer ce que vous voulez /usr/bin/rsync $@ if [ $? -ne 0 ] then # traitement si la commande rsync échoue else # traitement si la commande rsync à fonctionné fi ===== Etude d'un cas : la gestion des "trou" ===== Condition: sauvegarde sur une partition btrfs avec un rsnapshot configuré avec link_dest qui permet de dire à rsync de créer lui meme les liens dur. La sauvegarde s'effectue tous les soir sur un poste de travail. Quand ce poste de travail est éteint, je me retrouve avec un répertoire de backup vide. Normalement, le lendemain, toutes les données devrait se retélécharger. Et ben non, dans la dernière version de rsnapshot, celui-ci vérifie si le répertoire donné dans link_dest est vide, si c'est le cas, il va chercher plus loin ===== Utiliser les snapshots de btrfs ===== Inspiré du tuto http://it.werther-web.de/2011/10/23/migrate-rsnapshot-based-backup-to-btrfs-snapshots/ Le tuto ci-dessus part d'un disque de backup en ext4 qu'il convertit ensuite en btrfs, donc lisez le si vous êtes dans ce cas.\\ Ici on fait déjà nos backups sur une partition btrfs, on va modifier les appels aux commandes ''cp'' et ''rm'' en les remplaçant par ''btrfs subvolume snapshot'' et ''btrfs subvolume delete'' L'avantage est la rapidité de la création d'un snapshot par rapport à la création de liens physique et aussi que le snapshot conserve toutes les meta-données des fichiers contrairement aux liens physiques. Si vous partez de rien, You must create hourly.0 as a BTRFS subvolume from the outset, otherwise it will be created as a directory and propogate itself. You lose the advantage of BTRFS. # btrfs subvolume create daily.0 # btrfs subvolume create monthly.0 # rsnapshot -c /etc/rsnapshot.conf daily ==== Script de gestion des snapshots ==== Script **rsnapshot_plug_cp_btrfs** qui remplacera la commande **cp** #!/bin/bash # Arg 1: -al # Arg 2: /testbtrfs/backups/hourly.0 # Arg 3: /testbtrfs/backups/hourly.1 /sbin/btrfs subvolume snapshot $2 $3 Script **rsnapshot_plug_rm_btrfs** qui remplacera la commande **rm** #!/bin/bash # Arg 1: -rf # Arg 2: /testbtrfs/backups/hourly.4/ # echo 1: $1 2: $@ # Essaie de supprimer le répertoire donné avec la commande btrfs subvolume delete en premier # Si la commande échoue, on supprime le répertoire avec la commande rm if [ "$1" = "-rf" -a "$3" = "" ]; then # "on essaie de supprimer avec btrfs" /sbin/btrfs subvolume delete $2 error=$? if [ $error -eq 13 ]; then # EC 13 => Le répertoire spécifié n'est pas un sous volume rm $@ elif [ $error -ne 0 ]; then echo Erreur en supprimant avec btrfs $? fi else rm $@ fi Copier ces fichiers ou vous le souhaitez et rendez les exécutables avec **chmod 755** ==== Migration ==== Maintenant il faut migrer nos répertoires de sauvegarde en sous volume btrfs. Un script plus poussé est fourni dans le tuto en lien au début de ce chapitre. Ici nous le prenons le cas de backup uniquement journalier (daily) D'abord on créer un répertoire **old** pour y stocker tous nos backup daily mkdir old mv daily.* old Maintenant nous allons créer un sous volume du plus vieux des backups et y copier son contenu btrfs subvolume create daily.29 rsync -avi --numeric-ids old/daily.29/ daily.29/ Ensuite nous allons créer un snapshot de ce sous volume et synchroniser celui avec le backup suivant et remonter ainsi jusqu'au dernier backup le plus récent. btrfs subvolume snapshot daily.29 daily.28 rsync -avi --delete --numeric-ids old/daily.28/ daily.28/ btrfs subvolume snapshot daily.28 daily.27 rsync -avi --delete --numeric-ids old/daily.27/ daily.27/ ... btrfs subvolume snapshot daily.1 daily.0 rsync -avi --delete --numeric-ids old/daily.0/ daily.0/ On doit aussi pouvoir faire un petit script avec une boucle for (( c=29; c>0; c-- )) do btrfs subvolume snapshot daily.$c daily.$(($c - 1)) rsync -avi --delete --numeric-ids old/daily.$(($c - 1))/ daily.$(($c - 1))/ done On supprime ensuite les vieux backups rm -fr old ==== Configuration ==== Maintenant il faut modifier votre fichier de config **rsnapshot.conf**\\ Je ne sais pas si l'option suivante est nécessaire, mais dans le doute no_create_root 1 Maintenant nos 2 scripts. Adapter suivant le chemin ou vous avez placé vos scripts cmd_cp /bin/rsnapshot_plug_cp_btfrs cmd_rm /bin/rsnapshot_plug_rm_btfrs A tester aussi one_fs 1