Freitag, 19. August 2022

HowTo - FHEM Umzug von System A nach System B

Scenario: Umzug auf neues System

  • System Alt: altes Linux, alte Hardware ...
  • System Neu: neues Linux, neue/andere Hardware Plattform ...

Zwei verschiedenen Hardware Systeme sind etwas einfacher zu handhaben, es geht aber auch auf der gleichen Hardware (z.B. Raspberry Pi mit SD Card Wechsel oder USB-Bootstick). Ich habe alle Schritte mit einem Raspberry Pi(Raspberry OS Lite) und einer Virtuellen Maschine(debian 11 netinst) getestet. Dieses HowTo ist auch eine Ergänzung zu meinem vorjährigen Artikel.

Mit dem Raspberry Pi Imager kann man eine neue SD Card effektiv vorbereiten und das System grundlegen konfigurieren (Zahnradsymbol am rechten unteren Rand nachdem man das OS ausgewählt hat) 

Es gab von mir schon ein paar ähnliche Artikel, dieser hier soll ganz gezielt Schritt für Schritt zeigen was zu tun ist. Windows 10 hat ssh und scp eingebaut, andere Tools braucht man nicht. Wer nicht mit Windows CMD arbeiten will findet die Codezeilen für Schritt 1 am Ende auch für Linux und Powershell.

Man kann alle Schritte beliebig oft wiederholen / durchspielen und dabei lernen.

Achtung (03.2024): Das FHEM Installermodul wird leider nicht mehr gepflegt, es häufen sich die Meldungen, das mein hier gezeigtes Verfahren der Ermittlung der fehlenden Debianpakete nicht mehr funktioniert. Ich habe derzeit keine Problem Behebung!

Achtung: In der Shell alle Codezeilen immer einzeln ausführen! Mehrere Zeilen auf einmal kann funktionieren - muss aber nicht!

Schritt 1 - kopieren der notwendigen Dateien

Arbeiten unter Windows in der CMD Shell - Windows Taste + cmd + enter

REM ein paar Variablen setzen
set "alt=pi@raspib3"        # username und host vom alten System
set "neu=otto@vmdebianfhem" # username und host vom neuen System
set "pfad=/opt/fhem"        # der Pfad in dem FHEM installiert ist
REM aktuellstes Backup ermitteln
for /f %i in ('ssh %alt% -t "ls -rt1 %pfad%/backup | tail -1"') do set datei=%i
REM alternativ eine Variante mit Umweg über eine Datei
REM ssh %alt% -t "ls -rt1 %pfad%/backup | tail -1" > datei.txt
REM set /p datei= < datei.txt
REM die Dateien vom alten System holen
scp %alt%:%pfad%/\{backup/%datei%,fhem.cfg\} .
REM eventuell die Hardware umbauen
REM die Dateien aufs neue System schaffen
scp %datei% fhem.cfg %neu%:
REM Ab jetzt interaktiv auf dem neuen System - anmelden
ssh %neu%

Schritt 2 - das neue System vorbereiten und die fhem.cfg testen

Ich habe drei Scripte erstellt: 

Das erste Script konfiguriert Sprache, Zeitzone, Hostname. Dies war ursprünglich für das Standard Raspberry Image gedacht. Konfiguriert man das System beim Setup (debian netinst) oder mit dem Raspberry Pi Imager, braucht man dieses Script nicht.

Arbeitet man auf einem Raspberry und hat ein UART Modul im Einsatz (HM-MOD-RPI-PCB, Busware COC oder ähnliches) kann man das System mit dem zweite Script konfigurieren. Danach muss man einen reboot machen.

Das letzte Script installiert und konfiguriert ein aktuelles FHEM, testet die oben kopierte fhem.cfg und gibt Informationen über fehlende Pakete aus. 

# Scripts vom GitHub holen 
wget -N https://raw.githubusercontent.com/heinz-otto/raspberry/master/setup{Basic.sh,Uart.sh,Prereq.sh}
# Nur ausführen wenn das neue System noch eingerichtet werden muss: Sprache, Zeitzone, Hostname  
#bash setupBasic.sh
#bash setupUart.sh # nur bei Raspberry Pi Systemen mit Aufsteckmodulen nötig 
bash setupPrereq.sh

Jetzt installiert man die fehlenden Debian Pakete: zur einfachen Handhabung erzeugt das Script eine Datei "DebianPaket" im aktuellen Verzeichnis. 

Nach der Installation startet man FHEM neu und führt zur Kontrolle nochmal das letzte Script aus.    

# entsprechend der Ausgabe Pakete installieren
sudo apt install $(<DebianPaket)
sudo systemctl restart fhem
# zur Kontrolle
bash setupPrereq.sh

Debian Pakete sollten jetzt keine mehr vermisst werden. Fehlen weiterhin Perl Module, muss man diese mit cpan installieren. Meist ist das etwas langwieriger.

Die folgende Beschreibung ist nur ein Ansatz, es kann sein, das die Module auch völlig anders installiert werden müssen. Siehe dazu auch im Wiki.

sudo apt install make curl
sudo cpan CPAN
sudo cpan install $(<PerlModul)

Schritt 3 - testen ob ein restore vom produktiven FHEM läuft 

Jetzt erfolgt der erste Test ob FHEM nach einem restore läuft.

Empfehlung: Altes FHEM System vorher beenden, um Probleme im Netzwerk zu vermeiden! (Cloudsystem mögen doppelte Anmeldung nicht usw.)

sudo systemctl stop fhem
sudo tar -xvzf $(ls -rt1 FHEM*.tar.gz | tail -1) -C /opt/fhem/
sudo systemctl start fhem

Schritt 4 - finale Umstellung

War der vorherige Test erfolgreich - wird umgestellt:

  1. stop fhem und exit im neuen System, 
  2. backup im Browser für das alte System starten und auf Abschluss warten, 
  3. die neue backup Datei vom alten auf das neue System kopieren (Schritt 1), 
  4. FHEM auf dem alten System beenden (ssh %alt% sudo systemctl stop fhem), 
  5. mit dem neuen System verbinden (ssh %neu%), 
  6. restore machen und FHEM starten (Schritt 3). 

Die entsprechenden Befehlszeilen stehen in den Abschnitten Schritt 1 und Schritt 3. 

Andere Shell für Schritt 1

Der Syntax unterscheidet an sich leicht - die Schritte an sich sind gleich!

Linux Shell :

# Variable setzen
alt=pi@raspib3
neu=otto@vmdebianfhem
pfad=/opt/fhem
# letztes Backup ermitteln
datei=$( ssh $alt -t "ls -rt1 $pfad/backup | tail -1|tr -d '\n'" )
# die Dateien holen
scp $alt:$pfad/\{backup/$datei,fhem.cfg\} .
# die Dateien aufs neue System schaffen
scp $datei fhem.cfg $neu:
# Ab jetzt interaktiv auf dem neuen System - anmelden
ssh $neu

In der Windows Powershell kann man die Variablen leichter setzen als in der CMD, dafür ist es immer wieder ein Abenteuer Programme (ssh scp) mit ein paar Parametern aufzurufen:

# Variable setzen
$alt='pi@raspib3'
$neu='otto@vmdebianfhem'
$pfad='/opt/fhem'
# letztes Backup ermitteln
$datei=$( ssh $alt -t "ls -rt1 $pfad/backup | tail -1|tr -d '\n'" )
# die Dateien holen - die Setzung der Klammern und Hochkommas ist eine echte Hürde
scp "${alt}:${pfad}/{backup/${datei},fhem.cfg}" .
# die Dateien aufs neue System schaffen
scp ${datei} fhem.cfg ${neu}:
# Ab jetzt interaktiv auf dem neuen System - anmelden
ssh $neu

Es gibt verschiedene Möglichkeiten Strings aus Zeichen und Variablen zusammenzusetzen. Die Zeile mit scp berücksichtigt folgendes:

  • Die Parameterübergabe an scp erfordert zwei getrennte Strings: quelle und ziel.
  • Die doppelten Anführungszeichen erzeugen einen String und ermöglichen die Auflösung von Variablen innerhalb.
  • Die geschweifte Klammern (braces) ${variable} grenzen den Namen von den anderen Zeichenketten ab. Beim Doppelpunkt ist das existenziell, beim Schrägstrich könnte man es auch weglassen.
  • Achtung: zwei geschweifte Klammern im String "pfad/{datei1,datei2}" bewirken im Linux die "Brace Expansion" und haben nichts mit Variablen zu tun. Interessanterweise muss man sie, im Gegensatz zur Linuxshell, in der Powershell nicht schützen/escapen.
  • Konsequenterweise müsste das Ziel (der Punkt) auch in "." gesetzt werden, es funktioniert aber ohne.

ToDo?

Code Block

Das ist mein Platzhalter für Erweiterungen.

23 Kommentare:

  1. Hallo Otto,
    danke für diese Anleitung. Leider scheitere ich bereits am PW des alten System beim ersten Script (Linux) - kann es sein, das dabei eine andere KB-Belegung als der Standard DE zum tragen kommt?
    Gruß, Christoph

    AntwortenLöschen
    Antworten
    1. Hat sich erledigt - war beim Übernehmen des ssh-Befehles bzw. des Usernamens ein Tippfehler hinein geraten ...

      Löschen
  2. Hallo Otto,
    den Umzug von Hardware (Funkmodule...) hast du nicht beschrieben. Das Testen auf dem neuen System ist m. E. nicht ganz trivial und ohne Unterbrechungen auf dem alten System möglich. Hast du für das Vorgehen Empfehlungen parat?
    Danke!
    Piet

    AntwortenLöschen
    Antworten
    1. Hallo Piet, die Antwort wäre ziemlich komplex - je nach Funkmodule und Anbindung (LAN, USB usw.). Da kann man kaum etwas generelles sagen.
      Gruß Otto

      Löschen
  3. Hallo Otto,
    danke für die Anleitung. Leider klappt das Runterladen des Scripts "setupPrereq.sh" nicht. Die beiden anderen Scripte konnte ich runterladen. Woran kann das liegen?
    Danke und Gruß
    Olaf

    AntwortenLöschen
    Antworten
    1. Hallo Olaf,
      gerade getestet: die Zeile wget -N https://raw.githubusercontent.com/heinz-otto/raspberry/master/setup{Basic.sh,Uart.sh,Prereq.sh} funktioniert einwandfrei.
      Was kommt bei Dir für ein Fehler?
      Gruß Otto

      Löschen
    2. Hallo Otto,
      jetzt hat es geklappt. Komisch, das ich gestern nur die ersten beiden Scripte runterladen konnte.
      Gruß Olaf

      Löschen
  4. Hallo Otto,

    in einem Proxmox LXC-Container unter Bookworm habe ich versucht den Script setupPrereq.sh auszuführen. Dabei bekomme ich aber folgende Fehler/Warnungen:

    W: GPG-Fehler: https://debian.fhem.de/nightly InRelease: Die folgenden Signaturen waren ungültig: EXPKEYSIG 95D737016F529CF1 betateilchen
    E: Das Depot »https://debian.fhem.de/nightly InRelease« ist nicht signiert.
    N: Eine Aktualisierung von solch einem Depot kann nicht auf eine sichere Art durchgeführt werden, daher ist es standardmäßig deaktiviert.
    N: Weitere Details zur Erzeugung von Paketdepots sowie zu deren Benutzerkonfiguration finden Sie in der Handbuchseite apt-secure(8).

    Habe auch versucht das nachzuvollziehen, komme aber nicht auf ide Lösung.

    Jens

    AntwortenLöschen
    Antworten
    1. Hallo Jens, das Problem sollte mittlerweile behoben sein.
      https://forum.fhem.de/index.php?topic=122818.msg1286486#msg1286486
      Gruß Otto

      Löschen
  5. Update auf Bookworm bzw. neu mit rpi-imager

    Nach Upgrade bullseye auf bookworm habe ich micht doch entschieden mit neuem Datenträgen frisch anzufangen.
    Bin mit deiner Umzugsanleitung ganz gut durchgekommen.
    Letzlich hadere ich zum Schluss mit der Ausgabe von "setupPrereq.sh":
    => Analyse mit Datei /home/pi/otto/fhem.cfg wird gestartet
    es fehlen keine Perl Module
    => mit folgenden debian Paketen könnten die oben genannten Perl Module installiert werden
    =>0ad abs-guide aces3-data acl2-books-source acpid advi-examples afte...
    eine lange Liste, deren Aussage ich nicht ganz einordnen kann.
    Muss ich die installieren oder sind das aufgezeigte Möglichkeiten falls Perl-Module fehlen würden?

    Gruß Ralf

    AntwortenLöschen
    Antworten
    1. Hallo Ralf, die Liste unten klingt jetzt irgendwie nicht sinnvoll, wenn kein Modul fehlt sollte er auch keine Pakete anbieten. Komme derzeit nicht dazu das zu testen.
      Gruß Otto

      Löschen
    2. Ich versuche mal deine Codezeile im Script zu verstehen und es händisch auszuführen.
      Das Ergebnis war übrigens bei Erst- und Zweit/Drittausführung gleich.

      Löschen
    3. Achso, noch was fiel mir auf. Auch in der Weboberfläche fehlen lt. Installer keine Perl-Module. Allerdings bei gezielter Befragung (z. B. Dblog, Dbrep) fehlten doch noch einzelne Module.
      Die fhem.cfg %alt% war im gleichen Verzeichnis wie dein Script.

      Löschen
    4. Das wird so ein Alterungsproblem werden. Ich habe ja das Installermodul nur verwendet, es wird mW nicht mehr gepflegt. Wenn da nicht alles sich selbst an den Fortschritt anpasst ist die Idee irgendwann obsolete. Ich übergebe ja die Perlmodule an Apt-file der spukt dann die debian Pakete aus. Siehe auch den Artikel https://heinz-otto.blogspot.com/2019/07/infos-zur-installation-von-modulen-und.html

      Löschen
    5. Das mit dem Installer ist soweit schon ok (habe mich noch nicht mit der Pflege auseinander gesetzt). Es hilft im ersten Step ja immer noch weiter.

      Das eigentliche Problem war ja die lange Liste an Modulen (obwohl "nichts" fehlt), die aus dem Script herauspurzelt - bei leerer "$PerlModul".

      Deine Code (ich vesteh die Regex im sed nicht aber egal):
      echo $PerlModul|tr " " "\n"|sed '/^JSON$/d;s/$/./;s/^/\//'|apt-file search -l -f -

      der Teil:
      echo $PerlModul|tr " " "\n"|sed '/^JSON$/d;s/$/./;s/^/\//'

      liefert als Ergebnis "/."
      und daraus macht apt-file search eine Liste von "allen?" möglichen Modulen von a-z

      Löschen
    6. bei mir 2502 package names um genau zu sein :-)

      Löschen
  6. Hallo Otto
    Ich komme bei deiner Anleitung bis
    "bash setupPrereq.sh" und bin dann überrascht, dass mir angeblich hunderte Pakete fehlen sollen - egal.

    Weiter mit "sudo apt install $(<DebianPaket)"
    Da werden einige zu installierende Pakete gelistet, um dann bei folgendem Fehler abzubrechen:
    "wfplug-pixdecor-dbgsym : Depends: wfplug-pixdecor (= 0.7) but it is not installable
    wfplug-winshadows-dbgsym : Depends: wfplug-winshadows (= 0.4) but it is not installable
    E: Error, pkgProblemResolver::Resolve generated breaks, this may be caused by held packages."

    Wie soll ich jetzt weiter machen?
    Gruß Andi

    AntwortenLöschen
    Antworten
    1. Hallo Andi, dann musst Du die Liste der Pakete nehmen und die Stück für Stück installieren. Ich glaube mittlerweile, weil das Installermodul nicht mehr gepflegt wird ist dieses Vorgehen nicht mehr brauchbar.
      Gruß Otto

      Löschen
    2. Allerdings klingt mir wf- nach einer grafischen Umgebung? Mit einer Desktopversion von Linux habe dieses Verfahren sowieso nie getestet.!

      Löschen
    3. Kein Desktop sondern Headless! Ich steige mit Raspberry 3B von Jessie Lite auf Bookworm Lite um.
      Wahrscheinlich ist das auch der Grund warum wf- nicht funktioniert. Aber warum kommt es überhaupt in die Liste?
      Mir ist auch aufgefallen, dass bei den hunderten ermittelten Paketen z.B. Kodi zu lesen ist obwohl ich mich nicht erinnere, jemals damit experimentert zu haben.

      Frage zu einem radikalen Ansatz:
      Gibt es eine Liste aller in Fhemmodulen eingesetzten Linux Pakete?
      Wie sehr mülle ich meinen Raspi zu, wenn ich die einfach drauf gebe? Was wären die Auswirkungen auf Speicherplatz und Geschwindigkeit?
      Das gleiche dann auch für Perl Pakete.

      Gruß Andi

      Löschen
    4. Ich wollte mich an die manuelle Installation der Liste machen aber bei Durchsicht der knapp 3000! Pakete kommen starke Zweifel über die Sinnhaftigkeit auf. Da finden sich Namen wie LibreOffice, vlc und Kodi, das kann ja auf einem Headless Bookworm Lite wohl nie was werden.
      Ich habe auf meinem Fhem zwar einiges probiert aber diese Pakete kann ich mir einfach nicht erklären. Ich habe über die Jahre gefühlt 20-30 Pakete installiert aber nur anfangs dokumentiert.
      Wie komme ich aus dem Schlamassel raus?
      Gruß Andi

      Löschen
    5. Hallo Andi, diese Liste abzuarbeiten macht keinen Sinn!
      Normalerweise steht in der Doku zum Modul (commandref bzw. help Modulname) drin welche Voraussetzungen verlangt werden. Meist werden dort CPAN Module genannt, ich mag die Installation mit CPAN nicht und suche mir immer die debian Pakete dazu.
      Es kommt aber vor, das in der Doku nicht alles drin steht (schlecht aber ist leider so). Meist hilft das Log vom FHEM Start in einem solchen Fall mit entsprechenden Fehlermeldungen.
      Ich habe mir eine Liste erstellt von den Paketen die ich installiert habe und pflege die (so leidlich).
      Gruß Otto

      Löschen