Ankündigung

Einklappen

Sammelbestellung ETS5-UPGRADE gestartet...

Die Sammelbestellung für ETS5 UPGRADE ist gestartet. Infos unter: Link
Mehr anzeigen
Weniger anzeigen

SmarthomeNG mit Rasbian Lite ohne Schreibezugriff auf SD-Karte machbar?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    SmarthomeNG mit Rasbian Lite ohne Schreibezugriff auf SD-Karte machbar?

    Hallo,

    hat schon mal jemand Erfahrungen mit read-only Speicherzugriff mit dem RPI gemacht?

    Bisher hatte ich nur den systemd-journald service auf speichern im RAM gesetzt um die Lebensdauer der SD-Karte zu verlängern.

    Code:
    etc/systemd/journald.conf:
    Storage=volatile
    ForwardToSyslog=no
    Jetzt hatte ich das Skript von adafruit entdeckt um den RPI komplett im read-only Modus zu betreiben.

    https://learn.adafruit.com/read-only-raspberry-pi/

    Für SHNG funktioniert das ganze aber dann doch nicht so einfach. Beim starten von SHNG kommt der erste Fehler beim Versuch ein pidfile zu generieren.

    Code:
    Traceback (most recent call last):
      File "/usr/local/smarthome/bin/smarthome.py", line 1049, in <module>
       lib.daemon.write_pidfile(psutil.Process().pid, PIDFILE)
      File "/usr/local/smarthome/lib/daemon.py", line 114, in write_pidfile
        fd = open(pidfile, 'w+')
    OSError: [Errno 30] Read-only file system: '/usr/local/smarthome/var/run/smarthome.pid'
    Gibt es einen Workaround um SHNG auf einem read-only System laufen zu lassen?

    Falls nicht, gibt es weitere Tricks um Rasbian Lite mit SHNG und minimalen Schreibe-Speicherzugriff zu konfigurieren?

    #2
    In dem Fall mußt Du halt eine Ramdisk anlegen und dafür sorgen, das die PID dort gespeichert wird.

    Oder alternativ eine sehr gute SD-Karte 8GB und ein stabiles Netzteil sowie eine Backup Strategie dazu überlegen.

    Kommentar


      #3
      EDIT:
      wunderbar scheint zu funktionieren:

      Schritte um SHNG im read-only Modus auszuführen:
      Code:
      sudo nano /etc/fstab
      folgende Zeilen anfügen
      Code:
      tmpfs /usr/local/smarthome/var/cache/ tmpfs nodev,nosuid,size=1M 0 0
      tmpfs /usr/local/smarthome/var/db/ tmpfs nodev,nosuid,size=1M 0 0
      tmpfs /usr/local/smarthome/var/log/ tmpfs nodev,nosuid,size=1M 0 0
      tmpfs /usr/local/smarthome/var/rrd/ tmpfs nodev,nosuid,size=1M 0 0
      tmpfs /usr/local/smarthome/var/run/ tmpfs nodev,nosuid,size=1M 0 0
      Code:
      sudo mount -a
      Ich habe nocht nocht geprüft ob alle Ordner aus var notwendig sind und wenn welche Größe cache, db, log, rrd und run haben sollten.

      Können die Ordner im Normalbetrieb vollgeschrieben werden? Wenn ja was passiert dann?

      ok, danke

      Also:
      1. Ramdisk anlegen
      2. Zeile 66 smarthome.py:
        Code:
        PIDFILE= os.path.join(BASE,'var','run','smarthome.pid')
        anpassen
      Ich probiere es gleich aus.
      Zuletzt geändert von shrimp; 28.05.2018, 13:34.

      Kommentar


        #4
        cache wird benötigt, wenn Du irgendwo in den Items cache: true stehen hast, also z.B. UZSU
        db wird benötigt, wenn Du das sqlite Plugin nutzt oder das database Plugin mit sqlite Datenbank
        rrd wir nur benötigt, wenn Du das rrd Plugin einsetzt. (macht das noch jemand?)
        run braucht es für die prozess id
        log wird für logfiles benötigt.

        Kommentar


          #5
          Ok ich hatte znächst nur /run als DISKRAM erstellt und weil da die nächste Fehlermeldung kam hab ich gleiche alle Elemente in /var als DISKRAM erstellt.

          Für das pid-file in run sollten ja ein paar Bytes schon genügen. Wie funktioniert das beim loggen? Ist das ein Ringspeicher?

          Kommentar


            #6
            Hi,

            cache, db und rrd willst du nicht in einer ramdisk haben, du verlierst sonst alle gespeicherten werte beim Neustart.

            Gruß Waldemar

            Kommentar


              #7
              cache, db und rrd willst du nicht in einer ramdisk haben, du verlierst sonst alle gespeicherten werte beim Neustart.
              Gut aber das wird sich nun einmal nicht vermeiden lassen wenn das System read-only sein soll.

              Kommentar


                #8
                Das loggen kannst Du frei konfigurieren. Schau mal in der Doku nach.

                Kommentar


                  #9
                  Moin,

                  ich versuche gerade SmarthomeNG auf einem read-only file-system auszuführen. Leider folgt ein Fehler:
                  --> Kann ich den Test - joined item structs- irgendwo abschalten?

                  Code:
                  2020-01-05  13:15:13 WARNING  lib.item            load_itemdefinitions(): For testing the joined item structs are saved to /usr/local/smarthome/etc/structs_joined.yaml
                  2020-01-05  13:15:13 ERROR    __main__            Unhandled exception: [Errno 30] Das Dateisystem ist nur lesbar: '/usr/local/smarthome/etc/structs_joined.yaml'
                  <class 'OSError'>
                    File "/usr/local/smarthome/bin/smarthome.py", line 1252, in <module>
                      sh.start()
                    File "/usr/local/smarthome/bin/smarthome.py", line 549, in start
                      self.items.load_itemdefinitions(self._env_dir, self._items_dir, self._etc_dir, self._plugins_dir)
                    File "/usr/local/smarthome/lib/item.py", line 215, in load_itemdefinitions
                      shyaml.yaml_save(os.path.join(etc_dir, 'structs_joined.yaml'), self._struct_definitions)
                    File "/usr/local/smarthome/lib/shyaml.py", line 205, in yaml_save
                      with open(filename, 'w') as outfile:

                  Kommentar


                    #10
                    Nein, aber Du kannst über einen Start Parameter von SmartHomeNG die Konfig Verzeichnisse auf ein anderes beschreibbares Verzeichnis legen.

                    Auf einem vollständig read-Only System wird die SmartHomeNG an allen möglichen Ecken um die Ohren fliegen (logging, cache, ...)
                    Viele Grüße
                    Martin

                    There is no cloud. It's only someone else's computer.

                    Kommentar


                      #11
                      KHome Was willst Du denn damit bezwecken? SD-Karte schützen oder 'ne Demo erstellen für andere zum Schauen?

                      Kommentar


                        #12
                        Ich habe neben meiner "zentralen" Hausautomatisierung eine weitere Installation mit laufen, die Daten per MQTT austauscht.
                        Letztendlich ist meine zweite Installation ein "Smart"-Wecker - Quasi eine Demo .
                        smartwecker.jpg
                        Wenn der Strom mal ausfallen sollte / oder Smarthome die SD Karte über die Laufzeit zu oft beschreibt, dann sollte der Wecker / die SD-Karte noch lange weiter leben...

                        ...und da SmarthomeNG ein sehr feines Framework für Python ist und der Raspberry Zero I2C Hardware gut unterstützt, wurde es die HW/SW meiner Wahl für den Wecker
                        (sicherlich auch alles mit einem ESP8266 machbar, jedoch nicht so schön zu debuggen wie mit dem Backend)

                        Kommentar


                          #13
                          Du könntest in der RAM Disk ein Verzeichnis anlegen und alle Config Verzeichnisse dort hin kopieren:
                          /etc
                          /items
                          /logics
                          /scenes

                          und dann SmartHomeNG mit der Option --config_dir <Verzeichnis> starten. Als Verzeichnis müsstest Du das von Dir auf der RAM Disk angelegte Verzeichnis angeben.
                          Viele Grüße
                          Martin

                          There is no cloud. It's only someone else's computer.

                          Kommentar


                            #14
                            Msinn : Danke für den Hinweis mit der Config_dir. Nun funktioniert mein Rapsi mit SmarthomeNG "read-only = gehärtet"

                            Nochmal zusammenfassend für alle, die auch eine "Demo" erstellen möchten:

                            0. Allgemeine Raspi Anleitung folgen (Alle mounts mit "ro", Log-Services ersetzen, DHCPD/Random seed verlagern):
                            https://medium.com/@andreas.schallwi...h-80c0f7be7353

                            1. Verzeichnis für SmarthomeNG readonly-config anlegen:
                            Code:
                            su smarthome
                            mkdir /usr/local/smarthome/readonly
                            2. /etc/fstab mit Root-Rechten für "RAM"-Disk erweitern mit:
                            Code:
                            tmpfs /var/log tmpfs nodev,nosuid,size=30M 0 0
                            tmpfs /var/tmp tmpfs nodev,nosuid 0 0
                            tmpfs /tmp tmpfs nodev,nosuid 0 0
                            tmpfs /usr/local/smarthome/var/cache/ tmpfs nodev,nosuid,size=50M 0 0
                            tmpfs /usr/local/smarthome/var/db/ tmpfs nodev,nosuid,size=1M 0 0
                            tmpfs /usr/local/smarthome/var/log/ tmpfs nodev,nosuid,size=50M 0 0
                            tmpfs /usr/local/smarthome/var/rrd/ tmpfs nodev,nosuid,size=1M 0 0
                            tmpfs /usr/local/smarthome/var/run/ tmpfs nodev,nosuid,size=10M 0 0
                            tmpfs /usr/local/smarthome/var/ics/ tmpfs nodev,nosuid,size=10M 0 0
                            tmpfs /usr/local/smarthome/requirements/ tmpfs nodev,nosuid 0 0
                            tmpfs /usr/local/smarthome/readonly/ tmpfs nodev,nosuid  0 0
                            3. /etc/rc.local mit Root-Rechten erweitern (vor exit 0), um bestehende Config nach TMPFS-Erstellung zu übertragen
                            Code:
                            cp -a /usr/local/smarthome/etc/ /usr/local/smarthome/readonly/etc/
                            cp -a /usr/local/smarthome/logics/ /usr/local/smarthome/readonly/logics/
                            cp -a /usr/local/smarthome/scenes/ /usr/local/smarthome/readonly/scenes/
                            cp -a /usr/local/smarthome/items/ /usr/local/smarthome/readonly/items/
                            4. SmarthomeNG mit geänderter Config_Dir starten lassen:
                            Gelb-markierte Zeile in /lib/systemd/system/smarthome.service erweitern.
                            Code:
                            [Unit]
                            Description=SmartHomeNG daemon
                            After=network.target
                            After=knxd.service
                            After=knxd.socket
                            
                            [Service]
                            Type=forking
                            ExecStart=/usr/bin/python3 /usr/local/smarthome/bin/smarthome.py --config_dir /usr/local/smarthome/readonly/
                            
                            User=smarthome
                            PIDFile=/usr/local/smarthome/var/run/smarthome.pid
                            Restart=on-abort
                            
                            [Install]
                            WantedBy=default.target
                            dann noch rebooten und alles funktioniert wie gewünscht.

                            Wenn nun die Items / Configs zur Laufzeit über das Backend verändert werden, gehen diese Änderungen verloren!
                            Daher sind gewünschte Anpassung weiterhin im Verzeichnis usr/local/smarthome/logics/ vorzunehmen. Nach einem Reboot / oder einer erneuten Kopie und Neustart von SmarthomeNG werden Änderungen übernommen.

                            Kommentar

                            Lädt...
                            X