obsolete: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 | ||
| obsolete:informatique:projets:sauvegarde_donnees [2025/04/08 20:27] – supprimée - modification externe (Date inconnue) 127.0.0.1 | obsolete:informatique:projets:sauvegarde_donnees [2025/04/20 09:04] (Version actuelle) – alexis | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| + | ====== 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:// | ||
| + | * [[http:// | ||
| + | * [[https:// | ||
| + | * [[http:// | ||
| + | </ | ||
