mathieu revised this gist . Go to revision
1 file changed, 3 deletions
btrfs-backup.sh
@@ -6,9 +6,6 @@ LOCAL_DEST="/snapshots" | |||
6 | 6 | DEST="/run/media/mathieu/ext_ssd/backups" | |
7 | 7 | KEEP_LOCAL=10 # Nombre de snapshots locaux à conserver | |
8 | 8 | KEEP_DISTANT=31 # Nombre de snapshots distant à conserver | |
9 | - | # KEEP_DAILY=7 # Rétention des snapshots distants | |
10 | - | # KEEP_WEEKLY=4 | |
11 | - | # KEEP_MONTHLY=6 | |
12 | 9 | DATE=$(date +"%Y-%m-%d_%H-%M-%S") | |
13 | 10 | SNAPSHOT_NAME="$DATE" | |
14 | 11 | LAST_RUN_FILE="$DEST/.last_run" |
mathieu revised this gist . Go to revision
1 file changed, 126 insertions
btrfs-backup.sh(file created)
@@ -0,0 +1,126 @@ | |||
1 | + | #!/usr/bin/env bash | |
2 | + | ||
3 | + | # Config | |
4 | + | SOURCE="/home" | |
5 | + | LOCAL_DEST="/snapshots" | |
6 | + | DEST="/run/media/mathieu/ext_ssd/backups" | |
7 | + | KEEP_LOCAL=10 # Nombre de snapshots locaux à conserver | |
8 | + | KEEP_DISTANT=31 # Nombre de snapshots distant à conserver | |
9 | + | # KEEP_DAILY=7 # Rétention des snapshots distants | |
10 | + | # KEEP_WEEKLY=4 | |
11 | + | # KEEP_MONTHLY=6 | |
12 | + | DATE=$(date +"%Y-%m-%d_%H-%M-%S") | |
13 | + | SNAPSHOT_NAME="$DATE" | |
14 | + | LAST_RUN_FILE="$DEST/.last_run" | |
15 | + | LAST_SNAPSHOT_FILE="$DEST/.last_snapshot" | |
16 | + | ||
17 | + | get_age_days() { | |
18 | + | local file=$1 | |
19 | + | local file_time=$(date -r "$file" +%s) | |
20 | + | local current_time=$(date +%s) | |
21 | + | echo $(((current_time - file_time) / 86400)) | |
22 | + | } | |
23 | + | ||
24 | + | if ! mountpoint -q "$DEST/.."; then | |
25 | + | echo "Erreur: Le disque externe n'est pas monté sur $DEST" | |
26 | + | exit 1 | |
27 | + | fi | |
28 | + | ||
29 | + | # Vérifier la dernière exécution | |
30 | + | if [ -f "$LAST_RUN_FILE" ]; then | |
31 | + | last_run=$(cat "$LAST_RUN_FILE") | |
32 | + | days_since_last_run=$((($(date +%s) - $(date -d "$last_run" +%s)) / 86400)) | |
33 | + | if [ $days_since_last_run -gt 7 ]; then | |
34 | + | echo "Attention: $days_since_last_run jours se sont écoulés depuis la dernière sauvegarde." | |
35 | + | fi | |
36 | + | else | |
37 | + | echo "Première exécution détectée." | |
38 | + | fi | |
39 | + | ||
40 | + | # Créer un nouveau snapshot en lecture seule de /home | |
41 | + | if sudo btrfs subvolume snapshot -r "$SOURCE" "$LOCAL_DEST/$SNAPSHOT_NAME"; then | |
42 | + | echo "Snapshot local créé avec succès: $LOCAL_DEST/$SNAPSHOT_NAME" | |
43 | + | else | |
44 | + | echo "Erreur lors de la création du snapshot local" | |
45 | + | exit 1 | |
46 | + | fi | |
47 | + | ||
48 | + | # Envoyer le snapshot vers la destination | |
49 | + | if [ -f "$LAST_SNAPSHOT_FILE" ]; then | |
50 | + | last_snapshot=$(cat "$LAST_SNAPSHOT_FILE") | |
51 | + | if [ -d "$LOCAL_DEST/$last_snapshot" ]; then | |
52 | + | echo "Envoi d'un snapshot incrémentiel..." | |
53 | + | if sudo btrfs send -p "$LOCAL_DEST/$last_snapshot" "$LOCAL_DEST/$SNAPSHOT_NAME" | sudo btrfs receive "$DEST"; then | |
54 | + | echo "Snapshot incrémental envoyé avec succès vers $DEST/$SNAPSHOT_NAME" | |
55 | + | else | |
56 | + | echo "Erreur lors de l'envoi du snapshot incrémentiel. Tentative d'envoi complet..." | |
57 | + | if sudo btrfs send "$LOCAL_DEST/$SNAPSHOT_NAME" | sudo btrfs receive "$DEST"; then | |
58 | + | echo "Snapshot complet envoyé avec succès vers $DEST/$SNAPSHOT_NAME" | |
59 | + | else | |
60 | + | echo "Erreur lors de l'envoi du snapshot complet" | |
61 | + | sudo btrfs subvolume delete "$LOCAL_DEST/$SNAPSHOT_NAME" | |
62 | + | exit 1 | |
63 | + | fi | |
64 | + | fi | |
65 | + | else | |
66 | + | echo "Le snapshot précédent n'existe pas localement. Envoi d'un snapshot complet..." | |
67 | + | if sudo btrfs send "$LOCAL_DEST/$SNAPSHOT_NAME" | sudo btrfs.receive "$DEST"; then | |
68 | + | echo "Snapshot complet envoyé avec succès vers $DEST/$SNAPSHOT_NAME" | |
69 | + | else | |
70 | + | echo "Erreur lors de l'envoi du snapshot complet" | |
71 | + | sudo btrfs subvolume delete "$LOCAL_DEST/$SNAPSHOT_NAME" | |
72 | + | exit 1 | |
73 | + | fi | |
74 | + | fi | |
75 | + | else | |
76 | + | echo "Aucun snapshot précédent trouvé. Envoi d'un snapshot complet..." | |
77 | + | if sudo btrfs send "$LOCAL_DEST/$SNAPSHOT_NAME" | sudo btrfs receive "$DEST"; then | |
78 | + | echo "Snapshot complet envoyé avec succès vers $DEST/$SNAPSHOT_NAME" | |
79 | + | else | |
80 | + | echo "Erreur lors de l'envoi du snapshot complet" | |
81 | + | sudo btrfs subvolume delete "$LOCAL_DEST/$SNAPSHOT_NAME" | |
82 | + | exit 1 | |
83 | + | fi | |
84 | + | fi | |
85 | + | ||
86 | + | # Mettre à jour les fichiers de suivi | |
87 | + | date +"%Y-%m-%d %H:%M:%S" >"$LAST_RUN_FILE" | |
88 | + | echo "$SNAPSHOT_NAME" >"$LAST_SNAPSHOT_FILE" | |
89 | + | ||
90 | + | # Fonction de nettoyage des snapshots locaux | |
91 | + | cleanup_local_snapshots() { | |
92 | + | echo "Nettoyage des snapshots locaux..." | |
93 | + | local snapshots=($(ls -1d "$LOCAL_DEST"/20*_*-*-* | sort -r)) | |
94 | + | local count=0 | |
95 | + | for snapshot in "${snapshots[@]}"; do | |
96 | + | if [ $count -ge $KEEP_LOCAL ]; then | |
97 | + | echo "Suppression du snapshot local: $snapshot" | |
98 | + | sudo btrfs subvolume delete "$snapshot" | |
99 | + | fi | |
100 | + | count=$((count + 1)) | |
101 | + | done | |
102 | + | } | |
103 | + | ||
104 | + | # Fonction de nettoyage des snapshots sur la destination | |
105 | + | cleanup_remote_snapshots() { | |
106 | + | echo "Nettoyage des snapshots distants..." | |
107 | + | cd "$DEST" || exit | |
108 | + | ||
109 | + | local snapshots=($(ls -1d 20*_*-*-* | sort -r)) | |
110 | + | ||
111 | + | for snapshot in "${snapshots[@]}"; do | |
112 | + | local age=$(get_age_days "$snapshot") | |
113 | + | ||
114 | + | # Supprimer tous les snapshots plus vieux que 31 jours | |
115 | + | if [ $age -gt $KEEP_DISTANT ]; then | |
116 | + | echo "Suppression du snapshot distant: $snapshot" | |
117 | + | sudo btrfs subvolume delete "$snapshot" | |
118 | + | fi | |
119 | + | done | |
120 | + | } | |
121 | + | ||
122 | + | # Exécuter le nettoyage | |
123 | + | cleanup_local_snapshots | |
124 | + | cleanup_remote_snapshots | |
125 | + | ||
126 | + | echo "Sauvegarde et nettoyage terminés" |