From 4c036d6c86668114683edc5f66802d62ecca7318 Mon Sep 17 00:00:00 2001 From: DBa20-24 Date: Tue, 14 Jan 2025 12:57:35 +0000 Subject: [PATCH 1/3] Snapshots --- .raspiBackup.sh.swp | Bin 0 -> 16384 bytes config/raspiBackup_de.conf | 3 ++ config/raspiBackup_en.conf | 3 ++ extensions/raspiBackup_snapshot_pre.sh | 46 +++++++++++++++++++++++++ raspiBackup.sh | 41 +++++++++++++++++++++- 5 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 .raspiBackup.sh.swp create mode 100755 extensions/raspiBackup_snapshot_pre.sh diff --git a/.raspiBackup.sh.swp b/.raspiBackup.sh.swp new file mode 100644 index 0000000000000000000000000000000000000000..5fd578f9d59b5552192d51c57cbc83a3840f7d77 GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/config/raspiBackup_de.conf b/config/raspiBackup_de.conf index 77553497..8d44c080 100644 --- a/config/raspiBackup_de.conf +++ b/config/raspiBackup_de.conf @@ -189,3 +189,6 @@ DEFAULT_PARTITIONS_TO_BACKUP="1 2" # Name der Backuppartition die dynamisch gemounted werden soll (z.B. /dev/sda1 oder /backup), muss sonst leer sein um keinen dynamischen Mount zu benutzen DEFAULT_DYNAMIC_MOUNT="" + +# Snapshots benutzen +USE_FS_SNAPSHOTS="0" diff --git a/config/raspiBackup_en.conf b/config/raspiBackup_en.conf index 6029b4b8..acaa97d0 100644 --- a/config/raspiBackup_en.conf +++ b/config/raspiBackup_en.conf @@ -189,3 +189,6 @@ DEFAULT_PARTITIONS_TO_BACKUP="1 2" # Name of backup partition to dynamically mount (e.g. /dev/sda1 or /backup), should be empty to disable dynamic mount DEFAULT_DYNAMIC_MOUNT="" + +# Use FS Snapshots +DEFAULT_USE_FS_SNAPSHOTS="0" diff --git a/extensions/raspiBackup_snapshot_pre.sh b/extensions/raspiBackup_snapshot_pre.sh new file mode 100755 index 00000000..497c79b4 --- /dev/null +++ b/extensions/raspiBackup_snapshot_pre.sh @@ -0,0 +1,46 @@ +#!/bin/bash +####################################################################################################################### +# +# Sample plugin for raspiBackup.sh +# called before a backup is started +# +# Function: stop services, create snapshot, start services again, unset the variables for STOP- and STARTSERVICES. +# +# See http://www.linux-tips-and-tricks.de/raspiBackup for additional information +# +####################################################################################################################### +# +# Copyright (c) 2015-2021 framp at linux-tips-and-tricks dot de +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see .# +# +####################################################################################################################### + +# we have STARTSERVICES and STOPSERVICES + +export SNAPDEST="/.snapshot-raspiBackup-$BACKUPFILE" + +# create the snapshot +btrfs subvolume snapshot / $SNAPDEST + +# start services again +eval $STARTSERVICES + +# Now the funny part: since we already took the snapshot, we don't need to start/stop the services during the actual backup (assumption: boot partition is stable) +# However, we want to remove the snapshot afterwards +export STOPSERVICES="" +export STARTSERVICES="btrfs subvolume delete $SNAPDEST" + + + diff --git a/raspiBackup.sh b/raspiBackup.sh index a3ce4414..e48a0f20 100755 --- a/raspiBackup.sh +++ b/raspiBackup.sh @@ -253,6 +253,8 @@ export BACKUP_TARGETDIR export BACKUP_TARGETFILE export MSG_FILE export LOG_FILE +export STOPSERVICES +export STARTSERVICES # Telegram options @@ -1931,6 +1933,9 @@ MSG_DE[$MSG_SYNC_CMDLINE_FSTAB]="RBK0295I: %s und %s werden synchronisiert." OVERLAY_FILESYSTEM_NOT_SUPPORTED=296 MSG_EN[$OVERLAY_FILESYSTEM_NOT_SUPPORTED]="RBK0296E: Overlay filesystem is not supported." MSG_DE[$OVERLAY_FILESYSTEM_NOT_SUPPORTED]="RBK0296E: Overlayfilesystem wird nicht unterstützt." +MSG_EXTRA_MOUNT_OPTS=297 +MSG_EN[$MSG_EXTRA_MOUNT_OPTS]="RBK0341I: Mount options for %s: %s." +MSG_DE[$MSG_EXTRA_MOUNT_OPTS]="RBK0341I: Mount Optionen für %s: %s." declare -A MSG_HEADER=( ['I']="---" ['W']="!!!" ['E']="???" ) @@ -2904,6 +2909,8 @@ function initializeDefaultConfigVariables() { DEFAULT_DYNAMIC_MOUNT="" # Define bootdevice (e.g. /dev/mmcblk0, /dev/nvme0n1 or /dev/sda) and turn off boot device autodiscovery DEFAULT_BOOT_DEVICE="" + # Use native filesystem snapshots + DEFAULT_USE_FS_SNAPSHOTS="0" ############# End default config section ############# } @@ -2987,6 +2994,7 @@ function copyDefaultConfigVariables() { YES_NO_RESTORE_DEVICE="$DEFAULT_YES_NO_RESTORE_DEVICE" ZIP_BACKUP="$DEFAULT_ZIP_BACKUP" DYNAMIC_MOUNT="$DEFAULT_DYNAMIC_MOUNT" + USE_FS_SNAPSHOTS="$DEFAULT_USE_FS_SNAPSHOTS" checkImportantParameters @@ -8172,6 +8180,24 @@ function updateRestoreReminder() { logExit +} + function extraMountOptions() { # devid + logEntry "$1" + FSTYPE=$(findmnt -n -o FSTYPE "$1" || echo "none" ) + if [ ! $FSTYPE == "btrfs" ] ; then + echo "" + logExit "$1 is $FSTYPE, not btrfs - skipping setting mount options" + return + fi + logItem "FS type of $1: $FSTYPE" + local mntpoint + mntpoint=$(cat /proc/mounts|grep $1 | awk '{ print $2; }') + if [ -z "$(btrfs subvol list $mntpoint|grep ${SNAPDEST#/})" ] ; then + echo "" + logExit + fi + echo "-o ro,subvol=$SNAPDEST" + logExit } function mountAndCheck() { # device mountpoint @@ -8185,7 +8211,14 @@ function mountAndCheck() { # device mountpoint exitError $RC_MISC_ERROR fi fi - mount "$1" "$2" &>>"$LOG_FILE" + if [ -n "$USE_FS_SNAPSHOTS" -a "$USE_FS_SNAPSHOTS" == "1" -a -n "$SNAPDEST" ]; then + mountOpts=$(extraMountOptions "$1") + writeToConsole $MSG_LEVEL_MINIMAL $MSG_EXTRA_MOUNT_OPTS "$1" "$mountOpts" + else + mountOpts="" + fi + mount $mountOpts "$1" "$2" &>>"$LOG_FILE" || mount -o ro "$1" "$2" &>>"$LOG_FILE" # try with mountopts, fallback to regular mount on fail + local rc=$? if (( $rc )); then writeToConsole $MSG_LEVEL_MINIMAL $MSG_MOUNT_CHECK_ERROR "$1" "$2" "$rc" @@ -8827,6 +8860,7 @@ function usageEN() { echo "-P use partitionoriented backup mode" echo "-t {backupType} ($ALLOWED_TYPES) (default: $DEFAULT_BACKUPTYPE)" echo "-T \"{List of partitions to save}\" (Partition numbers, e.g. \"1 2 3\"). Only valid with parameter -P (default: ${DEFAULT_PARTITIONS_TO_BACKUP})" + echo "--snapshots Use filesystem snapshots" echo "" echo "-Restore options-" echo "-0 SD card will not be formatted" @@ -8879,6 +8913,7 @@ function usageDE() { echo "-P Nutzung des partitionsorientierten Backupmode" echo "-t {Backuptyp} ($ALLOWED_TYPES) (Standard: $DEFAULT_BACKUPTYPE)" echo "-T \"Liste der Partitionen die zu Sichern sind}\" (Partitionsnummern, z.B. \"1 2 3\"). Nur gültig zusammen mit Parameter -P (Standard: ${DEFAULT_PARTITIONS_TO_BACKUP})" + echo "--snapshots Snapshots des Filesystems benutzen echo "" echo "-Restore Optionen-" echo "-0 Keine Formatierung der SD Karte" @@ -9373,6 +9408,10 @@ while (( "$#" )); do SMART_RECYCLE_OPTIONS="$o"; shift 2 ;; + --snapshots|--snapshot) + USE_FS_SNAPSHOTS=$(getEnableDisableOption "$1"); shift 1 + ;; + --systemstatus|--systemstatus[+-]) SYSTEMSTATUS=$(getEnableDisableOption "$1"); shift 1 ;; From 23255a2989d3b9df25b5b87624aba781a36af6c1 Mon Sep 17 00:00:00 2001 From: DBa20-24 <158530782+DBa20-24@users.noreply.github.com> Date: Wed, 15 Jan 2025 06:47:44 +0100 Subject: [PATCH 2/3] Delete .raspiBackup.sh.swp --- .raspiBackup.sh.swp | Bin 16384 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .raspiBackup.sh.swp diff --git a/.raspiBackup.sh.swp b/.raspiBackup.sh.swp deleted file mode 100644 index 5fd578f9d59b5552192d51c57cbc83a3840f7d77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI2dvqLC9mfX*H9)}@K~RC)&6Xr3yPF5lk~Xc|WYg{;+0@-lOKfYL-JQ)2nVp%= z%;rHGS~wsGdhl?LdgT2oPz0&G#1|-vCxe?#E^BHl#&DC&@J|DVKT#Crt( z58`daZGr!tc%1kqfxkh#nfRju|C@0CcLe@A@kY{b{($$!_kRcRj2)qvZbu0^deFLHt&Mzbx?Q z1pX)De*b3fAN2o^#QpK>5co?1FAMxdfnO-_KM4FTfxke!p8EH)z@HcRj1LC=e~!4{ zzZQW%OWe=jL4p5X&_74u&k*sPK>Xwbg8IKE zULt;zz#k971~Q2&R-{rtIE;CB=E^XKTpg8Fw6FOvPu0{;Q=D~KO-cu@cQ#6L^? zMuC5i_^HGX_*hW?y8?Fv{vG1yk^WYJ-$~rh@5&KD``;#hCh5N}@H>c)6CXV?sDC^0 zGVxagejD+%#Pc5y>fcIyjQG6*zlFG8Ulx8MsQ)d2UncM^#5a61bIn~D4WZxr}9 ziI0%}ivqui_$9PcDe()4&x!{9yM*|~#IF?i#l-#mSU4xB zPuo?AmQCpnfs@(rC5%8AfoTztvEk%P*+xE5vFGtW|G$p?(`%5^Amfk@$b86F?8}~p zoC@K4xC0@NV6S%%bf-Prrfkk3J$#petI^1}Y` z3o;L~V?Xo_ay#TUNExC)(vW7z!H_3WP_Bnu4Y?F@F63;;S&$^84)Vahl5{`hPRK=& z5l9SjB;*Oi^Kr--5FXnNklh|j)A^yU{_fO@R5q9H&vZtjeS^7FZx4&om1Y*@ZMu{B z)KGt>cQE0e=F@%NDT{f$tG}-g&3KE5Bzab+u5?Bli#3PE%B+pWN~{5Y3l}b&uE^Fi zTLG~XtD}iTL(?=1oej}kMQ)8YxYwp`ywhg;E;hNdyR|sgi=EoLdc+%f4oqvl&JRMO zgC!R_zfGNd_ z!J>eNrG$EB$sZJR;4a;H6llf)H z0saz^>Pm*LNOg6b*VV0B#bT#17qK;K*s;fYjiV-8zuwm~JABnTwalO~n?+c3ohdt& zl%`Y_-LY4FYRx1rcAoAL{(jAx1Q#-EM_uQXVLCdPja9)Kg2yrkvGAjj*bw(03+e&CgQPvVRnzL!=Q>QzDd&xV+ zTV!`VlS?JWy-{q28|#L{WX)3K(gd>DVU0DrCTrS+3-|@xqG%bqBNv(^siYJ&*-}`{ zV#{;KcQ&k#uIo)_QknkAMQn9TYio2}&p@Utlk7{aYFX29T;O!Fv8jViBH30Us!Ni& zWkc>P&Ghu6?Ieq73TtQX*zDS%l^V2q4NObboidB8)>pT*x36kl(0)Rd^{KjAtyP(& ztgWe*J77$;SwXfdtUcZqXM;wKRpe2HMR(r4KLfvEq6$-bgt0}(w(;yx##M*4op8dt z`s(<;{x@Ag3P*MmIwT?YdH0^kBMP%?7_teY)_|9qt?I*Ub%cjyb!2v+_q*wQ5;lCq8!)*ZBH~BH4)XS9mv&QH_pbV}a|%+m;B=Bwh_PRUh##phCLE zp3^4$xvsduX1ozXP9yA^LrFntaS5M&d`PfMaEmmiRBPKjlxx0pL>4bz%(_!c29|bU zwb5*&%wjT&nJgOROQJLGAmtocMe^yawFw1%r&=nT?ay|w0bNEv`S>W~3f5>Ox|?co zZ_cAcD3)m{_|K{;f}#({BW|tbYeB><0(|N$aLc#EYhBD>rfMo>+!mE`?;KJ+YBUa6 zGcZxzS>sd?Nz*chEx8(JEbUh9W|V7%Evz_>*^x+$jg7^J^;+Dph7+1vRCHUh6N}=W zDPH*Oic!-_Uj4I_qN0vs;AEtvIl&NnK4wcZ18k|HE0(OW<+TFLuwKuU@6)@taFe-e zpum)no~mZkt@~2hu4TzgKDi{_o6Zk1q-#$)pGoC%tfxQAl30AR`E=JnZ!*i44`i43 z=Thil4n2cMp7#apzE-C5%lZfMESVW(E0ftQEDkPkgJXayql)hKK&_gZihhmBmL=;B z@0n*KKP`ehElaBHSSl=|F%~%9`-)-mo61=6c(Fp^D)4HllxteE-~UEX)KQBWrh^&W z#AJPfY1l(qj3za8n;Y!0(2JZ=cHj-pjGA7OxmGh%PzradU?rgeplCNEN}k*B1X^gy z?cpv}+i&_FBY~1-^3k&^=v-l9_W>w#=P>D9=Q?<&P^@*#{GE~Eagg;=0z+0cN@^LF zJX>AJ8A~0mV6#wcVr?z0?Xk9&w&PhD>1i^A2xXx*9&=RFj=?|-kuHuP=GbYJFs6HR zV%0I$lf|~bim6makokEU=Z>OOYdqh&cmy1`=$8#mGsgI8Wh#b=Lc{Ad213PuWS5O` z=T&^nutwa-D0)TKi-zhxIfs&j!Va+8^+{A(y3L2hfLvPT9PO1 zW;UiMBY3G|yH&Ay@Y#eSTQ>a4Rb}jOF>xn~Q`Q)A7`Zn*0ju~;I6TL2GhPsER0O26 zZX;KVO1x-P6Hr&7nrNM$n4geqj)65ziIH0|{-g4OVp$V0Q|0${JG4Tzkpj~S%x=du zUQ(w24&99spAuM7ibhFsdttcwPL;v6jX0x?3oSI|g+rzw@o>m2>wCnkny&LvaIdJc zzIQWdw!25?yC;c%{{JdI!#@t;pa1dE+db~YXMGdW2$=haZAI@8rV(CvLsitl|4JPD}B zcS3js;nXbMd!(C5t;`K2S0vND$tAt1&Q__;f8^esTAodH;XB4|es#=J9VKsc8F(Op rrx($_+|r?5d~4e~)R)er`;xuhC3=kRew*m4<2fza#1r8EF+2YO;M+NJ From 983764fbaa1489102ec12e7c88ccfd80ed628810 Mon Sep 17 00:00:00 2001 From: DBa20-24 <158530782+DBa20-24@users.noreply.github.com> Date: Sun, 19 Jan 2025 12:30:54 +0100 Subject: [PATCH 3/3] Update raspiBackup.sh --- raspiBackup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/raspiBackup.sh b/raspiBackup.sh index e48a0f20..70c7b009 100755 --- a/raspiBackup.sh +++ b/raspiBackup.sh @@ -8913,7 +8913,7 @@ function usageDE() { echo "-P Nutzung des partitionsorientierten Backupmode" echo "-t {Backuptyp} ($ALLOWED_TYPES) (Standard: $DEFAULT_BACKUPTYPE)" echo "-T \"Liste der Partitionen die zu Sichern sind}\" (Partitionsnummern, z.B. \"1 2 3\"). Nur gültig zusammen mit Parameter -P (Standard: ${DEFAULT_PARTITIONS_TO_BACKUP})" - echo "--snapshots Snapshots des Filesystems benutzen + echo "--snapshots Snapshots des Filesystems benutzen" echo "" echo "-Restore Optionen-" echo "-0 Keine Formatierung der SD Karte"