[vz-users] Backup Strategie

Rupert Schöttler rupert.schoettler at gmx.de
Di Dez 31 17:07:58 CET 2019


Hallo Christian,

Am 30.12.19 um 17:26 schrieb Christian Wimmer:
>
> So wäre es sehr einfach für mich!
>
>  
>
> >Mitschrift der wesentlichen Setup-Schritte
>
>  
>
> Meinst du da das Setup vom VZ?
>
Nein, es ist wirklich eine "Mitschrift", siehe Anhang.


> Alles andere wird über rsync gesichert?
>
>  
>
> Also quasi VZ neu installieren (am schnellsten mit fertigem Image auf
> SD-Card) und dann alle Files der Sicherung retour.
>
> Dann müsste der VZ doch innerhalb ein paar Minuten wieder laufen?
>
Ganz so kommod geht's vermutlich nicht, aber aus dem Backup konnte ich
alle notwendigen config-Dateien herauskopieren oder nachschauen, wie
irgendwas zuletzt eingestellt war. Das war sehr hilfreich.

Außerdem: Den letzten Crash nahm ich zum Anlass, von Stretch auf Buster
zu migrieren. Da ist "blindes" Zurückspeichern sowieso keine gute
Strategie...


Und hier das Setting für rsync:

Der erwähnte Arbeitsplatzrechner ist "pluto". Dort ist ein User
remotebackup eingerichtet, der nichts anderes macht als das Backup von
"ras2" und "ras3" (meinen beiden Raspberry Pis) zu ziehen und in seinem
Home-Verzeichnis abzulegen. Dazu werden die drei Shellskripte (Anhang)
verwendet, die ich in /usr/local/bin abgelegt habe.

backup-rasppi: Macht die beiden Backups und trägt sich gleich für 24h
später wieder in die Queue ein.

backup-rotate: Rotiert die 7 Versionen eins weiter.

backup-rsync: Aktualisiert die jüngste Version ("daily.0").

Wichtig ist dabei, dass der User "remotebackup" von pluto ohne Eingabe
des Passworts als root auf ras2 und ras3 zugreifen darf, bzw. zumindest
dort den rsync-Befehl starten. Es ist in "Ras2 Config" kurz beschrieben,
wie das eingerichtet wird.

Beim ersten Mal kopiert das Skript die ganze SD-Karte bzw. das ganze
Filesystem des Pi, das dauert dann schon eine Weile. Die weiteren,
inkrementellen Backups laufen bei mir dann nur noch knapp eine Minute
beim ras2, auf dem sich kaum was tut, und rd. 5 Minuten beim ras3, der
auch die VZ-Datenbank beinhaltet.

Fast vergessen: Es gibt noch je Pi eine Datei rsync-excludes.conf mit
einer Auflistung der Verzeichnisse, die vom Backup ausgenommen werden
sollen. Inhalt z.B.

/dev
/lost+found
/proc
/sys
/run

Gruß von Lech und Wertach

Rupert

-------------- nächster Teil --------------
Ein Dateianhang mit HTML-Daten wurde abgetrennt...
URL: <http://demo.volkszaehler.org/pipermail/volkszaehler-users/attachments/20191231/4eb22b68/attachment-0001.html>
-------------- nächster Teil --------------
# RASPBERRY PI 2 (07.12.2019 buster -- nach Kartencrash...)
# "Pi 1 Model B"

cat /proc/cpuinfo

Hardware	: BCM2835
Revision	: 000e
Serial		: 000000004d1f4056
# Revision bedeutet lt. https://www.raspberrypi-spy.co.uk/2012/09/checking-your-raspberry-pi-board-version/
Model B Rev 2	512MB	000e

pi at ras2:~ $ gpio -v
gpio version: 2.44
Copyright (c) 2012-2017 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Raspberry Pi Details:
  Type: Model B, Revision: 02, Memory: 512MB, Maker: Sony 
  * Device tree is enabled.
  *--> Raspberry Pi Model B Rev 2
  * This Raspberry Pi supports user-level GPIO access.
pi at ras2:~ $ gpio readall
 +-----+-----+---------+------+---+-Model B1-+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
 |   2 |   8 |   SDA.1 |   IN | 1 |  3 || 4  |   |      | 5v      |     |     |
 |   3 |   9 |   SCL.1 |   IN | 1 |  5 || 6  |   |      | 0v      |     |     |
 |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 1 | ALT0 | TxD     | 15  | 14  |
 |     |     |      0v |      |   |  9 || 10 | 1 | ALT0 | RxD     | 16  | 15  |
 |  17 |   0 | GPIO. 0 |   IN | 1 | 11 || 12 | 0 | IN   | GPIO. 1 | 1   | 18  |
 |  27 |   2 | GPIO. 2 |   IN | 1 | 13 || 14 |   |      | 0v      |     |     |
 |  22 |   3 | GPIO. 3 |   IN | 1 | 15 || 16 | 0 | IN   | GPIO. 4 | 4   | 23  |
 |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  |
 |  10 |  12 |    MOSI |   IN | 0 | 19 || 20 |   |      | 0v      |     |     |
 |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |
 |  11 |  14 |    SCLK |   IN | 0 | 23 || 24 | 1 | IN   | CE0     | 10  | 8   |
 |     |     |      0v |      |   | 25 || 26 | 1 | IN   | CE1     | 11  | 7   |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+-Model B1-+---+------+---------+-----+-----+

# Auf SD-Karte installieren (pluto): 
unzip -p /home/rupert/Downloads/2019-09-26-raspbian-buster-lite.zip | sudo dd of=/dev/sdX bs=4M conv=fsync status=progress

# /dev/sdX1 mounten
# Datei "ssh" (0 Byte) anlegen:
sudo touch /media/rupert/boot/ssh 

# Pi bekommt vom DHCP des ras3 immer den Namen "ras2" zugewiesen!

# 07. Dezember 2019

Default PW für user pi gesetzt von "raspberry" auf "***":
passwd 

# Locale usw. setzen:
sudo raspi-config
: ras2
: de_DE.UTF-8 (default)
: Europe-Berlin

# ras3 in /etc/hosts ergänzen, damit er immer und sofort gefunden wird:
sudo vi /etc/hosts
192.168.188.2	ras3

# Automatischer login von rupert at pluto nach Anleitung https://klenzel.de/1871 (pluto):
ssh-copy-id pi at ras2 

# PW für user root gesetzt:
sudo passwd

sudo apt-get update && sudo apt-get upgrade

# "Log2Ram" https://github.com/azlux/log2ram mit erst mal nur 40MB 

# logrotate ist vorinstalliert.
# ggf. in /etc/logrotate.d für weitere Dateien die config nachbauen.

# rpi-monitor
# RPI-Monitor installieren lt. http://rpi-experiences.blogspot.de/p/rpi-monitor-installation.html
http://ras3:8888/status.html
# log2ram und sd_rw ergänzt wie bei ras3 (braucht sysstat)

wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
sudo apt-key add mosquitto-repo.gpg.key 
sudo apt-get install git mosquitto-clients wiringpi sysstat

# Remotebackup: Wird von pluto aus "gezogen" mittels Skript /usr/local/bin/backup-rasppi
# Dazu muss user remotebackup at pluto per ssh ohne pw auf pi at ras2 zugreifen können: siehe ~/.ssh/authorized_keys
# public key überspielen als remotebackup at pluto:
ssh-copy-id -i ~/.ssh/id_rsa.pub pi at ras2

# Datei ~/.ssh/authorized_keys auf ras2 muss in der Zeile, die auf "remotebackup at venus" endet, um dies ergänzt werden:
command="sudo rsync --server --sender -vlogDtprz --delete-excluded --numeric-ids . /" ssh-rsa AAAAB3Nz....

# Daten landen auf pluto in /home/remotebackup/ras2/daily.[0-7]
# Per at wird der Job "selbst-referenziell" auf +24h neu eingestellt. Falls pluto erst später wieder eingeschaltet wird, wird er nachgeholt.

# Uhrzeit wird in stretch offensichtlich mit diesem Service aus dem Netz gestellt:
service systemd-timesyncd status

#
# vzlogger gemäß https://wiki.volkszaehler.org/software/controller/vzlogger/installation_cpp-version

sudo apt-get install build-essential git-core cmake pkg-config subversion libcurl4-openssl-dev libgnutls28-dev libsasl2-dev uuid-dev libtool libssl-dev libgcrypt20-dev libmicrohttpd-dev libltdl-dev libjson-c-dev libleptonica-dev libmosquitto-dev libunistring-dev dh-autoreconf
cd ~
git clone https://github.com/volkszaehler/vzlogger.git
cd vzlogger
./install.sh

# Weiter mit volkszähler Config !!
-------------- nächster Teil --------------
set -x
# 
# Die Befehle fürs Backup in eine Funktion packen:
#

backup() {
	# Parameter $1 ist der Server
	# Rotieren (neues Logfile):
	/usr/local/bin/backup-rotate $1    > /home/remotebackup/backup.log 2>&1
	
	# Backup (Logfile weiterschreiben):
	/usr/local/bin/backup-rsync pi@$1 >> /home/remotebackup/backup.log 2>&1
	
	# Logfile nach daily.0 schieben:
	mv /home/remotebackup/backup.log /home/remotebackup/$1/daily.0
}

# Gleich mal nächsten Job anlegen (für den Fall, dass das Skript abbricht):
echo "/usr/local/bin/backup-rasppi" | at -q Z now + 1 day

#
# Tragen Sie hier die DNS-Namen der zu backuppenden Server ein
#

backup ras2
backup ras3
-------------- nächster Teil --------------
#!/bin/bash
#
# Script rotiert Backup-Verzeichnisse
# http://www.heinlein-partner.de
#
# Aufruf: backup-rotate <fqdn-servername>
#

# ### Aufrufparameter des Scripts ist ein FQDN-Hostname
if [ -n "$1" ] ; then
	SERVER="$1"
else
	echo "Error: Usage $0 <fqdn-hostname>"
	exit
fi

# ### Konfiguration
# Sollen wir pruefen, ob noch ein gewisser Prozentsatz
# an Plattenplatz und Inodes frei ist?
CHECK_HDMINFREE=true
HDMINFREE=90

# Soll die Daten-Partition readonly gemountet werden, 
# wenn wir sie nicht mehr brauchen?
MOUNT_RO=false
MOUNT_DEVICE=/dev/hdc1

# Unter welchem Pfad wird gesichert?
DATA_PATH=/home/remotebackup

# ### Let`s Rock`n`Roll....

# Pruefe auf freien Plattenplatz
GETPERCENTAGE='s/.* \([0-9]\{1,3\}\)%.*/\1/'
if $CHECK_HDMINFREE ; then
	KBISFREE=`df /$DATA_PATH | tail -n1 | sed -e "$GETPERCENTAGE"`
	INODEISFREE=`df -i /$DATA_PATH | tail -n1 | sed -e "$GETPERCENTAGE"`
echo "Disk free: " $KBISFREE $INODEISFREE
	if [ $KBISFREE -ge $HDMINFREE -o $INODEISFREE -ge $HDMINFREE ] ; then
		echo "Fatal: Not enough space left for rotating backups!"
		logger "Fatal: Not enough space left for rotating backups!"
		exit
	fi
fi

# Festplatte rw remounten falls gewünscht!
if $MOUNT_RO ; then
        if `mount -o remount,rw $MOUNT_DEVICE $DATA_PATH` ; then
                echo "Error: Could not remount $MOUNT_DEV readwrite"
                logger "Error: Could not remount $MOUNT_DEV readwrite"
                exit
        fi
fi

# Ggf. Verzeichnis anlegen
if ! [ -d $DATA_PATH/$SERVER/daily.0 ] ; then
        mkdir -p $DATA_PATH/$SERVER/daily.0
fi

echo "Rotating snapshots of $SERVER..."
logger "Rotating snapshots of $SERVER..."

# Das hoechste Snapshot abloeschen
if [ -d $DATA_PATH/$SERVER/daily.7 ] ; then
        rm -rf $DATA_PATH/$SERVER/daily.7
fi

# Alle anderen Snapshots eine Nummer nach oben verschieben
for OLD in 6 5 4 3 2 1  ; do
        if [ -d $DATA_PATH/$SERVER/daily.$OLD ] ; then
	        NEW=$[ $OLD + 1 ]
		# Datum sichern
		touch $DATA_PATH/.timestamp -r $DATA_PATH/$SERVER/daily.$OLD
                mv $DATA_PATH/$SERVER/daily.$OLD $DATA_PATH/$SERVER/daily.$NEW
		# Datum zurueckspielen
		touch $DATA_PATH/$SERVER/daily.$NEW -r $DATA_PATH/.timestamp
        fi
done

# Snapshot von Level-0 per hardlink-Kopie nach Level-1 kopieren
if [ -d $DATA_PATH/$SERVER/daily.0 ] ; then
        cp -al $DATA_PATH/$SERVER/daily.0 $DATA_PATH/$SERVER/daily.1
fi

# Festplatte ro remounten falls gewünscht!
if $MOUNT_RO ; then
        if `mount -o remount,ro $MOUNT_DEVICE $DATA_PATH` ; then
                echo "Error: Could not remount $MOUNT_DEV readonly"
                logger "Error: Could not remount $MOUNT_DEV readonly"
                exit
        fi
fi

-------------- nächster Teil --------------
#!/bin/bash
#
# Script zieht per rsync Backups
# http://www.heinlein-partner.de
#
# Aufruf: backup-rsync <fqdn-servername>
#

# ### Aufrufparameter des Scripts ist ein FQDN-Hostname
if [ -n "$1" ] ; then
	SERVER="$1"
else
	echo "Error: Usage $0 <fqdn-hostname> or <user at fdqn-hostname>"
	exit
fi

USER=$SERVER
COUNT=`echo $SERVER | awk -F'@' '{print NF}'`
if [ $COUNT -eq 2 ] ; then
	SERVER=`echo $USER | awk -F'@' '{print $2}'`
fi
echo "Using $USER for $SERVER"

# ### Konfiguration
# Sollen wir pruefen, ob noch ein gewisser Prozentsatz 
# an Plattenplatz und Inodes frei ist?
CHECK_HDMINFREE=true
HDMINFREE=90

# Soll die Daten-Partition readonly gemountet werden, 
# wenn wir sie nicht mehr brauchen?
MOUNT_RO=false
MOUNT_DEVICE=/dev/hdc1

# Unter welchem Pfad wird gesichert?
DATA_PATH=/home/remotebackup

# Liste von Dateipattern, die nicht gebackupt werden sollen
EXCLUDES=$DATA_PATH/$SERVER/rsync-excludes.conf

# Weitere Optionen für rsync. Ggf. macht eine Limitierung 
# der Bandbreite Sinn, Angabe in kbyte/sec:
# EXTRAOPT="--bwlimit=256"
EXTRAOPT=""


# ### Let´s Rock`n`Roll

# Pruefe auf freien Plattenplatz
GETPERCENTAGE='s/.* \([0-9]\{1,3\}\)%.*/\1/'
if $CHECK_HDMINFREE ; then
	KBISFREE=`df /$DATA_PATH | tail -n1 | sed -e "$GETPERCENTAGE"`
	INODEISFREE=`df -i /$DATA_PATH | tail -n1 | sed -e "$GETPERCENTAGE"`
echo "Disk free: " $KBISFREE $INODEISFREE
	if [ $KBISFREE -ge $HDMINFREE -o $INODEISFREE -ge $HDMINFREE ] ; then
		echo "Fatal: Not enough space left for rsyncing backups!"
		logger "Fatal: Not enough space left for rsyncing backups!"
		exit
	fi
fi

# Festplatte rw remounten falls gewünscht!
if $MOUNT_RO ; then
        if `mount -o remount,rw $MOUNT_DEVICE $DATA_PATH` ; then
                echo "Error: Could not remount $MOUNT_DEV readwrite"
                logger "Error: Could not remount $MOUNT_DEV readwrite"
                exit
        fi
fi

# Ggf. Verzeichnis anlegen
if ! [ -d $DATA_PATH/$SERVER/daily.0 ] ; then
        mkdir -p $DATA_PATH/$SERVER/daily.0
fi

# Los geht`s: rsync zieht ein Vollbackup
echo "Starting rsync backup from $SERVER at `date` ..."
logger "Starting rsync backup from $SERVER..."

rsync  -avz --numeric-ids -e ssh --delete --delete-excluded   \
        --exclude-from="$EXCLUDES"  $EXTRAOPT                   \
        $USER:/ $DATA_PATH/$SERVER/daily.0

# Rückgabewert prüfen.
# 0 = fehlerfrei, 
# 24 ist harmlos; tritt auf, wenn während der Laufzeit
# von rsync noch (/tmp?) Dateien verändert oder gelöscht wurden.
# Alles andere ist fatal -- siehe man (1) rsync
if ! [ $? = 24 -o $? = 0 ] ; then
	echo "Fatal: rsync finished $SERVER with errors!"
	logger "Fatal: rsync finished $SERVER with errors!"
fi

# Verzeichnis anfassen, um Backup-Datum zu speichern
touch $DATA_PATH/$SERVER/daily.0

# Fertig!
echo "Finished rsync backup from $SERVER at `date` ."
logger "Finished rsync backup from $SERVER..."

# Sicher ist sicher...
sync

# Festplatte ro remounten falls gewünscht!
if $MOUNT_RO ; then
        if `mount -o remount,ro $MOUNT_DEVICE $DATA_PATH` ; then
                echo "Error: Could not remount $MOUNT_DEV readonly"
                logger "Error: Could not remount $MOUNT_DEV readonly"
                exit
        fi
fi

-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : smime.p7s
Dateityp    : application/pkcs7-signature
Dateigröße  : 5599 bytes
Beschreibung: S/MIME Cryptographic Signature
URL         : <http://demo.volkszaehler.org/pipermail/volkszaehler-users/attachments/20191231/4eb22b68/attachment-0001.bin>


More information about the volkszaehler-users mailing list