So heute möchte ich der Linux Community eine Kleinigkeit zurück geben:)
Falls du kein ZFS (https://wiki.ubuntuusers.de/ZFS_on_Linux/) nutzt oder es vor hast, ist da ganze hier wahrscheinlich uninteressant für dich;)
Jetzt zu dem um was es geht. Ihr kennt es bestimmt alle, natürlich sollte man Backups erstellen, natürlich kann ZFS auch Snapshots erstellen aber sind wir mal ehrlich wie alt ist das letzte Backup? Wann wurde der letzte Snapshot erstellt? Man tut sich ja nicht denken: hmm ich habe gerade vor mit sudo rm -r etwas unglaubliches Dummes anzustellen, ich sollte vor her ein Backup/snapshot machen:P
Mein Script erstellt Snapshots und sehr viel wichtiger es löscht sie auch wieder nach einer gewünschten Zeit. Den das automatische erstellen ist ja kein Problem mittels /etc/crontab.
Ansonsten noch ein paar Punkte:
Dieses Script setzt ihr auf eigene Gefahr ein! Testet es vorher in einer Testumgebung! Es geht um eure Daten den dieses Srcipt löscht Snapshots mittel zfs destroy !
Ich habe dies Sript seit Monaten im Einsatz. Das häufige erstellen und löschen von Snapshots müsste den Festplatten auch ziemlich egal sein. ZFS löscht eh erst "richtig" wenn kein Speicher mehr da ist.
Die jetzige Konfiguration verwende ich. Snapshots werden 30 Tage gespeichert und tätlich erstellt. Ich nutze zwei gespiegelte 3TB Platten wo von nicht einmal ein 1TB belegt ist.
Die Häufigkeit der Erstellung von Snapshots stellt ihr in der /etc/crontab ein. Rein theoretisch sollte ich auch jede Stunde ein Snapshot erstellen können und es würde den Speicherverbrauch nicht groß beeinflussen da ich eher selten größere Datenmengen ändere.
Ich habe eigentlich nur echte Erfahrung in PHP und die ist auch schon etwas eingerostet. Dieses Script wurde größtenteils mittels Google und Copy/Paste erstellt
Ich bin mir nicht sicher ob das rekrusive (Untergeordnete Dateisystem) löschen und erstellen richtig funktioniert. Ich teste diese Funktion es erst seit heute.
Dieses Script ist vollkommen frei macht was ihr wollt damit!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | #!/bin/bash # --- Benötigte Änderungen an /etc/crontab/ --- # # m h dom mon dow user command # 7 3 * * * root /root/sh/daily-snapshot.sh # Diese Zeile muss ohne # in die /etc/crontab eingefügt werden mit dem richtigen Pfad zu dieser Datei. # Bei diesem Beispiele wird täglich ein Snapshot um 3:07 erstellt und natürlich alte Snapshots gelöscht siehe Einstellungen unten. # --- CONFIG --- # # ZFS Dateisystem von dem wiederkehrenden Snapshots erstellt werden sollen zfsFs=zfspool/home # Prefix für die Snapshots snapshot_prefix='daily' # Wie lange soll ein Snapshot aufbewahrt werden days=30 # Tage hours=0 # Stunden minutes=0 # Minuten # --- SCRIPT START --- # zfsFs=$zfsFs'@'$snapshot_prefix'-' days=$(($days*86400)) hours=$(($hours*3600)) minutes=$(($minutes*60)) max_older=$(($days+$hours+$minutes)) unixtime=$(date +%s) max_unixtime=$(($unixtime-$max_older)) #echo $max_unixtime #echo $unixtime #remove snapshots patern=$zfsFs'[0-9_\-][0-9_\-][0-9_\-][0-9_\-]-[0-9_\-][0-9_\-]-[0-9_\-][0-9_\-]_[0-9_\-][0-9_\-]:[0-9_\-][0-9_\-]:[0-9_\-][0-9_\-]' snapshots=($(\zfs list -H -t snapshot -o name | egrep $patern)); patern=$zfsFs; for snapshot in "${snapshots[@]}" do snapshotdate=${snapshot#$patern} snapshotdate=$(echo $snapshotdate | sed 's/_/ /g') snapshotUnixtime=$(date -d "$snapshotdate" +%s) if [ $snapshotUnixtime -lt $max_unixtime ] then echo "destroy "$snapshot; zfs destroy -r $snapshot; else echo "remains "$snapshot; fi done #create new snapshot date=$(date +%Y-%m-%d_%H:%M:%S) zfs snap -r $zfsFs$date echo 'create '$zfsFs$date |