Generell ist es relativ einfach eine bestehende FHEM Installation auf ein neues
Betriebssystem/System zu setzen:
- Backup FHEM
-
Kopie der aktuellen Backupdatei -> Server | USB Stick | per scp lokal
- sudo halt
-
neue SD Card mit aktuellem Image (ich behalte immer die alte SD erstmal in
Reserve)
-
setupBasic, setupFhem, testen
-
Backupdatei verfügbar machen -> Server | USB Stick mounten | per scp -
lokal -> nach /home/pi
- stop fhem
-
restore
des Backups
- start fhem
Sicherung / Backup
Bei mir ist beim obigen Plan mindestens die Anbindung an Dateiserver und die ssh
Verbindung auf der Strecke geblieben. Schritt 1 und 8 muss man dafür noch etwas
ausbauen.
Sicherung ssh Umgebung
Die notwendigen Dateien befinden sich in diesen Verzeichnissen:
- /etc/ssh für den ssh Host / Server
- /opt/fhem/.ssh für den User fhem
- /home/pi/.ssh für den User pi.
Ich werde zwei zusätzliche Dateien in den Backup Ordner von FHEM erstellen. Dies
könnte man auch von FHEM von Zeit zu Zeit machen lassen. Neben der Datei für
eine Historie mit Zeitstempel erzeuge ich noch eine ohne Zeitstempel. Damit muss
man bei der Wiederherstellung nicht lang suchen.
Man kann dieses als Script auch unter FHEM ausführen, da aber Systemdateien
gesichert werden, muss tar als sudo ausgeführt werden. Damit das funktioniert,
muss die
zuständige Datei um /bin/tar ergänzt werden.
datei=/opt/fhem/backup/ssh$(date +%Y%m%d_%H%M%S).tar.gz
sudo tar -czf $datei /etc/ssh /opt/fhem/.ssh /home/pi/.ssh
sudo cp $datei /opt/fhem/backup/ssh.tar.gz
Falls der User fhem gar kein ssh verwendet kommt ein Fehler, dann muss man die
Befehle abwandeln. Da die Dateien nicht voluminös sind, kann man auf zip
verzichten. Damit kann das tar Archiv leichter mit der Option -rf ergänzt
werden.
sudo tar -cf $datei /etc/ssh /home/pi/.ssh
cp $datei /opt/fhem/backup/ssh.tar
Der folgende Zweizeiler wirft zwar Fehler, sichert aber die ssh Dateien für
alle existierenden User.
datei=ssh$(date +%Y%m%d_%H%M%S).tar
sudo tar rf $datei /etc/ssh $(awk -F: '$3>998{print $6"/.ssh"}' /etc/passwd)
Will man einfach in FHEM die ssh Key für user fhem sichern kann man das auch
dort machen:
"datei=./backup/sshFhem$(date +%Y%m%d_%H%M%S).tar;; tar -cf $datei ./.ssh"
Und auch später wiederherstellen:
"datei=./backup/sshFhem*.tar;; tar -xf $datei ./.ssh"
Sicherung Dateiserver Umgebung
datei=/opt/fhem/backup/fsconf$(date +%Y%m%d_%H%M%S).tar.gz
sudo tar -czf $datei /etc/fstab /usr/.*credentials /etc/davfs2/secrets
cp $datei /opt/fhem/backup/fsconf.tar.gz
Hat man Scripte o.ä. zusätzlich in anderen Pfaden, kann man die natürlich
einfach in dem tar Befehl ergänzen und gleich mit sichern oder eine weitere
Datei nach gleichem Schema erzeugen.
Finale Sicherung des alten Systems
Damit man den finalen Status im FHEM System behält, muss man FHEM beenden und dann ein backup durchführen!
systemctl stop fhem
datei=/opt/fhem/backup/FHEM-$(date +%Y%m%d_%H%M%S).tar.gz
tar -czf $datei -C /opt/fhem --exclude ./backup ./
Wenn das Backup zu Ende ist, startet man
beispielsweise das Script /opt/fhem/backupFhem.sh und kopiert alle aktuellen Dateien
damit auf den Sicherungsserver.
Am Ende des Artikels habe ich noch den Hinweis auf Alternativen zum Server.
Wiederherstellung
Nachdem das neue System grundlegend installiert und getestet ist (Ergänzung
Schritt 5. optional: setupDavfs) wird die Sicherung zurückgespielt.
Die Verbindung zu meinem Windows Server geht relativ simpel. Ohne Angabe des
Usernamens wird der momentane User (root) verwendet. Ohne Angabe des Passwortes
wird es abgefragt:
sudo su
mount -t cifs //ServerName/Freigabe /mnt
mount -t cifs -o username=UserName //ServerName/Freigabe /mnt
mount -t cifs -o username=UserName,password=Passwort //ServerName/Freigabe /mnt
Ist das Laufwerk verbunden, kann auch ohne lokale Kopie sofort mit der
Wiederherstellung begonnen werden.
datei=/mnt/fhem/$(hostname)/backup/FHEM-$(date +%Y%m%d_%H%M%S).tar.gz
tar -xzf $datei -C /opt/fhem
Querverweis: Falls die Module im alten System nicht gut dokumentiert
waren, hilft eventuell dieser
Beitrag.
Wiederherstellung ssh
Bei meinen Systemen wurde immer nur der ecsda Key verwendet. Ich möchte nicht
die neue ssh Server Gesamtkonfiguration zerstören (da ändert sich immer mal was,
ich habe nicht untersucht was genau) sondern nur das wiederherstellen was
gebraucht wird. Unter der Annahme: es gibt nur eine aktuelle Datei im
Verzeichnis, wird damit der ecdsa Key in /etc/ssh wieder hergestellt:
datei=/mnt/fhem/$(hostname)/backup/ssh.tar.gz
tar -xzf $datei -C / --wildcards etc/ssh/ssh_host_ecdsa_*
Um die User .ssh Verzeichnisse wieder herzustellen, sollte dieser Befehl gut
sein
tar -xzf $datei -C / home/pi/.ssh/ opt/fhem/.ssh/
Damit steht die ssh Umgebung wieder.
Wiederherstellung Verbindungen zum Dateiserver
Die für die Verbindung verantwortlichen Scripte sollten im /opt/fhem Verzeichnis
liegen und sind damit schon Teile der Wiederherstellung. Die Datei /etc/fstab
und die jeweiligen Credential Dateien liegen aber unter Umständen "verstreut" im
System und sind jetzt entweder nicht vorhanden oder neu gemacht.
Zunächst die credential Datei(en) in /usr/
datei=/mnt/fhem/$(hostname)/backup/fsconf.tar.gz
tar -xzf $datei -C / --wildcards usr/.*credentials
Die davfs2/secrets will ich nur ergänzen, davfs muss schon installiert sein!
tar -xzf $datei etc/davfs2/secrets -O|grep magentacloud >> /etc/davfs2/secrets
Ich möchte gern die fstab nicht überbügeln sondern die neue Datei einfach um
meine Einträge ergänzen. Existieren z.B. mehrere Mountpoints in /media/ - kann
das in einer Zeile erledigt werden:
tar -xzf $datei etc/fstab -O|grep /media/ >> /etc/fstab
Jetzt müssen noch die Mountpoint erzeugt werden:
mkdir $(tar -xzf $datei etc/fstab -O|grep -o '/media/[a-Z,0-9]*'|tr '\n' ' ')
Jetzt kann man das Sicherungslaufwerk wieder trennen.
umount /mnt
Die Verbindung zu davfs2 erfordert auch noch die Gruppenmitgliedschaft in der
Gruppe davfs2
usermod -aG davfs2 fhem
Die Gruppenmitgliedschaft greift erst nach erneutem Login! Also mindestens FHEM
neu starten!
Alternativen zum Sicherungsserver
USB Stick
Man könnte einen USB Stick verwenden, der Raspberry Pi 3 verkraftet das Stecken
im laufenden Betrieb. Bei allen anderen Typen und "zur Vorsicht" ist aber vom
Stecken eines USB Sticks im laufenden Betrieb abzuraten. Zuerst schauen welches
Device der Stick geworden ist und dann einfach temporär mounten:
lsblk
mount /dev/sda1 /mnt
SCP - lokale Kopie
Mit scp ist es recht simpel sich eine Kopie der Dateien lokal zum holen und
diese später zurück zu spielen. Geht auch unter Windows 10 ab 1809 einfach
so!
scp pi@hostname:dateiname .
scp dateiname pi@hostname:
Die Restore Befehle muss man natürlich etwas abwandeln, entweder die Variable
$datei wird einfach auf die lokale Datei Homedir von pi gesetzt, oder im tar
Befehl die Datei direkt angeben.
Installation nodejs, pm2 und pip
Die Installation von nodejs hatte ich ja
hier schon erläutert.
Zusätzlich brauche ich "global" noch den Nodejs Prozessmanager pm2.
sudo su
curl -sL https://deb.nodesource.com/setup_10.x | bash -
apt-get install nodejs
npm install pm2 -g
Trotz der Sicherung des gesamten Ordners
installiere ich Landroid neu. Wie so oft gibt es mittlerweile neue Versionen.
Python Pakete werden mit Hilfe von pip installiert. Beispiel: die fhem API
apt-get install python-pip
pip install fhem
ToDo
Andere Applikationen unterhalb von /opt sichern
codebox