Installation LXC - jens-maus/RaspberryMatic GitHub Wiki

Möchte man als Virtualisierungslösung auf Linux Containers (LXC) setzen um damit auf einem bereits bestehenden Debian-basierten Linux System (Debian, Ubuntu, RaspberryPiOS, Armbian, etc.) RaspberryMatic als nativen leichtgewichtigen Linux Container zu betreiben, kann man mit den folgenden Schritten eine Installation eines solchen LXC-basierten RaspberryMatic Systems vornehmen. Hierbei kann im Folgenden dann eine teilautomatische Installation vorgenommen werden.

Hinweis

Important

Bei der Nutzung von LXC im Kontext einer RaspberryMatic/CCU gilt zu beachten, dass im Gegensatz zu einer virtuellen Maschine z.B. unter Proxmox VE oder mittels QEmu/KVM auf dem jeweiligen Host-System (d.h. auf dem System auf dem man LXC betreibt) für den Betrieb eines solchen RaspberryMatic LXC gewisse Zusatzpakete und Modifikationen vorgenommen werden müssen um auf die notwendige Homematic Funkmodulhardware (z.B. RPI-RF-MOD, HmIP-RFUSB, etc.) zugreifen zu können. Zwar können diese Zusatzpakete/Modifikationen später wieder komplett zurückgenommen werden. Auf Grund dieser Abhängigkeiten zu notwendigen Paketen des Host-Systems können im späteren Verlauf (ggf. bei OS-Updates des Host-Systems) es zu Problemen kommen. Solche Host-Updates sollten also immer mit dem Wissen durchgeführt werden, dass diese ggf. Auswirkungen auf die Funktion des RaspberryMatic LXC Container haben kann.

Voraussetzungen

Note

Hat man unter seinem Host-System bereits LXC installiert und auch eine Netzwerk-Bridge (br0) als Hauptinterface eingerichtet kann man direkt mit Installation Container fortfahren.

Um ein RaspberryMatic LXC Container auf seinem bereits bestehenden Linux System betreiben zu können, müssen auf diesem (dem sogenannten "Host") vor der eigentlichen Installation gewisse Voraussetzungen erfüllt sein bzw. gewisse Vorkehrungen getroffen sein damit der in Betrieb zu nehmende RaspberryMatic LXC dann auch korrekt funktioniert. Dies betrifft vor allem die Netzwerkkonfiguration des Hostsystems. Damit dort der RaspberryMatic Container korrekt funktionieren muss darauf ein sogenanntes "Bridge" Interface (br0) mit statischer IP-Adresse eingerichtet werden worüber dann dann Host system mit dem LAN Interface verbunden wird. Je nach eingesetztem Betriebssystem und Netzwerkframework muss dies ggf. jeweils etwas anders umgesetzt werden.

In den kommenden Abschnitten werden hierbei in < und > eingeschlossene Platzhalter verwendet um die Netzwerkkonfiguration entsprechend umzusetzen. Die verwendeten Platzhalter sind hierbei wie folgt definiert:

  • <device>: der Name des Hauptinterfaces (z.B. eth0) unter dem das Host-System aktuell erreichbar ist.
  • <address>/<prefix>: die statische IPv4 Adresse samt Netzwerkprefix die man in Zukunft für das Host-System nutzen möchte (z.B. 192.168.178.10/24).
  • <gateway>: die IPv4 Adresse des "default gatway" bzw. Routers (z.B. 192.168.178.1).
  • <dns1>,<dns2>: die IPv4 Adressen (oder nur eine ohne komma) des DNS-Servers bzw. Routers (z.B. 192.168.178.1).

NetworkManager Umgebungen (Armbian, RaspberryPiOS)

Setzt man als Host-OS ein Linux ein das auf NetworkManager als Netzwerkmanagement Tool setzt (z.B. Armbian, RaspberryPiOS), so kann man mit den folgenden Schritten dafür sorgen das solch ein "Bridge Interface" entsprechend angelegt und nutzbar wird:

  1. Aktuellen Interfacenamen identifizieren: Mit dem folgenden Befehl sollte man an erstes sich alle aktuellen "Interfaces" ausgeben lassen:

    sudo nmcli con show --active

    Aus der Ausgabe dieses Befehles sollte man sich dann den Namen des Hauptinterfaces (z.B. eth0) notieren da man diesen dann später wieder benötigt. Zusätzlich dazu sollte man sich noch die aktuelle IP-Adresse bzw. eine IP-Adresse die man später statisch vergeben will samt Netmaske notieren (z.B. 192.168.178.10/24).

  2. bridge-utils installieren: Damit man eine "Netzwerk-Bridge" einrichten kann muss mit folgendem Befehl sichergestellt werden das die passenden bridge-utils installiert sind:

    sudo apt install bridge-utils
  3. Netzwerk-Bridge einrichten: Nun sollte man mit den folgenden Befehlen eine "Netzwerk Bridge" (br0) einrichten die später für alle LXC Container genutzt werden kann:

    sudo nmcli con add type bridge ifname br0 con-name br0 stp no forward-delay 0
    sudo nmcli con add type bridge-slave ifname <device> master br0
    sudo nmcli con modify br0 ipv4.addresses "<address>/<prefix>" ipv4.gateway "<gateway>" ipv4.dns "<dns1>,<dns2>" ipv4.method manual

    Anstelle der hier mit < und > eingeschlosenen Beispielwerten muss man stattdessen die oben genannten Platzhalter verwenden.

    ⚠️ Achtung: Bitte beachten, das sobald diese Befehle eingegeben werden das Host-System ggf. kurzzeitig seine aktuelle Netzwerkverbindung verliert und damit nicht erreichbar ist. Ggf. muss hier auch via direktem Tastatur/Monitorzugriff eingegriffen werden falls falsche Angaben bei diesen Befehlen vorgenommen werden.

  4. Neustart durchführen: Hat man die notwendige Netzwerkbridge (br0) eingerichtet sollte diese via ip a Befehl bzw. nmcli auf der Kommandozeile sichtbar werden. Trotzdem wäre nun angeraten vor der weiteren Einrichtung des LXC Containers erst ein Neustart des Hostsystems durchzuführen um sicherzustellen das dieses auch nach einem Neustart wieder korrekt hochfährt:

    sudo reboot

ifupdown Umgebungen (Debian-x86_64)

Setzt man als Host-OS ein Linux ein das auf ifupdown als Netzwerkmanagement Tool setzt (z.B. Debian Linux), so kann man mit den folgenden Schritten dafür sorgen das solch ein "Bridge Interface" entsprechend angelegt und nutzbar wird:

  1. bridge-utils installieren: Damit man eine "Netzwerk-Bridge" einrichten kann muss mit folgendem Befehl sichergestellt werden das die passenden bridge-utils installiert sind:
    sudo apt install bridge-utils
  2. /etc/network/interfaces anpassen: Um die statischen IP-Adressdaten muss man in der /etc/network/interfaces Datei sicherstellen das folgende Einträge existieren:
    auto lo
    iface lo inet loopback
    
    iface <device> inet manual
    
    auto br0
    iface br0 inet static
        address <address>/<prefix>
        gateway <gateway>
        dns-nameservers <dns1>,<dns2>
        bridge_ports <device>
        bridge_stp off
        bridge_fd 0
    
    Anstelle der hier mit < und > eingeschlosenen Beispielwerten muss man stattdessen die oben genannten Platzhalter verwenden.
  3. Neustart durchführen: Um die vorgenommene Konfigurationsänderung aktiv werden zu lassen, muss man nun via folgendem Befehl das Host-System einmal neustarten lassen um so auch zu kontrollieren das es wieder korrekt hochfährt und unter der gewählten IP-Adresse erreichbar ist:
    sudo reboot

netplan Umgebungen (Ubuntu-x86_64)

Setzt man als Host-OS ein Linux ein das auf netplan als Netzwerkmanagement Tool setzt (z.B. Ubuntu Linux), so kann man mit den folgenden Schritten dafür sorgen das solch ein "Bridge Interface" entsprechend angelegt und nutzbar wird:

  1. /etc/netplan/<file>.yaml anpassen: Um die statischen IP-Adressdaten sowie die Netzwerk-Bridge auf einem Netplan verwalteten System umzusetzen sollte man die unter dem /etc/netplan/ verzeichnis liegende yaml Datei wie folgt anpassen:
    network:
      version: 2
      renderer: networkd
    
      ethernets:
        <device>:
          dhcp4: no
          dhcp6: no
    
      bridges:
        br0:
          dhcp4: no
          dhcp6: no
          interfaces: [<device>]
          addresses: [<address>/<prefix>]
          routes:
          - to: default
            via: <gateway>
          nameservers:
            addresses: [<dns1>, <dns2>]
          parameters:
            stp: false
            forward-delay: 0
    Anstelle der hier mit < und > eingeschlosenen Beispielwerten muss man stattdessen die oben genannten Platzhalter verwenden.
  2. Änderungen anwenden: Mittels der folgenden Befehle kann man die unter netplan vorgenommenen Änderungen direkt anwenden lassen:
    sudo netplan generate
    sudo netplan --debug apply
    ⚠️ Achtung: Bitte beachten, das sobald diese Befehle eingegeben werden das Host-System ggf. kurzzeitig seine aktuelle Netzwerkverbindung verliert und damit nicht erreichbar ist. Ggf. muss hier auch via direktem Tastatur/Monitorzugriff eingegriffen werden falls falsche Angaben bei diesen Befehlen vorgenommen werden.
  3. Neustart durchführen: Hat man die notwendige Netzwerkbridge (br0) eingerichtet sollte diese via ip a Befehl bzw. nmcli auf der Kommandozeile sichtbar werden. Trotzdem wäre nun angeraten vor der weiteren Einrichtung des LXC Containers erst ein Neustart des Hostsystems durchzuführen um sicherzustellen das dieses auch nach einem Neustart wieder korrekt hochfährt:
    sudo reboot

Installation Container

Sind die unter Voraussetzungen genannte Dinge erfüllt und arbeitet das Host-System mit einer Netzwerkbridge (br0) auf, kann mittels den folgenden Schritten die Installation eines RaspberryMatic LXC Containers durchgeführt werden:

  1. Installationsskript starten: Um die Installation zu starten muss man in einer Konsole (z.b. in dem man sich via SSH mit dem Hostsystem verunden hat) folgenden Befehl zum automatischen Runterladen und Starten des install-lxc.sh Installationsskriptes durchführen:

    sudo sh -c "wget -qO - https://raspberrymatic.de/install-lxc.sh | bash -"
  2. Dependency Check bestätigen: In einem ersten Schritt wird der Installationsskript noch einmal überprüfen ob alle notwendigen Voraussetzungen und Zusatzpakete bereits auf dem jeweiligen Host-System installiert sind die für den RaspberryMatic LXC Betrieb notwendig. Hierzu wird der folgende Hinweis angezeigt den man dann im folgenden via Yes bestätigen kann um die Prüfungen durchführen zu lassen: ⚠️ Hinweis: Bitte hierbei beachten, dass man die Installation dieser für den LXC Betrieb notwendigen Zusatzpakete und Modifikationen jederzeit wieder zurücknehmen kann indem man wie in Abschnitt Deinstallation das install-lxc.sh Skript mit einer zusätzlichen uninstall Option aufrufen kann.

  3. Funkmodul Overlays Installation: Setzt man als Host-System ein ARM-basiertes System ein das über einen GPIO Bus verfügt (z.B. RaspberryPi, etc.) auf dem man ein RPI-RF-MOD oder HM-MOD-RPI-PCB direkt betreiben kann, so wird als nächstes abgefragt, ob man die notwendigen "device tree overlays" hierfür installieren lassen möchte: ⚠️ Hinweis: Wie erwähnt ist dieser Schritt nur notwendig wenn man vor hat eines der beiden GPIO basierten Funkmodule (RPI-RF-MOD, HM-MOD-RPI-PCB) direkt auf dem GPIO Bus seines ARM-basierten Systemes zu betreiben. Setzt man hingegen auf eine USB-basierte Anbindung (HmIP-RFUSB, HB-RF-USB-2, etc.) oder Ethernet-basierte (HB-RF-ETH, etc.) so ist dieser Schritt nicht notwendig und man sollte hier "No" auswählen.

  4. Version auswählen: Im Folgenden muss eine RaspberryMatic Version für die Installation des LXC containers ausgewählt werden:

    ⚠️ Hinweis: Bei der Auswahl der zu installierenden RaspberryMatic Version wird zwischen release und snapshot Versionen unterschieden. Bei letzterem muss beachten werden, dass es sich hierbei um experimentelle Entwicklungssnapshots handelt die entsprechend "instabil" sein könnten. Für eine produktive RaspberryMatic Umgebung sollte man daher bevorzugt auf die release Versionen setzen.

  5. Userdisk Pfad auswählen: Nun muss man den lokalen Pfad zu der sogenannten "Userdisk" es RaspberryMatic systems eingeben in welcher im laufenden Betrieb alle nutzerbezogenen Konfigurationsdateien und Zusatzpakete gespeichert werden. Als Standard wird hier bereits der Pfad /var/lib/raspberrymatic/userfs vorgegeben welcher ggf. neu angelegt wird oder aber auch (wenn er von einer anderen Installation herrührt) wiederverwendet werden kann:

    ⚠️ Hinweis: Wählt man einen Pfad aus der bereits existiert sollte man sicherstellen, das dieser aktuell nicht von einem anderen LXC Container (z.B. von einer Kopie/Clone) bereits verwendet wird. Hier darf in der Tat zum jeweiligen Startzeitpunkt eines RaspberryMatic Containers immer nur max. ein Container auf dieses userfs Verzeichnis zugreifen.

  6. Containername eingeben: Um den RaspberryMatic Container innerhalb seiner LXC Installation via Name referenzieren zu können, muss nun ein eineindeutiger Name hierfür eingegeben werden:

  7. Anzahl CPU-Cores eingeben: Für den anzulegenden RaspberryMatic Container wird man nun aufgefordert die Anzahl der zuzuweisenden CPU Cores (bevorugt >= 2) einzugeben:

  8. Arbeitsspeicherlimit eingeben: In einem weiteren Dialog wird man nun zur Eingabe des maximal zur Verfügung stehenden Arbeitsspeichers des RaspberryMatic Containers gebeten:

  9. Installation durchführen: Im Folgenden wird nun die eigentliche Installation und Konfiguration des RaspberryMatic LXC Containers vorgenommen und in der Ausgabe dann bestätigt das der Container korrekt angelegt/eingerichtet werden konnte:

  10. Neustart durchführen: Falls in einen der oberen Schritte Zusatzpakete wie Kernelmodule oder Device Tree Overlays installiert wurden sollte man nun erst einmal einen Neustart durchführen lassen:

    sudo reboot

Danach sollte das Hostsystem dann entsprechend hochfahren und im optimalen Falle dann auch gleich den neu angelegten RaspberryMatic LXC Container starten. Möchte man daraufhin dann die Ausgaben der Startconsole sehen kann man dies mit lxc-console <name> tun oder aber mit lxc-attach <name> direkt eine Shell geben lassen. Weitere Hinweise zur Bedienung/Überwachung/Umkonfiguration eines LXC Containers kann man aus den letzten Ausgaben des Installationsskriptes entnehmen oder aber aus den offiziellen Linux Containers manpages.

Update

Hat man bereits RaspberryMatic als LXC Container in Betrieb, so kann man mit den folgenden Schritten recht einfach ein Update der installierten Version auf eine neue bzw. andere Version durchführen lassen:

  1. Container herunterfahren: Als erstes sollte man dafür sorgen, dass der RaspberryMatic LXC ordnungsgemäß heruntergefahren ist. Dies kann auf der Kommandozeile via lxc-stop <name> durchführen lassen.

  2. Backup durchführen: Um sicherzustellen, dass man bei einem eventl. Problem wieder sofort zurück zur alten Version gehen kann, sollte man ein Backup durchführen. Mittels LXC kann man hierfür auch via des Kommandos lxc-snapshot <name> einfach ein entsprechenden Snapshot anlegen lassen auf dem man dann ggf. wieder zurückgehen kann.

  3. Updateskript aufrufen: Via einer geöffneten Konsole kann man unter Eingabe des folgenden Kommandos den install-lxc.sh Skript mit dem entsprechenden update Parameter aufrufen:

    sudo sh -c "wget -qO - https://raspberrymatic.de/install-lxc.sh | bash -s update"

  4. Container auswählen: Nachdem nach kurzer Ladezeit der Skript mit der update option gestartet wurde sollten in einer Auflistung alle RaspberryMatic container aufgelistet werden und man dazu aufgerufen werden den Container für das Update auszuwählen:

  5. Zielversion auswählen: Hat man den Container ausgewählt wird nach kurzer Prüfung eine Auflistung der auswählbaren Zielversionen präsentiert aus der man dann die Version auswählen sollte auf die man sein RaspberryMatic Container gerne updaten würde:

    ⚠️ Hinweis: Bei der Auswahl der zu installierenden RaspberryMatic Version wird zwischen release und snapshot Versionen unterschieden. Bei letzterem muss beachten werden, dass es sich hierbei um experimentelle Entwicklungssnapshots handelt die entsprechend "instabil" sein könnten. Für eine produktive RaspberryMatic Umgebung sollte man daher bevorzugt auf die release Versionen setzen.

  6. Update bestätigen: Bevor das eigentliche Update nun durchgeführt wird, muss man als letztes noch bestätigen, dass man dieses nun durchführen lassen möchte und man vorher entsprechend ein Backup gemacht hat:

  7. Update durchgeführt: Hat man das letzte Requester bestätigt, findet der eigentliche Updateprozess statt, über dessen Verlauf und Erfolg man dann in der Konsole entsprechend informiert wird:

Ist das Updateskript ohne Fehler durchgelaufen kann man nun entweder via lxc-start <name> den Container wieder starten und sich dann die Console während des Hochfahrens des Containers z.B. via lxc-console <name> direkt anschauen um eventl. Fehler beim Hochfahren auszuschließen.

Deinstallation

Da bei der Installation eines LXC-basierten RaspberryMatic containers auf dem jeweiligen Host-System gewisse Zusatzpakete und Modifikationen vorgenommen werden, damit der LXC Container in der Lage ist auf die an das System angeschlossene Homematic Funkhardware (RPI-RF-MOD, etc.) zuzugreifen, kann man mit dem folgenden Befehl in einer Console – falls man von einer LXC-basierten Installation später wieder Abstand nehmen will – die Installation dieser Zusatzpakete und Modifikationen rückgängig machen:

  1. Deinstallation aufrufen: Mit dem folgenden Befehl kann man in einer Console dafür sorgen das die Anpassungen entsprechend zurückgenommen werden:
    sudo sh -c "wget -qO - https://raspberrymatic.de/install-lxc.sh | bash -s uninstall"
  2. Deinstallation bestätigen: Nach dem oben gezeigten Aufruf des Installationsskriptes mit uninstall Option wird dieser als erstes um die Bestätigung des Uninstallprozesses bitten:
  3. Deinstallation durchführen: Hat man den Wunsch der Deinstallation bestätigt, so werden in einem nächsten Schritt alles Zusatzpakete und Modifikationen die für die Betrieb eines RaspberryMatic LXC containers notwendig sind auf dem Host-System zurückgenommen: ⚠️ Hinweis: Sollte während des Uninstall es zu Fehlermeldungen kommen kann man den Skript getrost mehrere male hintereinander Aufrufen, da dieser vor einem gewissen uninstall Schritt immer überprüft ob die Komponente noch existiert oder nicht.

Sind alle Deinstallationsschritte durchgelaufen, so sollte man einen Neustart des Host-Systems einplanen damit dieses im Anschluss auch entsprechend ohne die momentan ggf. noch im Arbeitsspeicher befindlichen Zusatzpakete weiterarbeiten kann. Zusätzlich kann es auch noch von Vorteil sein vor dem Neustart dafür zu sorgen, dass etwaige andere Abhängigkeiten die nicht mehr verwendet werden via sudo apt autoremove entfernt werden.

⚠️ **GitHub.com Fallback** ⚠️