BTRFS und Backups

Alles rund um sicherheitsrelevante Fragen und Probleme.
scientific
Beiträge: 3020
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: BTRFS und Backups

Beitrag von scientific » 20.11.2014 10:55:44

Hier einmal mein vorläufiges Skript und ein dazugehöriges kommentiertes Config-File.

Der Usage-Aufruf und die Help-Ausgabe sind noch unvollständig. Auch bin ich mir noch nicht ganz sicher über die Struktur des Archives und der zugehörigen Symlinks.
Außerdem hab ich noch keine Versionsverwaltung für die Snapshots eingebaut. Wieviele Snapshots hebe ich auf, automatisches Löschen von älteren, und ich glaube, es sind die Snapshots noch grundsätzlich ro (was auf dem externen Medium auch so sein soll, aber lokal können sie ruhig rw sein...). Hier wird auch noch über die Commandline zum Auswählen werden.

Das Skript such außerdem - sofern -r angegeben ist, also der Snapshot auch remote gesichert werden soll - beginnend beim jüngsten Snapshot lokal und remote, ob es zwei gleiche Snapshots findet. Ist dem so, wird dieser Snapshot herangezogen um das Diff für »btrfs send« mit dem Current-Snapshot zu erstellen. Gibt es keine zwei gleichen Snapshots lokal und remote, dann wird entweder eine Fehlermeldung ausgegeben oder - wenn »-i« in der Commandline ausgewählt ist - ein Initialer Snapshot nach remote übertragen.

Das heißt also, wenn zwar auf der externen Platte Snapshots vorhanden sind, aber kein gleicher wie lokal, wird ein neuer initialer Snapshot erzeugt. Wenn gar kein Snapshot remote vorhanden ist, wird ebenfalls ein neuer Initialer Snapshot erzeugt. (aber nur wenn eben -i angegeben ist!!!)

Was ich noch einbauen werde ist die Möglichkeit mittels Commandline-option dem Snapshot noch ein Kommentar anzuhängen und eine Benachrichtigung per Mail, wenn etwas schief gelaufen ist, damit dieses Skript auch im Cronjob seinen Dienst verrichten kann.
Dazu muss aber noch eine quiet-Option eingebaut werden, sonst gibts jedesmal eine Benachrichtigung, wenn cron es aufruft. Und das will ich auch nicht.

Aber prinzipiell funktioniert es schon einmal pipifein.

Code: Alles auswählen

# cat /usr/local/bin/mkbackup_btrfs 
#!/bin/bash
#
CONFFILE="/etc/btrfsbck.conf"
SOURCE="/var/cache/btrfs_pool_SYSTEM"
ARCHIVLOCAL="$SOURCE/archive-local"
SNAPDEST="/var/cache/backup"
LOGFILE="/var/log/backupscript.log"

# If REMOTE=1, the local snapshot in the ARCHIVLOCAL is transferred to a remote Mountpoint.
# Set »-r« on the commandline to activate it 
REMOTE=0

# If INIT=1, the Remote Backup is initiated. One copy of your subvolume is transferred and one is stored local, so next backup-run
# only the difference between the last and the current state is transferred (takes a long time, if a big subvolume is initiated first)
# Set »-i« on the commandline to activate it.
# If init is not activated, a error results, if the remote backup doesn't exist!
INIT=0

usage() { echo "Usage: $0 [-r][-i][-c <Config-File>]" 1>&2; exit 1; }

while getopts ":c:irs:p:" o; do
    case "${o}" in
        c)
            CONFFILE=${OPTARG}
            ;;
	i)
	    INIT=1
	    ;;
	r)
	    REMOTE=1
	    ;;
        *)
            usage
            ;;
    esac
done
shift $((OPTIND-1))

SOURCE="`awk -F "=" '$1 ~ /^SOURCE/{gsub(/"/,"",$0);print $2}' "$CONFFILE"`"
ARCHIVLOCAL="`awk -F "=" '$1 ~ /^ARCHIVLOCAL/{gsub(/"/,"",$0);print src"/"$2}' src=$SOURCE "$CONFFILE"`"
SNAPDEST="`awk -F "=" '$1 ~ /^SNAPDEST/{gsub(/"/,"",$0);print $2}' "$CONFFILE"`"
LOGFILE="`awk -F "=" '$1 ~ /^LOGFILE/{gsub(/"/,"",$0);print $2}' "$CONFFILE"`"

# Create subdirectories, if missing
[ ! -d "$SOURCE" ] && mkdir -p "$SOURCE"
[ ! -d "$ARCHIVLOCAL" ] && mkdir -p "$ARCHIVLOCAL"
[ ! -d "$SNAPDEST" ] && mkdir -p "$SNAPDEST"

#if [ -z "${REMOTE}" ] ]; then
#    usage
#fi

# Test, if subdirectories exist really
[ -d "${SOURCE}" ] ||  { echo $SOURCE nonexistent; exit 1; }
[ -d "${ARCHIVLOCAL}" ] ||  { echo $ARCHIVLOCAL nonexistent; exit 2; }
[ -d "${SNAPDEST}" ] ||  { echo $SNAPDEST nonexistent; exit 3; }

echo "Local backup-snapshots in '${ARCHIVLOCAL}/'"

# Einlesen des Config-Files in die Arrays
TOBACKUP=(`awk -F "	" 'BEGIN{ORS=" "}$1 ~ /^backup/{print src"/"$2}' src="$SOURCE" "$CONFFILE"`)
TOARCHIV=(`awk -F "	" 'BEGIN{ORS=" "}$1 ~ /^backup/{print arloc"/"$2}' arloc="$ARCHIVLOCAL" "$CONFFILE"`)
SNAPSHOT=(`awk -F "	" 'BEGIN{ORS=" "}$1 ~ /^backup/{print sdst"/"$3}' sdst="$SNAPDEST" "$CONFFILE"`)
SNAPNAME=(`awk -F "	" 'BEGIN{ORS=" "}$1 ~ /^backup/{print $2}' "$CONFFILE"`)


# How many Subvols in the Stream
typeset -i BACKUPNR=0
count=0
while [ "x${TOBACKUP[count]}" != "x" ]
do
   count=$(( $count + 1 ))
done

typeset -i BACKUPCT=$count

# Create local Archive, ro (for btrfs send) and rw
DATE=`date +%Y-%m-%dT%H:%M:%S`
while [ ${BACKUPNR} -lt ${BACKUPCT} ] ; do
   SNAPSRC[${BACKUPNR}]="${TOARCHIV[${BACKUPNR}]}.${DATE}"
   SNAPDST[${BACKUPNR}]="${SNAPSHOT[${BACKUPNR}]}/${SNAPNAME[${BACKUPNR}]}.${DATE}"
   if [ -d "${SNAPDST[${BACKUPNR}]}" ]; then
      SNAPDST[${BACKUPNR}]="${SNAPSHOT[${BACKUPNR}]}/${SNAPNAME[${BACKUPNR}]}.`date +%Y-%m-%d`.`date +%H:%M:%S`"
   fi

   echo -n "create source snapshot[${SNAPNAME[${BACKUPNR}]}]..."

   mkdir -p $(dirname "${SNAPSRC[${BACKUPNR}]}")
   btrfs subvolume snapshot "${TOBACKUP[${BACKUPNR}]}" "${SNAPSRC[${BACKUPNR}]}" >>  ${LOGFILE} 2>&1 && echo "ok."|| exit ${BACKUPNR}

   rm "${TOARCHIV[${BACKUPNR}]}.LAST"  >> "${LOGFILE}" 2>&1 #&& echo "remove-link '${SNAPNAME[${BACKUPNR}]}.LAST' ok."
   mv "${TOARCHIV[${BACKUPNR}]}.CURRENT" "${TOARCHIV[${BACKUPNR}]}.LAST" >> "${LOGFILE}" 2>&1 && echo "create-link '${SNAPNAME[${BACKUPNR}]}.LAST' ok."
   ln -sf "$(basename "${SNAPNAME[$BACKUPNR]}").${DATE}" "${TOARCHIV[${BACKUPNR}]}.CURRENT" \
	>> "${LOGFILE}" 2>&1 && echo "create-link '$(basename "${SNAPNAME[$BACKUPNR]}").${DATE}.CURRENT' ok."
   BACKUPNR=${BACKUPNR}+1
done

sync

function _getsnap () {
   n=$1
   [ "${SNAPNAME[$1]}" = "" ] && return 0

   typeset -i i 

#   for ((i=0; i<$BACKUPCT; i++))
#   do
      SNAPSLOCAL=(`ls "${ARCHIVLOCAL}/$(dirname "${SNAPNAME[$n]}")" 2>/dev/null  | \
		grep "$(basename ${SNAPNAME[$n]})"|grep -v "CURRENT$\|LAST$\|$(basename "${SNAPNAME[$n]}")$"| \
		sed -e "s/^/$(dirname "${SNAPNAME[$n]}")\//" | sort -r`) 
      SNAPSREMOT=(`ls "${SNAPSHOT[$n]}/$(dirname "${SNAPNAME[$n]}")" 2>/dev/null | \
		grep "$(basename ${SNAPNAME[$n]})"|grep -v "CURRENT$\|LAST$\|$(basename "${SNAPNAME[$n]}")$"| \
		sed -e "s/^/$(dirname "${SNAPNAME[$n]}")\//" | sort -r`) 
#   done

#echo "LOCAL ${SNAPSLOCAL[*]} ENDLOCAL"
#echo "REMOT ${SNAPSREMOT[*]} ENDREMOT"
   typeset -i i=0
   typeset -i j=0

   while :
   do
      if [ "${SNAPSLOCAL[$i]}" = "${SNAPSREMOT[$j]}" ] ; then ret=1; printf "%s" "${SNAPSLOCAL[$i]}	${SNAPSREMOT[$j]}"; return 0; break; fi
      if [ "${SNAPSLOCAL[$i]}" = "" ] ; then let j++; i=0; else let i++; fi
      if [ "${SNAPSREMOT[$j]}" = "" ] ; then ret=0; printf "%s" "${SNAPSLOCAL[0]}	${SNAPSREMOT[0]}"; return 1;break; fi
   done
}


if [ $REMOTE -eq 1 ] ;then
   typeset -i BACKUPNR=0
   
   # Transfer Local Archive to remote
   while [ ${BACKUPNR} -lt ${BACKUPCT} ] ; do
      echo -n "transfer [${SNAPNAME[${BACKUPNR}]}.CURRENT]..."
      X=$(_getsnap $BACKUPNR)

      if [ $? -eq 1 ] ;then
         SNAPL=$(echo $X|cut -d " " -f1)
         SNAPR=$(echo $X|cut -d " " -f2)
	 if [ $INIT -eq 1 ] ;then
            echo -n "initialize remote-stream ..."
            btrfs property set -ts "${ARCHIVLOCAL}/${SNAPL}" ro true
            [ ! -d "${SNAPSHOT[${BACKUPNR}]}/$(dirname "${SNAPNAME[$BACKUPNR]}")" ] && mkdir -p "${SNAPSHOT[${BACKUPNR}]}/$(dirname "${SNAPNAME[$BACKUPNR]}")"
            btrfs send "${ARCHIVLOCAL}/${SNAPL}" 2>>"$LOGFILE" \
		| btrfs receive "${SNAPSHOT[${BACKUPNR}]}/$(dirname "${SNAPNAME[$BACKUPNR]}")" >> "${LOGFILE}" 2>&1 && echo "ok"
         else
            printf "%s\n" "$SNAPL - $SNAPR"
            printf "%s\n" "$SNAPL nonexistent on ${SNAPSHOT[$i]}"
         fi
      else
         SNAPL=$(echo $X|cut -d " " -f1)
         SNAPR=$(echo $X|cut -d " " -f2)
         echo -n "send difference $SNAPL ..."
         btrfs property set -ts "${ARCHIVLOCAL}/${SNAPL}" ro true
         btrfs property set -ts "${SNAPSRC[${BACKUPNR}]}" ro true
         btrfs send -p "${ARCHIVLOCAL}/${SNAPL}" "${SNAPSRC[${BACKUPNR}]}" | btrfs receive "${SNAPSHOT[${BACKUPNR}]}" >> ${LOGFILE} 2>&1 && echo "ok"
      fi

      let BACKUPNR++;

   done

fi

exit 0

Und das zugehörige Config-File '/etc/btrfsbck.conf'

Code: Alles auswählen

###########################################################
## Configfile for mkbackup_btrfs ##########################
###########################################################

# This Program works with systemd's ability "automount".
# Here an example for /etc/fstab-lines you need for, (or you mount the filesystems manually)
# /dev/sda is the local drive, /dev/sdb is an external HDD (USB for example)
#
# /dev/sda2	/mnt/btrfspool		btrfs	defaults,noauto,comment=systemd.automount,noatime,compress=lzo,space_cache              	0       0
# /dev/sdb5	/mnt/remote-pool	btrfs	defaults,noauto,comment=systemd.automount,noatime,compress=lzo,space_cache,subvol="backup"      0       0
#
# Be sure, /mnt/btrfspool mounts the root-pool of the btrfs-volume. If you have set some subvolume as default,
# you have to extend the options with ",subvol="0"!!!



# Mountpoint where the btrfs-pool which is the root filesystem ist mounted without subvolumes
# SOURCE="/mnt/btrfspool"
SOURCE="/var/cache/btrfs_pool_SYSTEM"

# Subdirectory in the btrfs-pool, which holds local snapshots for fast restoring, optional boot from
# The Variable $ARCHIVLOCAL results after parsing in $SOURCE/$ARCHIVLOCAL" in the example in "/mnt/btrfspool/archive-pool"
# ARCHIVLOCAL="archiv-pool"
ARCHIVLOCAL="local-pool"

# Mountpoint where the backup of the local archive is backed up. This is the mountpoint from an external HDD,
# or where a btrfs from an remote-computer is mountet with sshfs
# (the ability to work with ssh directly has to be done in future!!)
# SNAPDEST=/mnt/remote-pool"
SNAPDEST="/var/cache/backup"

# Location of the Logfile
# LOGFILE="/var/log/mkbackup_btrfs.log"
LOGFILE="/var/log/mkbackup_btrfs.log"

# Subvols to get backed up. Delimiter is Tab!!
# Start the line with "backup". The <SUBVOLUME> is the path from the btrfsroot. It wil get stored in the same hierarchy in the
# local pool and also the remote pool
# The <BACKUP-POOL-REMOTE> ist a directory in the $SNAPDEST-Mountpoint. If nonexistent, the script creats it!
# backup	<SUBVOLUME>	<BACKUP-POOL-REMOTE>
backup	@debian-jessie	venus
backup	@var	venus
backup	@home	venus
backup	@home/user1	venus
backup	@home/user2	venus
backup	@VM	venus
backup	@multimedia	venus
backup	@multimedia/Audio	venus
backup	@multimedia/Video	venus

Was ich noch nicht getestet habe ist, was passiert, wenn ich z.B. ein Subvolume in einem Unterverzeichnis allein angebe.
Also wenn ich die Zeile »backup @home venus« weglasse und nur »backup @home/user1 venus« angebe.
Der Plan ist, dass die Verzeichnishierarchie im Pool angelegt wird.

lg scientific

PS: smutbert, du wirst im Skript sicher einiges von die wiedererkennen :) Danke für die Anregungen!!
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

scientific
Beiträge: 3020
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: BTRFS und Backups

Beitrag von scientific » 22.11.2014 19:12:54

Also ich stelle ja fest... btrfs ist wirklich fein - aber noch lange nicht fertig. :D

Jetzt so beim Herumskripten merke ich, dass vieles viel einfacher wäre, könnte btrfs z.B. rekursiv auch Subvolumes
  • löschen
  • property ändern (ro/rw)
  • snapshots anlegen
Und vieles wäre beim Skripten einfacher, würde ein

Code: Alles auswählen

btrfs subvolume list /path/to/directory
eine Option kennen, wo wirklich nur und ausschließlich die darunterliegenden Subvolumes gelistet würden... und nicht immer irgendwie alle im Filesystem vorhandenen...
Oder bin ich einfach nur zu blöd, so ein Listing zu finden?

lg scientific
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

wanne
Moderator
Beiträge: 7463
Registriert: 24.05.2010 12:39:42

Re: AW: BTRFS und Backups

Beitrag von wanne » 22.11.2014 22:09:28

minimike hat geschrieben:Bacula macht es im Gegensatz zu den Dateisystemsnapshotgeschichten effizient
Ah. Dann mach mal mit Baculain unter 100ms ein Backup von 4TiB. Mit btrfs kein problem. Man kann btrfs viel vorwerfen aber garantiert nicht fehlende effizienz bei Backups.
scientific hat geschrieben:eine Option kennen, wo wirklich nur und ausschließlich die darunterliegenden Subvolumes gelistet würden...
Ich würde sagen grep ist dein Freund.
rot: Moderator wanne spricht, default: User wanne spricht.

Benutzeravatar
habakug
Moderator
Beiträge: 4313
Registriert: 23.10.2004 13:08:41
Lizenz eigener Beiträge: MIT Lizenz

Re: BTRFS und Backups

Beitrag von habakug » 22.11.2014 22:26:05

Hallo!

Ein "-o" hilft da nicht weiter?

Code: Alles auswählen

# btrfs subvolume list -o /path/to/directory
Gruss, habakug
( # = root | $ = user | !! = mod ) (Vor der PN) (Debianforum-Wiki) (NoPaste)

Benutzeravatar
minimike
Beiträge: 5594
Registriert: 26.03.2003 02:21:19
Lizenz eigener Beiträge: neue BSD Lizenz
Wohnort: Köln
Kontaktdaten:

Re: AW: BTRFS und Backups

Beitrag von minimike » 23.11.2014 00:31:24

wanne hat geschrieben:
minimike hat geschrieben:Bacula macht es im Gegensatz zu den Dateisystemsnapshotgeschichten effizient
Ah. Dann mach mal mit Baculain unter 100ms ein Backup von 4TiB. Mit btrfs kein problem. Man kann btrfs viel vorwerfen aber garantiert nicht fehlende effizienz bei Backups.
scientific hat geschrieben:eine Option kennen, wo wirklich nur und ausschließlich die darunterliegenden Subvolumes gelistet würden...
Ich würde sagen grep ist dein Freund.
Kannst Du das dann auch in der Zeit auf Tape schieben? Jede Datei wird dabei natürlich in einer SQL Datenbank katalogisiert. Nach Name; Pfad, Hashwert, Dateigröße und ACL + Posix-Zugriffsrechten. Natürlich ist der Raum mit einer Tape-Library eine eigene Brandschutzzone. Und Du hast zwei davon. Bei mir einer in Düsseldorf der andere in Leipzig. Wenn du den Snapshot lokal auf Platte belässt ist es in meinen Augen kein Backup.Und was ist wenn eines der Inkrementellen Backups doch korumpiert ist und andere darauf aufbauen? Ich sehe bei BTRFS keine Möglichkeit von differientiellen Snapshots. Keine Panik ZFS kann das. Aber in meinen Augen unbefriedigend.
"Lennart Poettering is one of those typical IT leaders..." "like Linus Torvalds and Theo de Raadt?" "more like Bozo the Clown" After all, now a good employee of Microsoft

wanne
Moderator
Beiträge: 7463
Registriert: 24.05.2010 12:39:42

Re: AW: BTRFS und Backups

Beitrag von wanne » 23.11.2014 01:12:42

minimike hat geschrieben:Kannst Du das dann auch in der Zeit auf Tape schieben?
Nein. Band unterstützt btrfs nicht. Das ist halt der Preis, den man für die Effizenz zahlt.
minimike hat geschrieben:Jede Datei wird dabei natürlich in einer SQL Datenbank katalogisiert. Nach Name; Pfad, Hashwert, Dateigröße und ACL + Posix-Zugriffsrechten.
Nein. btrfs nutzt auch keine SQL dafür wird man mit um Größenordungen kleineren Zugriffszeiten als bei jeder SQL-Datenbank belohnt. Aber Name; Pfad, Hashwert, Dateigröße und ACL + Posix-Zugriffsrechten sind drin.
minimike hat geschrieben:Natürlich ist der Raum mit einer Tape-Library eine eigene Brandschutzzone. Und Du hast zwei davon. Bei mir einer in Düsseldorf der andere in Leipzig. Wenn du den Snapshot lokal auf Platte belässt ist es in meinen Augen kein Backup.
btrfs unterstützt Raids. Damit hast du im fall eines Hardwareausfalls sogar nicht nur das Backup sondern sogar das Original. Düsseldorf-Leibzig ist für sowas eher grauenhaft. Aber Mainz Wiesbaden dürft machbar sein. Aber wenn du das über so große Distanzen machen willst geht das ntürlich auch ganz klassisch mit btrfs send und btrfs receive.
minimike hat geschrieben:Und was ist wenn eines der Inkrementellen Backups doch korumpiert ist und andere darauf aufbauen?
Kann - eigentlich - nicht passieren, weil du dein Backup ja über mehrere Platten verteilst. Aber Stabilität (und flexibilität) waren nicht die Sachen, die wir angesprochen haben. btrfs löst Probleme wie Backups deutlich effizenter als herkömmliche lösungen. Das war was Ich gesagt habe.
rot: Moderator wanne spricht, default: User wanne spricht.

Benutzeravatar
minimike
Beiträge: 5594
Registriert: 26.03.2003 02:21:19
Lizenz eigener Beiträge: neue BSD Lizenz
Wohnort: Köln
Kontaktdaten:

Re: BTRFS und Backups

Beitrag von minimike » 23.11.2014 02:08:12

Ah ich seh schon. Das ist was um einen Laptop zu sichern und darauf zu wetten das es gut geht ;) Ich denke ein paar Dimensionen größer weil ich Backupkrake alles was nicht bei drei wegläuft sichere und sage Pfui Bäh ;)
"Lennart Poettering is one of those typical IT leaders..." "like Linus Torvalds and Theo de Raadt?" "more like Bozo the Clown" After all, now a good employee of Microsoft

scientific
Beiträge: 3020
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: AW: BTRFS und Backups

Beitrag von scientific » 23.11.2014 09:53:06

wanne hat geschrieben:
scientific hat geschrieben:eine Option kennen, wo wirklich nur und ausschließlich die darunterliegenden Subvolumes gelistet würden...
Ich würde sagen grep ist dein Freund.
Ich spiele schon seit einiger Zeit mit den Optionen von btrfs und grep und awk usw. herum...
Bisher kam noch nichts vernünftiges dabei raus...

Ich hätt gerne eine Option wie -o, nur rekursiv.
Aber ich denke einmal, ich werde mir dann so eine Rekursion selber bauen... :-/
Und dann bin ich damit fertig, und btrfs bekommt sie kurz darauf selber :D

Hab mein Skript von ein paar Postings vorher noch einmal vollkommen umgestaltet... und poste es gerne, wenn ich fertig bin damit.
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: BTRFS und Backups

Beitrag von smutbert » 23.11.2014 11:22:12

Danke dafür und die guten Ideen. Leider habe ich noch keine Zeit gehabt mir das genauer anzusehen, aber ich glaube es gefällt mir :mrgreen:

Zur Suche nach subvolumes. Wieso nicht so (hab ein paar Subvolumes zu Testzwecken angelegt):
zuerst ein Überblick

Code: Alles auswählen

# btrfs su li .
ID 258 gen 17409 top level 5 path test.root
ID 259 gen 17409 top level 5 path test.home
ID 260 gen 17309 top level 5 path debian.root
ID 261 gen 17374 top level 5 path debian.home
ID 286 gen 17625 top level 5 path gnome.root
ID 287 gen 17627 top level 5 path gnome.home
ID 312 gen 17238 top level 5 path deb.root
ID 313 gen 17128 top level 5 path deb.home
ID 314 gen 17626 top level 5 path test/testvolume1
ID 315 gen 17626 top level 314 path test/testvolume1/testvolume3
ID 316 gen 17627 top level 5 path test/folder1/testvolume2
und jetzt

Code: Alles auswählen

# btrfs su li . | awk '{print $9}' 
test.root
test.home
debian.root
debian.home
gnome.root
gnome.home
deb.root
deb.home
test/testvolume1
test/testvolume1/testvolume3
test/folder1/testvolume2

# btrfs su li . | awk '{print $9}' | grep "^test"
test.root
test.home
test/testvolume1
test/testvolume1/testvolume3
test/folder1/testvolume2

# btrfs su li . | awk '{print $9}' | grep "^test/folder1"
test/folder1/testvolume2

scientific
Beiträge: 3020
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: BTRFS und Backups

Beitrag von scientific » 23.11.2014 19:35:35

Hab die eine Aufgabe jetzt mal lösen können. War ein ziemliches Herumgewurschtle, bis ich es endlich kapiert habe. :D
Die Lösung gibts dann im fertigen Skript.

Jetzt stehe ich vor »btrfs send«

Ganz kapiert habe ich das noch nicht...
mit

Code: Alles auswählen

btrfs send @SUBVOL | btrfs receive /path/to/destination 
wird einmal das gesamte Subvolume @SUBVOL an das Ziel gesendet.

Den Zwischenschritt mit ausgabe in eine Datei diese dann transferieren und mit btrfs receive im anderen btrfs einpflegen habe ich schon kapiert.

Mir geht es um die inkrementellen Backups mit diesem Befehl. Ich habe einige Anleitunge und Beschreibungen dazu gelesen. Aber einige Fragen blieben offen...

Der obige Befehl erzeugt folgendes Subvolume

Code: Alles auswählen

/path/to/destination/@SUBVOL
. Dabei ist es wichtig, dass dieser Pfad auf einem anderen btrfs-Filesystem liegt (z.B. zweite HD an diesem Mountpunkt gemountet)

Jetzt passieren irgendwelche Änderungen in @SUBVOL und danach fertige ich mit

Code: Alles auswählen

btrfs subvol snapshot @SUBVOL @SUBVOL.eins
einen Snapshot davon an.

Es entstehen z.B. in der Zwischenzeit folgende sich unterscheidende Snapshots:
@SUBVOL.eins
@SUBVOL.zwei
@SUBVOL.drei
@SUBVOL.vier
@SUBVOL.fünf

Ich möchte z.B. nur jeden 5. Snapshot auf die externe Platte sichern, dann kann ich das mit

Code: Alles auswählen

btrfs send -p @SUBVOL @SUBVOL.fünf|btrfs receive /path/to/destination 
Soweit habe ich das schon verstanden. Steht auch in jeder Anleitung so drinnen. :-)

Aber jetzt wirds knifflig.

Was genau macht die Option -c?

Wenn ich weiß, dass /path/to/destination/@SUBVOL unverändert ist (weil ein ro-Snapshot im Archiv), dann müsste - so wie ich das verstanden habe, ein

Code: Alles auswählen

btrfs send -c @SUBVOL @SUBVOL.fünf|btrfs receive /path/to/destination
auch funktionieren und wesentlich weniger Daten übertragen.
Soweit konnte ich das auch noch aus den Beschreibungen herauslesen.

Aber jetzt kommts:
Aus irgend einem Grund ist auf dem Rechner @SUBVOL verschwunden (z.B. irrtümlich gelöscht). Auf dem Remote-System ist aber bisher "nur" @SUBVOL vorhanden.
Wie mache ich dann ein inkrementelles Backup?

Funktioniert

Code: Alles auswählen

btrfs send -p @SUBVOL.vier @SUBVOL.fünf|btrfs receive /path/to/destination
? Oder muss als "Parent" immer jener Snapshot verwendet werden, der ursprünglich gesendet wurde?
Oder kann ich auch einen älteren Snapshot verwenden, der local wie remote vorhanden ist?
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

scientific
Beiträge: 3020
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: BTRFS und Backups

Beitrag von scientific » 26.11.2014 01:24:30

So, ich habe mein Skript vollkommen überarbeitet und ausgebaut.

Und ich habe auch einen ersten Entwurf (mit Download-Möglichkeit von meiner Seite) einer Wiki-Seite mit Beschreibung und Erklärung verfasst.
Die Seite ist noch Großbaustelle... aber sie sollte schon einen schönen Überblick darüber geben, wie mein Skript für das Backup mit btrfs im Groben funktioniert.

https://wiki.debianforum.de/Snapshots_u ... _mit_btrfs

Ich werde dieses Skript natürlich noch im Praxisalltag testen und verbessern (hab grad einen kleinen Bug gefunden...) Und es gibt unter dieser Adresse auch reglemäßige updates.
Später werd ich auch noch ein Debian-Paket bauen und dort zum Download anbieten.

8)

Viel Vergnügen damit.

lg scientific

PS, die andere Version, die ich hier früher gepostet habe, ist out of date. Das neue Skript arbeitet vollkommen anders und strukturierter.
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

Antworten