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
Kontakt: mail@tkfibu.de
HOME