exomor
Anmeldungsdatum: 15. September 2021
Beiträge: 14
|
Guten Abend, ich bin derzeit dabei mir ein Script zu schreiben, mit dem ich in regelmäßigen Abständen meine gesamte Systemplatte sichere.
Ich nehme hierfür ganz unkompliziert diesen Befehl: | dd if=/dev/sda of=/[Mein Dateispeicherpfad]/"Backup_[Datum des Backups]".img
|
Das verbraucht auf Dauer selbstverständlich viel zu viel Speicher, weswegen er immer die letzten beiden Backup Dateien behalten soll und den Rest löschen. Zwischen den einzelnen Backups fertige ich Snapshots mit Timeshift an, aber ich will auf jeden Fall zwei vollständige Backups haben. Snapshots und Backups ersetzten sich ja nicht. Meine Frage ist, wie ich in einem Bashscript dynamisch festlegen kann, welche Dateien er behalten und welche er löschen soll?
Ich hatte grundsätzlich überlegt den Dateinamen immer in eine Variable zu speichern, aber das wäre ja nicht von Dauer. Spätestens nach einem Neustart wären die Dateinamen nicht mehr in der Variablen vorhanden. Über eure Hilfe würde ich mich freuen. -exomor
|
Doc_Symbiosis
Anmeldungsdatum: 11. Oktober 2006
Beiträge: 4391
Wohnort: Göttingen
|
Hm, Du könntest ja eine Rotation einfach einbauen, also so etwas:
Outputfile="/[Mein Dateispeicherpfad]/Backup.img"
mv "$Outputfile".1 "$Outputfile".2
mv "$Outputfile" "$Outputfile".1 Also es gibt natürlich viele, viele Möglichkeiten das zu lösen.
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Hallo! Ich hatte das immer mit dem Datum gemacht und das aktuellste per Symlink verlinkt. Etwa so: | heute=$(date +'%Y_%m_%d')
# …
rsync -aR --numeric-ids --delete "${quelle}"/./ "${ziel}${heute}/" --link-dest="${ziel}_last/" && ln -nsf "${ziel}${heute}" "${ziel}_last"
|
Zum Löschen kannst du dann sowas nehmen wie 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | cur_month=$(date +'%m')
cd /backup/
for folder in client1 client2 client3; do
for month in {01..12}; do
if [[ "${month}" == $"{cur_month}" ]]; then continue; fi # bsp. aktuellen Monat überspringen
for day in {01..31}; do
if [ "${day}" == "01" ] || [ "${day}" == "15" ]; then # jeden 01. und 15. behalten
continue;
fi
if [ -d $folder"2021_"${month}"_"${day} ]; then
printf '%s%s%s%s%s ' $folder"2021_"${month}"_"${day}
fi
done
done
done
|
Eine der Abfragen sollte natürlich beinhalten nicht den Ordner, der sich hinter _last befindet zu löschen, falls du für ein Gerät eine Weile keine Backups mehr gemacht hast. Ist auch eher rudimentär, da haben die Bash-Jungs sicher besser Abläufe parat. Aber so ungefähr kann man das machen. btw: dd braucht mehr Platz, da auch der unbenutzte Platz gesichert wird. Wenn du Platzmangel hast, wäre das die erste Option zum einsparen.
|
exomor
(Themenstarter)
Anmeldungsdatum: 15. September 2021
Beiträge: 14
|
@Doc_Smbiosis
hm so wäre es zwar indirekt möglich, jedoch nicht wirklich dynamisch in Abhängigkeit vom Backupnamen gestaltet. Könnte mir aber vorstellen, dass bis zum endgültigen Script so zu überbrücken. @ChickenLipsRfun2eat
das mit dem löschen könnte für meine Anwendung auch funktionieren. Ich versuche das mal zu implementieren. Bezüglich dem dd habe ich den Vorteil, dass ich innerhalb von 30 min eine bootfähige SSD "erzeugen" kann.
Falls mir meine Systemplatte mal abraucht oder ich einen Fehler mache (der mit viel Zeitaufwand zur Korrektur einhergeht) kann ich einfach das Backup nehmen und auf eine neue Platte schreiben.
Mit rsync ist eine bootfähige Platte meines Wissens leider nicht möglich. Das Problem, dass dd auch den leeren Speicherplatz mitsichert, umgehe ich durch eine starke Kompression auf meinem Filesystem. Tatsächlich hat das Image nur wenige MB mehr als der tatsächlich verwendete Speicherplatz. Das mit der Speicherknappheit war eher darauf bezogen, dass Kleinvieh auch Mist macht wenn ich alle 2 Wochen ein Backup mache und dann 1 Jahr nicht den Speicherort leeren würde:D
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
Es gibt ein ganz einfaches Schema: man nummeriert die Dateien und verschiebt immer um eins. Beispiel: 1
2
3
4
5
6
7
8
9
10
11
12
13
14 | #!/bin/bash
scheme() { printf 'backup-%02d' $1; }
last=$(scheme 10)
for (( i=9 ; i>=1 ; --i )); do
name=$(scheme $i)
mv -f "$name" "$last" 2>/dev/null
last="$name"
done
# new backup
touch "$last"
|
|
frostschutz
Anmeldungsdatum: 18. November 2010
Beiträge: 7657
|
Mit dd darfst du das nur machen, wenn die Dateisysteme dabei nicht eingehängt sind. Wenn du im Betrieb 1:1 Spiegelungen erzeugen willst, brauchst du eher sowas wie RAID 1. Freie Bereiche (bei SSDs genullt durch fstrim) kann dd mit conv=sparse überspringen, spart dann auch ohne Komprimierung Platz. (Sollte man beim Wiederherstellen dann jedoch nicht benutzen, es sei denn das Zielgerät ist sicher durchgehend null). Mit Borg Backup könntest du zusätzlich zur Komprimierung auch noch eine Deduplizierung fahren, und das unterstützt auch das Löschen alter Backups (täglich/wöchentlich/...) und kann über FUSE gemountet werden (ermöglicht direkte loop-mounts von komprimierten/deduplizierten dd-Images). Und du könntest gleichzeitig/zusätzlich auch eine herkömmliche dateibasierte Sicherung machen.
|
juribel
Anmeldungsdatum: 20. April 2014
Beiträge: 1089
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
juribel schrieb: Lies mal hier: https://wiki.ubuntuusers.de/Skripte/Backup_mit_RSYNC/
Ich mag das Skript nicht wegen verschiedener Dinge (ständige Großschreibung von lokalen Variablen, Benutzung von Variablen für alle möglichen Programme, Mixen von mehreren [...] , wo es auch eins getan hätte ...). Darüber hinaus ist das schon ein recht komplexes Skript für ein Problem, für das es bereits fertige Lösungen (ich empfehle Borg) gibt, die das auch noch besser können als diese Bastellösung. Ciao robert
|
juribel
Anmeldungsdatum: 20. April 2014
Beiträge: 1089
|
Weder komplex noch gebastelt. Einfach im Skript die zwei Umgebungsvariablen SOURCES und TARGET ausfüllen und läuft. Der Rest ist reine Geschmackssache. Viele freundliche Grüsse, juribel
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
juribel schrieb: Weder komplex noch gebastelt.
In Zeiten, wo es Borg, BackInTime und ähnliche gibt, betrachte ich Skriptlösungen für so etwas fundamental wichtiges als gebastelt. Mindestens für jemanden, der Backups jetzt neu einrichtet, gibt es keinen Grund auf so ein Skript zurückzugreifen.
Einfach im Skript die zwei Umgebungsvariablen SOURCES und TARGET ausfüllen und läuft. Der Rest ist reine Geschmackssache.
Ich finde das beeinträchtigt die Lesbarkeit enorm. Und die hat etwas damit zu tun, wie gut man die Funktionalität nachvollziehen und Fehler finden kann, wenn etwas schief geht.
|
dingsbums
Anmeldungsdatum: 13. November 2010
Beiträge: 3547
|
rklm schrieb: In Zeiten, wo es Borg, BackInTime und ähnliche gibt, betrachte ich Skriptlösungen für so etwas fundamental wichtiges als gebastelt.
Mit dem Einsatz eines spezialisierten Programmes bindet man sich in der Regel auf längere Zeit daran. Wird die Entwicklung eingestellt, steht man oft im Regen. Ebenso, wenn Fehler nicht behoben werden. Ärgerlich ist das besonders, wenn man die meisten Spezial-Features gar nicht nutzt oder benötigt. Und Programmfehler gibt es in der Regel immer, umso komplexer das Programm desto mehr. Ich erinnere nur an die immer wieder auftauchenden Hilferufe hier im Forum zu DejaDup. Lesestoff: https://bugs.launchpad.net/deja-dup https://github.com/borgbackup/borg/issues Ich persönlich halte es eher nach dem Motto "Keep it simple and stupid." Wenn ich 1000 und 1 Feature gar nicht benötige, bin ich mit einem selbst wartbaren Skript besser unterwegs als mit einer komplexen Drittanbieterlösung. Aber das muss am Ende des Tages jeder selbst für sich entscheiden.
|
BillMaier
Supporter
Anmeldungsdatum: 4. Dezember 2008
Beiträge: 6473
|
Bin von bacula nach borg nach restic gewechselt. Beste Entscheidung ever! Für „Kleinkram“ oder wenn ich nur eine Backup-Instanz wegschreiben will ist rsync ideal - aber da habe ich auch möglichst wenig Logik „drumrum“. Ich finde es immer wichtiger, das Ergebnis der Datensicherung zu prüfen: hin und wieder als restore dazwischen via Monitoring (z.B. log-Dateien auswerten, exitcodes auswerten etc etc)
Gruß BillMaier
|
Saddy
Anmeldungsdatum: 2. Mai 2006
Beiträge: 1148
|
Backups älter als 60 Tage löschen: | find /backup/path -mtime +60 -delete
|
Ansonsten klingen die Anforderungen für mich am ehesten nach Clonezilla. CD rein → Backup → Enter und man hat trotzdem nette Eigenschaften wie Kompression etc. Siehe auch Datensicherung
|