Backups mit rsync unter OmniOS (UFS)

Derzeit mache ich inkrementelle Backups von meinem OmniOS-Server mit rsync auf eine mit UFS formatierte externe USB-Festplatte.

Dazu benutze ich ein Bash-Script, dass ich ursprünglich mal aus dem Internet runtergeladen hatte und an meine Bedürfnisse angepasst habe.
Zusätzlich habe ich mir ein Tcl-Script geschrieben, das alte Snapshots löscht.

Um die beiden Scripte nutzen zu können müssen rsync und tcl installiert sein:

pkg install rsync

pkg install tcl

Ich habe die beiden Scripte im /root - Verzeichnis gespeichert. Zur Ausführung der Scripte benötigt man root-Rechte.

Das folgende Bash-Script erzeugt inkrementelle Backups mit rsync. Bei jedem Backupvorgang wird ein neues Verzeichnis (Snapshot) auf
der externen USB-Festplatte angelegt (mit Datum und Uhrzeit im Verzeichnisnamen).

Das Script heißt bei mir rsync_backup.sh

joe rsync_backup.sh

#!/bin/sh
# USB-Festplatte mounten

mount /dev/dsk/c2t0d0p0 /mnt
df -k
echo "USB-Festplatte eingehangen"

# Als erstes erfolgt ein Backup des Gruppenlaufwerks, das mit NFS exportiert wird
# Quell- und Zielverzeichnis festlegen
# auf der USB-Festplatte wird ein neues Verzeichnis für den Snapshot angelegt

quelle=/home/GRUPPE
ziel=/mnt/backup_GRUPPE
heute=$(date +%Y-%m-%d_%H:%M:%S)

rsync -avR --delete "${quelle}"  "${ziel}${heute}/" --link-dest="${ziel}last/"
rm "${ziel}last"
ln -nsf "${ziel}${heute}" "${ziel}last"
df -k

# jetzt erfolgt das Backup der PostgreSQL-Datenbanken
# zunächst wird der PostgreSQL-Server gestoppt

svcadm disable postgresql10:default
echo "PostgreSQL Server gestoppt"
sleep 10

# Das Datenbankverzeichnis wird gesichert

quelle=/var/opt/ooce/pgsql/pgsql-10
ziel=/mnt/pgsql
heute=$(date +%Y-%m-%d_%H:%M:%S)

rsync -avR --delete "${quelle}"  "${ziel}${heute}/" --link-dest="${ziel}last/"
rm "${ziel}last"
ln -nsf "${ziel}${heute}" "${ziel}last"

sleep 4

# Der PostgreSQL-Server wird wieder gestartet

svcadm enable -r postgresql10:default
echo "PostgreSQL Server gestartet"

df -k

# Das Tcl-Script wird gestartet und alte Snapshots gelöscht

echo "Alte Snapshots werden gelöscht ..."
./delete_backups.tcl

exit 0


Das Script speichern:

STRG+kx

Das Script ausführbar machen:

chmod +x rsync_backup.sh


Das folgende Tcl-Script löscht alte Snapshots nach folgendem Muster:

- alle Snapshots der letzten 7 Tage bleiben erhalten
- pro Monat wird ein Snapshot aufbewahrt
- Snapshots, die älter als 1 Jahr sind, werden gelöscht

joe delete_backups.tcl

#!/opt/ooce/bin/tclsh

# dieses Tcl-Script löscht alle Backups, die:
# älter als 1 Jahr sind
# pro Monat wird 1 Backup behalten
# alle Backups der letzten 7 Tage werden behalten

# aktuelles Datum ermitteln
set datum_aktuell [clock seconds]
puts [clock format $datum_aktuell -format {%d.%m.%Y %H:%M:%S}]
# In das Backupverzeichnis der USB-Festplatte wechseln
cd /mnt
# Alle Dateien ermitteln
set backup_dateien [exec ls]
# Anzahl der Dateien ermitteln
set anz_dateien [llength $backup_dateien]
set i 0
while {$i<$anz_dateien} {
    if {[lindex $backup_dateien $i]!="lost+found" && [lindex $backup_dateien $i]!="backup_GRUPPElast" && [lindex $backup_dateien $i]!="pgsqllast"} {
        # Erstellungsdatum der Datei ermitteln und danach formatieren
        set datum1 [file mtime [lindex $backup_dateien $i]]
        if {$i<[expr $anz_dateien -2]} {
            set datum2 [file mtime [lindex $backup_dateien [expr $i+1]]]
        } else {
            set datum2 0
        }
        # Monat und Jahr filtern
        set datum_formatiert1 [clock format $datum1 -format {%Y%m}]
        set datum_formatiert2 [clock format $datum2 -format {%Y%m}]
        # alter der Datei ermitteln
        set alter1 [expr $datum_aktuell - $datum1]
        set alter2 [expr $datum_aktuell - $datum2]
        # datum älter als ein jahr ermitteln
        set del_jahr [clock add $datum_aktuell -1 years]
        # datum älter als 7 tage ermitteln
        set del_7tage [clock add $datum_aktuell -7 days]
        # dateien älter als 1 jahr löschen
        if {$datum1 < $del_jahr} {
            puts "Verzeichnis löschen: [lindex $backup_dateien $i]"
            file delete -force [lindex $backup_dateien $i]
        } else {
            if {$datum1 < $del_7tage} {
                # monat und jahr mit der nächstfolgenden datei vergleichen
                # monat und jahr stimmen überein = ältere datei löschen
                if {$datum_formatiert1 == $datum_formatiert2} {
                    puts "Verzeichnis löschen: [lindex $backup_dateien $i]"
                    file delete -force [lindex $backup_dateien $i]
                }
            }
        }
    }
    incr i
}

Das Script speichern:

STRG+kx

Das Script ausführbar machen:

chmod +x delete_backups.tcl



HOME