Das Problem, nur OpenVZ zu ersetzen, besteht darin, dass viele Bibliotheken voneinander abhängig sind (das alte "DLL Hell" -Problem). Einige Bibliotheken hängen von OpenVZ ab, und OpenVZ hängt von anderen Bibliotheken ab, die von noch mehr Bibliotheken usw. abhängen.
Je nachdem, wie alt Sie sein müssen, können Sie die Verwendung von Containern vermeiden, indem Sie eine "zusammenhängende Teilmenge" alter Bibliotheken in ein Verzeichnis einfügen und die LD_LIBRARY_PATH
Umgebungsvariable verwenden, um den dynamischen Loader auf Ihre alten Bibliotheken zu richten.
Dies funktioniert normalerweise gut, wenn die Version von libstdc ++ und libc auf Ihrem Hostsystem (in / lib oder / usr / lib) ABI-kompatibel ist mit der Version, mit der Ihre alte Version von OpenCV (und deren Abhängigkeiten) kompiliert und verknüpft wurde. Im Gegensatz zum Linux-Kernel-ABI ändert sich das libc-ABI leider gelegentlich und das libstdc ++ - ABI ändert sich relativ häufig.
Wenn Sie sich also eine alte Binärdatei von OpenCV mit der Version holen, die Sie benötigen, würde dies ungefähr so aussehen:
- Versuchen Sie nur die alte OpenCV-Bibliothek im Verzeichnis LD_LIBRARY_PATH. Wenn dies nicht funktioniert, erhalten Sie eine Fehlermeldung über fehlende Bibliotheken (vorausgesetzt, die Abhängigkeiten führen zu einer korrekten Versionierung). Greifen Sie zu den fehlenden Bibliotheken und legen Sie sie in demselben Verzeichnis ab wie das alte OpenCV. Wiederholen Sie den Vorgang, bis fehlende Bibliotheksfehler verschwinden.
- Wenn Sie an einem Punkt angelangt sind, an dem Sie in libstdc ++ oder libc auf Symbol-Lookup-Fehler stoßen, oder wenn Sie sich über schlechte Glibc-Version beschweren, befinden Sie sich in einem Bach ohne Paddel ...
Flatpak
http://flatpak.org/ - ein Paket für Anwendungspakete, das alle Abhängigkeits-Bibliotheken enthält :)
und
Behälter
Container ist ein guter Ansatz, da gute Containerlösungen wie LXC und LXD den Gast vollständig isolieren und sogar den Gast selbst betreiben PID 1
(init-Daemon). Um einen Prozess unter Linux zu starten, müssen im Wesentlichen bestimmte Dinge zwischen dem, was Sie bereits ausführen, und dem, was Sie starten, kompatibel sein, da beispielsweise der dynamische Lader (libdl) die gemeinsam genutzten Bibliotheken laden muss. Container können jedoch vollständig isoliert werden, sodass Sie inkompatible Versionen von libc, libdl und libstdc ++ auf demselben Host-Kernel verwenden können.
Ich würde LXD empfehlen, wenn Sie Ubuntu> = 16.04 ausführen, oder OpenVZ, wenn Sie ein altes Debian- oder CentOS / RHEL-Hostsystem ausführen. Leider ist die Einrichtung von LXD in nicht-Ubuntu-Distributionen nicht so einfach, und OpenVZ unterstützt (noch) nicht die neuesten Distributionen.
Das Schöne am Linux-Kernel ist, dass der Linux-Kernel-ABI mit wenigen Ausnahmen für treiberspezifische Schnittstellen (wie der Direct Rendering Manager) für lange Zeit stabil ist . Das bedeutet:
- Alte "Userspaces" (alles, was auf dem Kernel im Gegensatz zum Kernel läuft) sollten auf viel neueren Kerneln funktionieren.
- Neue Userspaces sollten auf vielen älteren Kerneln funktionieren.
In der Praxis bedeutet dies, dass, wenn Sie nicht 3D-Grafiktreiber oder andere Arten von spezialisierter Hardware in Ihrem Container verwenden, "Just Work" unabhängig vom Altersunterschied zwischen dem Containersystem und dem Host-Kernel (bis zu einem gewissen Grad) erfolgen sollte limit; Software, die für einen Linux-Kernel älter als 2.6.9 kompiliert wurde, funktioniert normalerweise nicht auf einem modernen Kernel, und älter als 2.6.0 wird definitiv nicht funktionieren.)
Dies führt zu einer Abstufung von "minimalem Aufwand", um ältere Bibliotheken (oder Binärdateien, die von älteren Bibliotheken abhängig sind) auszuführen, je nachdem, wie alt und wie alt die Altertümer sind:
- Minimal: Füge die alte Version der Bibliothek in ein Verzeichnis ein, setze LD_LIBRARY_PATH und fertig.
- Typisch (dies wird bei vielen proprietären Spielen und Programmen verwendet): Wenn Sie die alte Version der Bibliothek und alle ihre Abhängigkeiten außer libc ablegen, legen Sie LD_LIBRARY_PATH fest, und Sie sind fertig.
- Umfassender Bibliotheksersatz (fehlerhaft; funktioniert möglicherweise nicht): Wenn Sie die alte Version der Bibliothek libstdc ++, libc, libdl und alle zugehörigen Abhängigkeiten in einem Verzeichnis ablegen, legen Sie LD_LIBRARY_PATH fest und fertig.
- Container: Installieren Sie ein komplettes Basissystem für ein anderes, älteres Betriebssystem über Ihrem Host-Kernel, ohne eine Virtualisierung auszuführen (Sie führen immer noch nur eine Kopie des Linux-Kernels aus). Schnell, benötigt aber mehrere Festplattenspeicher. Extrem kompatibel mit so ziemlich allem, was Sie darauf werfen können (einschließlich der alten Distros).
- Virtuelle Maschinen: Sie können alles ausführen, auch Nicht-Linux-Betriebssysteme, und Kompatibilität ist kein Problem, solange die Gastbetriebssystemsoftware auf derselben CPU läuft wie Ihre Hardware.