informatique:projets:sauvegarde_donnees
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
informatique:projets:sauvegarde_donnees [2024/11/19 18:52] – supprimée - modification externe (Date inconnue) 127.0.0.1 | informatique:projets:sauvegarde_donnees [2024/11/24 09:42] (Version actuelle) – alexis | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | {{tag> | ||
+ | ====== Mise en place de sauvegardes ====== | ||
+ | |||
+ | Avec les ordinateurs, | ||
+ | |||
+ | Pour avoir un système de sauvegardes efficaces, il faut respecter la règle '' | ||
+ | * <wrap hi>Avoir 3 sauvegardes différentes</ | ||
+ | * <wrap hi>Avoir 2 types de support différents pour les sauvegardes</ | ||
+ | * <wrap hi>Avoir 1 supports à un emplacement différent</ | ||
+ | |||
+ | À cela, j' | ||
+ | * Il faut tester ses sauvegardes régulièrement car des sauvegardes desquelles on ne peut pas récupérer de données sont des sauvegardes inutiles. | ||
+ | * Il faut sauvegarder régulièrement pour perdre le moins possible de choses en cas de défaillance. | ||
+ | |||
+ | <WRAP info> | ||
+ | Pour l' | ||
+ | </ | ||
+ | |||
+ | == Sauvegarde des données locales sur un disque local == | ||
+ | |||
+ | La première étape fut de sauvegarder mes données sur un disque local. C'est un disque physique différent qui ne sert qu'à cela. Il est dans ma machine à côté de mes disques courants. J' | ||
+ | |||
+ | Pour réaliser ma sauvegarde, j'ai écrit un script qui : | ||
+ | - Monte le disque contenant les sauvegardes, | ||
+ | - Supprime les sauvegardes antérieures à 30 jours, | ||
+ | - Cré une nouvelle sauvegarde des répertoires et fichiers listés dans le fichier de configuration, | ||
+ | - Démonte le disque précédemment monté, | ||
+ | - Nettoie le système. | ||
+ | |||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | NAME=" | ||
+ | BACKUP=/ | ||
+ | TEMPFILE=/ | ||
+ | |||
+ | echo "-= Mount backup drive =-" | ||
+ | if [ `mount | grep -c $BACKUP` -eq 0 ]; | ||
+ | then | ||
+ | mkdir $BACKUP | ||
+ | mount /dev/sdb1 $BACKUP | ||
+ | fi | ||
+ | |||
+ | echo "-= Delete old backups =-" | ||
+ | rdiff-backup --verbosity 0 --force --remove-older-than 30D $BACKUP | ||
+ | |||
+ | echo "-= Create new backup =-" | ||
+ | find /home -name .$NAME -exec cat {} > $TEMPFILE + | ||
+ | echo " | ||
+ | echo "- **" >> $TEMPFILE | ||
+ | rdiff-backup --verbosity 0 --include-globbing-filelist $TEMPFILE /home $BACKUP | ||
+ | |||
+ | echo "-= Unmount backup drive =-" | ||
+ | umount $BACKUP | ||
+ | rmdir $BACKUP | ||
+ | |||
+ | echo "-= Clean system =-" | ||
+ | rm $TEMPFILE | ||
+ | </ | ||
+ | |||
+ | Le fichier de configuration liste les répertoires et fichiers à sauvegarder. Voici un petit exemple de la syntaxe à utiliser : | ||
+ | <code ini> | ||
+ | ; Fichier simple | ||
+ | / | ||
+ | |||
+ | ; Fichiers avec un motif | ||
+ | / | ||
+ | |||
+ | ; Répertoire simple | ||
+ | / | ||
+ | |||
+ | ; Répertoire avec espaces | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | Ce script peut être lancé manuellement mais c'est plus intéressant de le lancer automatiquement pour ne plus avoir à y penser. Il y a quelques années j' | ||
+ | |||
+ | J'ai créé le fichier ''/ | ||
+ | <code ini> | ||
+ | [Unit] | ||
+ | Description=Backup on internal disk | ||
+ | Requires=home.mount | ||
+ | After=home.mount | ||
+ | |||
+ | [Service] | ||
+ | ExecStart=/ | ||
+ | Type=oneshot | ||
+ | |||
+ | [Install] | ||
+ | WantedBy=graphical.target | ||
+ | </ | ||
+ | |||
+ | Pour l' | ||
+ | <code bash> | ||
+ | systemctl enable local.backup | ||
+ | </ | ||
+ | |||
+ | Je peux également également connaître l' | ||
+ | <code bash> | ||
+ | systemctl status local.backup | ||
+ | </ | ||
+ | |||
+ | == Sauvegarde des données locales sur un disque externe == | ||
+ | La seconde étape fut de sauvegarder sur un disque externe. Pour cela, j'ai fait quasiment comme pour la sauvegarde sur mon disque interne. | ||
+ | |||
+ | Pour réaliser ma sauvegarde, j'ai écrit un script qui : | ||
+ | - Attend le montage du disque contenant les sauvegardes, | ||
+ | - Supprime les sauvegardes antérieures à 300 jours, | ||
+ | - Cré une nouvelle sauvegarde des répertoires et fichiers listés dans le fichier de configuration, | ||
+ | - Démonte le disque précédemment monté, | ||
+ | - Nettoie le système. | ||
+ | |||
+ | Les actions effectuées sont vraiment similaires, du coup, le script l'est aussi. La différence vient du système d' | ||
+ | |||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | NAME=" | ||
+ | BACKUP="/ | ||
+ | BACKUPDIR=$BACKUP/ | ||
+ | TEMPFILE=/ | ||
+ | USER=alexis | ||
+ | USERID=`id -u $USER` | ||
+ | BASH=`which bash` | ||
+ | |||
+ | sudo -u $USER $BASH -c " | ||
+ | |||
+ | echo "-= Wait until HDD is mounted =-" | ||
+ | while [ `mount | grep -c $BACKUP` -eq 0 ]; | ||
+ | do | ||
+ | sleep 1s | ||
+ | done | ||
+ | |||
+ | echo "-= Create backup dir =-" | ||
+ | if [ ! -e $BACKUPDIR ]; | ||
+ | then | ||
+ | mkdir $BACKUPDIR | ||
+ | fi | ||
+ | |||
+ | echo "-= Delete old backups =-" | ||
+ | rdiff-backup --verbosity 0 --force --remove-older-than 300D $BACKUPDIR | ||
+ | |||
+ | echo "-= Create new backup =-" | ||
+ | find /home -name .$NAME -exec cat {} > $TEMPFILE + | ||
+ | echo " | ||
+ | echo "- **" >> $TEMPFILE | ||
+ | rdiff-backup --verbosity 0 --force --include-globbing-filelist $TEMPFILE /home $BACKUPDIR | ||
+ | |||
+ | echo "-= Clean system =-" | ||
+ | rm $TEMPFILE | ||
+ | |||
+ | sudo -u $USER $BASH -c " | ||
+ | </ | ||
+ | |||
+ | Comme pour le script précédent, | ||
+ | |||
+ | J'ai créé le fichier ''/ | ||
+ | <code ini> | ||
+ | [Unit] | ||
+ | Description=Backup on external disk | ||
+ | Requires=run-media-alexis-7d5a54b8\x2d259e\x2d4473\x2d8a85\x2d9e588ca30453.mount | ||
+ | After=run-media-alexis-7d5a54b8\x2d259e\x2d4473\x2d8a85\x2d9e588ca30453.mount | ||
+ | |||
+ | [Service] | ||
+ | ExecStart=/ | ||
+ | Type=oneshot | ||
+ | |||
+ | [Install] | ||
+ | WantedBy=graphical.target | ||
+ | </ | ||
+ | |||
+ | À ce moment, il ne reste plus qu'à activer le service pour qu'il soit utilisable au démarrage de la machine. | ||
+ | |||
+ | <WRAP info> | ||
+ | Pour trouver l' | ||
+ | <code bash> | ||
+ | ls -l / | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | <WRAP info> | ||
+ | Pour encoder un chemin en une chaîne de caractères utilisable dans les fichiers de configuration de systemd, il faut lancer la commande suivante : | ||
+ | <code bash> | ||
+ | systemd-escape --path < | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | == Sauvegarde des données locales sur un disque délocalisé == | ||
+ | FIXME | ||
+ | |||
+ | == Sauvegarde des données distantes == | ||
+ | La quatrième étape fut de sauvegarder les données de mes services en ligne (RSS, photos, etc.) sur le disque local. | ||
+ | Pour cela, j'ai fait plusieurs tests peu concluants ((Copie en ligne dans un dossier puis montage SSHFS du dossier puis rsync → toute la donnée est copiée à chaque fois))((Rsync à travers SSH → refus de connexion après un certain temps))((Mysqldump en local → temps de traitements trop long)) avant de trouver quelque chose qui fonctionne. | ||
+ | |||
+ | Finalement, j'ai écrit un script qui : | ||
+ | - Sauvegarde les données du cron, | ||
+ | - Lance une sauvegarde des bases de données à distance et qui les compresse, | ||
+ | - Monte le disque distant en local avec SSHFS, | ||
+ | - Synchronise l' | ||
+ | - Nettoie le système. | ||
+ | |||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | |||
+ | SSH_CONNECTION=< | ||
+ | IDENTITY=/ | ||
+ | USER_NAME=backup | ||
+ | MOUNT_POINT=/ | ||
+ | MYSQL_HOST=< | ||
+ | MYSQL_USER=< | ||
+ | MYSQL_PASSWD=< | ||
+ | |||
+ | USER=alexis | ||
+ | USERID=`id -u $USER` | ||
+ | |||
+ | sudo -u $USER / | ||
+ | |||
+ | # Extract crontab | ||
+ | ssh -i $IDENTITY $SSH_CONNECTION " | ||
+ | |||
+ | # Dump databases | ||
+ | dbs[0]=< | ||
+ | … | ||
+ | dbs[n]=< | ||
+ | |||
+ | for i in " | ||
+ | do | ||
+ | ssh -i $IDENTITY $SSH_CONNECTION " | ||
+ | done | ||
+ | |||
+ | # Save files | ||
+ | mkdir $MOUNT_POINT | ||
+ | sshfs $SSH_CONNECTION: | ||
+ | |||
+ | files[0]=< | ||
+ | … | ||
+ | files[n]=< | ||
+ | |||
+ | for i in " | ||
+ | do | ||
+ | if [[ -d $MOUNT_POINT/ | ||
+ | mkdir -p / | ||
+ | fi | ||
+ | rsync -azq --delete --force $MOUNT_POINT/ | ||
+ | done | ||
+ | |||
+ | umount $MOUNT_POINT | ||
+ | rmdir $MOUNT_POINT | ||
+ | |||
+ | sudo -u $USER / | ||
+ | </ | ||
+ | |||
+ | Comme pour les autres scripts, j'ai laissé systemd s' | ||
+ | <code ini> | ||
+ | [Unit] | ||
+ | Description=Backup distant on internal disk | ||
+ | Requires=home.mount | ||
+ | After=home.mount | ||
+ | |||
+ | [Service] | ||
+ | ExecStart=/ | ||
+ | Type=oneshot | ||
+ | |||
+ | [Install] | ||
+ | WantedBy=graphical.target | ||
+ | </ | ||
+ | |||
+ | Cependant, je voulais le lancer un peu en différé par rapport à la séquence de démarrage. J'ai donc créé le fichier ''/ | ||
+ | <code ini> | ||
+ | [Unit] | ||
+ | Description=Run distant backup on boot | ||
+ | |||
+ | [Timer] | ||
+ | OnBootSec=30min | ||
+ | |||
+ | [Install] | ||
+ | WantedBy=timers.target | ||
+ | </ | ||
+ | |||
+ | C'est ce dernier qu'il faut activer pour qu'il soit utilisable au démarrage de la machine. | ||
+ | |||
+ | == Restauration de données == | ||
+ | La dernière étape est de vérifier que les sauvegardes sont utilisables. C'est une opération qu'il faut faire régulièrement pour s' | ||
+ | |||
+ | Avec '' | ||
+ | |||
+ | * Lister les incréments | ||
+ | <code bash> | ||
+ | # Liste les incréments par date | ||
+ | rdiff-backup --list-increments / | ||
+ | |||
+ | # Liste les incréments par date en affichant leur taille | ||
+ | rdiff-backup --list-increment-sizes / | ||
+ | </ | ||
+ | |||
+ | * Lister les fichiers | ||
+ | <code bash> | ||
+ | # Liste les fichiers présents il y a 3 jours | ||
+ | rdiff-backup --list-at-time 3D / | ||
+ | |||
+ | # Liste les fichiers présents à la date sélectionnée | ||
+ | rdiff-backup --list-at-time "Fri Oct 22 21:29:12 2010" / | ||
+ | |||
+ | # Liste les changements effectués depuis 3 jours | ||
+ | rdiff-backup --list-changed-since 3D / | ||
+ | |||
+ | # Liste les changements effectués depuis la date sélectionnée | ||
+ | rdiff-backup --list-changed-since "Fri Oct 22 21:29:12 2010" / | ||
+ | </ | ||
+ | |||
+ | * Restaurer des données | ||
+ | <code bash> | ||
+ | # Restaure le premier incrément antérieur à 3 jours dans le répertoire / | ||
+ | # Le répertoire / | ||
+ | rdiff-backup -r 3D / | ||
+ | |||
+ | # Restaure le premier incrément antérieur ou égal à la date sélectionnée dans le répertoire / | ||
+ | # Le répertoire / | ||
+ | rdiff-backup -r "Fri Oct 22 21:29:12 2010" / | ||
+ | </ | ||
+ | |||
+ | <WRAP todo> | ||
+ | Liens à étudier : | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[http:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[http:// | ||
+ | * [[https:// | ||
+ | * [[http:// | ||
+ | </ | ||