Upgrade 7.1->7.2 schlägt auf Odroid C1 fehl

Moin!

Heute habe ich auf meinem Odroid C1 mit Ubuntu 20.04 und IP-Symcon 7.1 mal wieder ein apt upgrade gemacht. Leider hat danach IP-Symcon nicht mehr funktioniert und der Dienst (/usr/bin/symcon) ist einfach mit einer Exception abgestürzt (Illegal instruction), ohne das was ins logfile geschrieben wurde.

Nachdem ich ewig versucht habe, es wieder zum Laufen zu bekommen (inkl. settings.json zurücksetzen), habe ich unter Versionenübersicht entdeckt, das bei Raspberry Pi steht „(kein Pi 1, Zero 1)“. Das hat mich dann auf die Idee gebracht, dass es irgendwie an der Hardware liegt und das passt auch zur Exception.
Danach habe ich mir vergebens einen Wolf gesucht, wie man IP-Symcon downgraden kann. Ich konnte noch nicht mal herausfinden, welches Build-Versionen es jeweils gibt, also z. B. 7.1-442. Die habe ich dann im apt log gefunden und konnte sie so wieder installieren (wget http://apt.symcon.de/pool/symcon/rpi/symcon_7.1-442_armhf.deb & dpkg -i symcon_7.1-442_armhf.deb). Danach habe ich die package version erstmal auf 7.1-* gepinnt, damit bei der nächsten Aktualisierung des Systems IPS weiter funktioniert.

Grundsätzlich wäre es schön, wenn es eine detaillierte Versionshistorie mit allen Versionsnummern gäbe und auch klar dokumentiert wird, was genau an Hardware-Voraussetzungen notwendig sind bzw. bei einer neueren Version nicht mehr unterstützt wird. Warum geht z. B. der Zero 1 nicht mehr? An 64 bit kann es nicht liegen; das wurde erst mit dem Zero 2 W ermöglicht.

Mir ist klar, dass der Odroid nicht offiziell unterstützt wird. Da es jedoch eine armhf-Hardware ist, kann es schon noch eine Weile funktionieren.

Nun ist die Frage, ob ich mit ein aktuelles Armbian Image mit Debian 12 (Bookworm) installieren und damit testen soll, oder ob sich ein Debugging lohnt. Ich habe auch noch Odroid C2 da und könnte da mit Armbian Noble (Ubuntu 24.04) versuchen, IPS 7.2 ans laufen zu bekommen.
Ich würde nur vorher gern wissen, wie ich meine Zeit am sinnvollsten einsetzen kann.

Hat jemand anderes auch Probleme mit IPS 7.2 auf einem Odroic C1?

Okay, gdb habe ich fix angeworfen und es kommt folgender Fehler:

Program received signal SIGILL, Illegal instruction.
Thread 1 (Thread 0xb6ff3430 (LWP 12675)):
#0  0x020aca10 in std::pair<std::__detail::_Node_iterator<std::pair<BACnetEngineeringUnits const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, false, false>, bool> std::_Hashtable<BACnetEngineeringUnits, std::pair<BACnetEngineeringUnits const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<BACnetEngineeringUnits const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::__detail::_Select1st, std::equal_to<BACnetEngineeringUnits>, std::hash<BACnetEngineeringUnits>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<false, false, true> >::_M_insert<std::pair<BACnetEngineeringUnits const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, std::__detail::_AllocNode<std::allocator<std::__detail::_Hash_node<std::pair<BACnetEngineeringUnits const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, false> > > >(std::pair<BACnetEngineeringUnits const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, std::__detail::_AllocNode<std::allocator<std::__detail::_Hash_node<std::pair<BACnetEngineeringUnits const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, false> > > const&, std::integral_constant<bool, true>, unsigned int) ()
#1  0x020ac948 in std::_Hashtable<BACnetEngineeringUnits, std::pair<BACnetEngineeringUnits const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<BACnetEngineeringUnits const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::__detail::_Select1st, std::equal_to<BACnetEngineeringUnits>, std::hash<BACnetEngineeringUnits>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<false, false, true> >::_Hashtable<std::pair<BACnetEngineeringUnits const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const*>(std::pair<BACnetEngineeringUnits const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const*, std::pair<BACnetEngineeringUnits const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const*, unsigned int, std::hash<BACnetEngineeringUnits> const&, std::__detail::_Mod_range_hashing const&, std::__detail::_Default_ranged_hash const&, std::equal_to<BACnetEngineeringUnits> const&, std::__detail::_Select1st const&, std::allocator<std::pair<BACnetEngineeringUnits const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&) ()
#2  0x006c1410 in _GLOBAL__sub_I_BACnetProfiles.cpp ()
#3  0x04078a66 in __libc_csu_init ()
#4  0xb6dd6560 in __libc_start_main (main=0x19d6a3c <main>, argc=1, argv=0xbefff524, init=0x4078a39 <__libc_csu_init>, fini=0x4078a79 <__libc_csu_fini>, rtld_fini=0xb6fe0f31 <_dl_fini>, stack_end=0xbefff524) at libc-start.c:264
#5  0x006f61ac in _start ()

Hier frage ich mich, warum überhaupt BACnet initialisiert wird, obwohl ich es gar nicht lizenziert habe. Kann man das nicht einfach deaktivieren, @paresy?

Moin,

Der pi zero hat mit 512mb ram zu wenig speicher, daher ist er raus. Ich schätze das dein OS einfach zu alt ist. Für die 7.2 ist ubuntu 24.02 bzw bookworm mindestvorraussetzung.

Viele Grüße

Ich werde mal schauen, ob wir im Pre Install Skript die Erfordernisse besser „checken“ können.

Im Prinzip wird ab der 7.2 das armv7 Instruction Set erfordert. Hintergrund: Wir haben bis zur 7.1 alles in der Cloud bauen können, außer die Raspberry Pi Versionen. Für diese hatten wir immer passende Raspberry Pi’s im Einsatz mit einem speziell aufgebauten OS und selbsterstellen Basis Docker Images, da es bei GitHub keine ARM Runner gab.

Diese sind aber Mittlerweile verfügbar (Accelerate your CI/CD with Arm-based hosted runners in GitHub Actions - GitHub Changelog) mit wesentlich besser bei der Performance, sodass ein vollständiges IP-Symcon Build jetzt 13 Minuten braucht, anstatt 1,5 Stunden.

Leider ist das Bauen von armv6 bzw. armhf eher schwierig, weshalb wir uns Entschieden haben, gegen die Base Images arm32v7/debian und arm64v8/debian zu bauen. (Siehe hier → https://hub.docker.com/u/arm32v6/ → Dort gibt es kein arm32v6/debian auf das wir aufsetzen können)

→ Nichts gegen die schöne (es sind schon über 12 Jahre :smiley: ) alte armhf Hardware - aber leider wird das Bauen dafür extrem komplex und der Tausch von z.B. Zero 1 auf Zero 2 ist eher schnell gemacht. Trotzdem schauen wir mal, ob unser preinst Skript da eine Fehlermeldung werfen kann, bevor das Chaos passiert.

paresy

2 „Gefällt mir“

Daran kann es nicht liegen, da der Zero 2 auch nur 512 MB hat und laut Versionsübersicht nur die 1er nicht mehr unterstützt werden. Scheint also am ARM instruction set v6 zu liegen, wie paresy geschrieben hat. Komisch ist nur, dass bei Docker immer noch ARMv6 unterstützt wird. Oder ist das ein Fehler in der Versionsübersicht?

Ich weiß nicht, ob das eine harte Mindestvoraussetzung ist. Falls ja, gilt sie zumindest für 7.1 nicht, da dort in der Versionsübersicht Ubuntu 22.04 steht, es bei mir jedoch mit Ubuntu 20.04 auch läuft.

Ich glaube, dass das Initialisieren nur von lizenzierten/benutzten Modulen eine Lösung sein könnte. Dies würde vermutlich sogar die (Neu-)Startzeit von IPS beschleunigen. Dann kann man nur die benötigten Module lazy und ggf. sogar multithreaded nachladen.

Natürlich ist das kein Garant dafür, dass bestimmte ARMv7+ instructions nicht doch irgendwo vom IPS core genutzt werden. Aber so wird zumindest die Abhängigkeit von externen Libraries etwas reduziert.

PS: Ist der IPS Core immer noch compiled PHP?

Ich werde mal den Odroid C2 mit Armbian installieren und damit testen. Er ist ja bis auf den HDMI-Anschluss kompatibel mit dem C1 und passt somit auch in das gleiche Hutschienengehäuse.

Hatte auch überlegt, gleich auf die Symbox Pro zu gehen. Das hebe ich mir jedoch noch bisl auf.

Danke für die Infos!

Noch nie gewesen :slight_smile: Alles in C++.

BACnet ist da quasi nur einer der ersten (mit B) die geladen werden. Ich denke es betrifft ganz viele.

Das ist eher für einen einfacheren Support gedacht. Theoretisch geht es bis Bullseye runter.

Das ist ab sofort korrigiert.

paresy