Zugang
Es handelt sich um einen LXC-Container. Der Zugang erfolgt über Putty aus dem Nas mit dem folgenden Befehlt:
lxc-console --name BackupManager
Die Konsole kann verlassen werden durch „Strg+A“ und dann „q“.
Durchgeführt Aktivitäten
System aktualisiert und erforderliche Anwendungen installiert mit:
apt-get update
apt-get upgrade
apt install zip nano cron rsyslog sshfs mysql-client
Anschließend erste Testdatei erstellt mit:
zip -r /backups/Web/charts/daily/20200502.zip /NAS/Web/charts/
Ein Shellscript angelegt und mit Nano bearbeitet:
touch /home/backup.sh
nano /home/backup.sh
Nun geht es an das Shell-Script:
#!/bin/bash
#Tracing einschalten
#set -x
#---------------------
#Globale Variablen
DATE=`date +%d.%m.%Y`
DATETIME=`date +%Y-%m-%d_%H-%M`
#SOURCE="/etc/backupconf/backupsource.list"
BACKUPDIR="/backups"
#OUTPUTDIR="//SENSELESS/BACKUPDIR/$DATE"
#mkdir /$BACKUPDIR/$DATE
#cd /$BACKUPDIR/$DATE
#tar czpf samba_backup_$DATETIME.tar.gz -T $SOURCE
#------------------------------------
#-----------------------------------------------
echo "Positional Parameters"
echo '$0 = ' $0
echo '$1 = ' $1
echo '$2 = ' $2
echo '$3 = ' $3
#----------------------------------------------
echo 'Punkt1'
backupFreq="$1"
echo 'backupFreq = ' $backupFreq
#So lange es noch Parameter gibt
while [ $# -gt 0 ]
do
case "$1" in
-[hH]|-hourly) backupsubdir="hourly";;
-[dD]|-daily) backupsubdir="daily";;
-[wW]|-weekly) backupsubdir="weekly";;
-[mM]|-montly) backupsubdir="monthly";;
-[qQ]|quaterly) backupsubdir="quarterly";;
-[yY]|yearly) backupsubdir="yearly";;
-[sS]|special) backupsubdir="special";;
-obj=*) object="${1##-obj=}";;
-src=*) src="${1##-src=}";;
*) echo "($backupFreq) Unbekannter Parameter"
exit 1;;
esac
#Nächster Parameter
shift
done
echo '$backupsubdir = '$backupsubdir
echo '$object = '$object
# Löschen alter Dateien
# Im Daily-Verzeichnis sollen Dateien nur eine gewisse Zeit aufgehoben werden.
# Die alten können daher mit dem folgenden Befehl gelöscht werden:
# Erklärung:
# -name *.zip --> schränkt auf zip-Dateien ein
# -mmin +3 --> findet alle Dateien die seit 3 Minuten nicht geändert wurden
# -mtime +3 --> findet alle Dateien die seit 3 Tagen nicht geändert wurden.
# -type f --> schränkt auf Dateien ein, sonst werden ggf. auch Verzeichnisse gelöscht
# -exec KOMMANDO {} \; wendet auf alle Funde den Shellbefehl KOMMANDO an. {} steht dabei
# als Platzhalter für die gefundenen Dateinamen. Das Zeichen ;
# terminiert den von find aufzurufenden Shellbefehl. Damit es nicht
# unbeabsichtigt von der Shell interpretiert wird,
# rm -rf --> rekursiv ohne Nachfrage löschen
echo "Löschen alter Dateien"
#stündliche Sicherung wird nach drei Tagen gelöscht
find /backups/hourly -mtime +2 -type f -exec rm -rf {} \;
find /backups/daily -mtime +3 -type f -exec rm -rf {} \;
find /backups/weekly -mtime +31 -type f -exec rm -rf {} \;
find /backups/monthly -mtime +90 -type f -exec rm -rf {} \;
find /backups/quarterly -mtime +365 -type f -exec rm -rf {} \;
find /backups/yearly -mtime +1000 -type f -exec rm -rf {} \;
backupChartFiles()
{
echo "zippe Dateien"
echo "$BACKUPDIR/$backupsubdir/$object_$DATETIME.zip /NAS/Web/charts/"
zip -r ${BACKUPDIR}/${backupsubdir}/${object}_${DATETIME}.zip ${src} > ${BACKUPDIR}/${backupsubdir}/${object}_${DATETIME}.log
#echo 'Sicherung ist abgeschlossen'
#echo 'Sicherung ist abgeschlossen'
logger 'Sicherung wurde durchgeführt'
echo "Zippen fertig"
}
# Backup der Chart-Dateien
backupChartFiles
exit 0
Ich habe nun cron so eingestellt, dass die Sicherung regelmäßig erstellt wird: crontab -e
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
# 45 */1 * * * /home/backup.sh
#Sicherung der Charts
0 */1 * * * /home/backup.sh -h -obj=NAS_Web_charts -src=/NAS/Web/charts
0 0 * * * /home/backup.sh -d -obj=NAS_Web_charts -src=/NAS/Web/charts
0 0 1 1,4,7,10 * /home/backup.sh -q -obj=NAS_Web_charts -src=/NAS/Web/charts
0 0 1 1 * /home/backup.sh -y -obj=NAS_Web_charts -src=/NAS/Web/charts
#Sicherung BackupManager
0 */1 * * * /home/backup.sh -h -obj=BackupManager_home -src=/home/
0 0 * * * /home/backup.sh -d -obj=BackupManager_home -src=/home/
0 0 1 1,4,7,10 * /home/backup.sh -q -obj=BackupManager_home -src=/home/
0 0 1 1 * /home/backup.sh -y -obj=BackupManager_home -src=/home/
Der Erfolg kann über das Syslog überprüft werden:
tail -10 /var/log/syslog
SSH-Login auf einem anderen System
Per SSH kann man sich auf einem anderen Server anmelden:
ssh pi@192.168.178.40
Mit der Anwendung sshfs kann ein Verzeichnis eines anderen Systems gemountet werden.
…. Klappt aber noch nicht.
Backup der MariaDB
Hier steht alles zu mysqldump: https://mysqldump.guru/
Ich habe auf dem Backup-System den MySQL-Client installiert (s.o.)
Ich habe nun die Datei ~/.my.cnf erstellt:
nano ~/.my.cnf
In der Datei habe ich die Zugangsdaten des DB-Users hinterlegt
[mysqldump]
user=backup
password=secret
Jetzt ändern wir noch die Rechte von ~/.my.cnf, damit nur root Zugriff hat:
chmod 600 ~/.my.cnf
Beim mysqldump ist nun keine Angabe des Passworts mehr nötig.
Ein Backup-Befehl kann ungefähr so aussehen:
mysqldump -h 192.168.178.45 --quick --skip-lock-tables --all-databases | zip > /backups/mysql/AllDbs.sql.zip
Ohne das –quick bricht die Verarbeitung mit Speichermangel ab.
Das –skip-lock-tables sorgt dafür, dass die Verarbeitung nicht blockiert
Dieses Statement erzeuget einzelne Files pro DB (siehe auch hier):
mysql -h 192.168.178.45 -N -e 'show databases' | while read dbname; do
mysqldump -h 192.168.178.45 --skip-lock-tables --complete-insert --routines --triggers --single-transaction "$dbname" | zip > /backups/mysql/"$dbname".sql.zip; done
Schreibe einen Kommentar