Problem z zastąpieniem OpenVZ polega na tym, że wiele bibliotek zależą od siebie (stary problem „DLL Hell”). Niektóre biblioteki zależą od OpenVZ, a OpenVZ zależy od innych bibliotek, które zależą od jeszcze większej liczby bibliotek itp.
W zależności od tego, ile masz lat, możesz uniknąć używania kontenerów, wprowadzając do katalogu „spójny podzbiór” starych bibliotek, a następnie użyć LD_LIBRARY_PATH
zmienna środowiskowa, aby wskazać program ładujący dynamicznie na stare biblioteki.
Zwykle działa to dobrze, jeśli wersja libstdc ++ i libc w systemie hosta (w / lib lub / usr / lib) jest Kompatybilny z ABI z wersją, która została użyta do skompilowania i połączenia twojej starej wersji OpenCV (i jej zależności). Niestety, w przeciwieństwie do ABI w jądrze Linuksa, libi ABI zmienia się czasami, a libstdc ++ ABI zmienia się stosunkowo często.
Tak więc, złapanie starego pliku binarnego OpenCV z wersją, której potrzebujesz, byłoby mniej więcej z tym procesem:
- Próbować właśnie stara biblioteka OpenCV w katalogu LD_LIBRARY_PATH. Jeśli to nie zadziała, dostaniesz błędy o brakujących bibliotekach (zakładając, że zależności wykonują poprawne wersjonowanie); chwyć te brakujące biblioteki i umieść je w tym samym katalogu co stary OpenCV. Powtarzaj, aż znikną błędy biblioteki.
- Jeśli dojdziesz do punktu, w którym dostaniesz błędy wyszukiwania symboli w libstdc ++ lub libc, lub skargi dotyczące złej wersji glibc, jesteś w potoku bez wiosła, a jedynymi rozwiązaniami (innymi niż wirtualizacja i instalacja starej wersji systemu operacyjnego) są ...
Flatpak
http://flatpak.org/ - format pakowania aplikacji zawierający wszystkie biblioteki zależności :)
i
Kontenery
Kontenery to dobre podejście, ponieważ dobry rozwiązania pojemnikowe, takie jak LXC i LXD, całkowicie izolują gościa, a nawet pozwalają gościowi działać samodzielnie PID 1
(demon inicjujący). Zasadniczo, aby rozpocząć dowolny proces na Linuksie, pewne rzeczy muszą być zgodne między tym, co już uruchomiłeś, a tym, co uruchamiasz, ponieważ na przykład dynamiczny program ładujący (libdl) musi być w stanie załadować biblioteki współdzielone. Ale kontenery mają sposób na całkowitą izolację, więc możesz używać niekompatybilnych wersji libc, libdl i libstdc ++ na tym samym jądrze hosta.
Polecam LXD, jeśli używasz Ubuntu> = 16.04, lub OpenVZ, jeśli używasz starego systemu hosta Debian lub CentOS / RHEL. Niestety LXD nie jest zbyt łatwy do skonfigurowania na dystrybucjach innych niż Ubuntu, a OpenVZ nie obsługuje (jeszcze) najnowszych dystrybucji.
Dobrą rzeczą w jądrze Linuksa jest to, że z kilkoma wyjątkami dla interfejsów specyficznych dla sterownika (takich jak Direct Rendering Manager), jądro Linux ABI jest stabilny przez długi czas. To znaczy:
- Stare „przestrzenie użytkownika” (wszystko, co działa na wierzchu jądra, a nie wewnątrz niego) powinno działać na znacznie nowszych jądrach.
- Nowe obszary użytkownika powinny działać na dużo starszych jądrach.
W praktyce oznacza to, że jeśli nie używasz sterowników grafiki 3d lub innego rodzaju specjalistycznego sprzętu w kontenerze, powinien on „Po prostu działać” niezależnie od różnicy wieku między systemem kontenerowym a jądrem hosta (do pewnego limit; oprogramowanie skompilowane dla jądra Linux starszego niż 2.6.9 na ogół nie będzie działać na nowoczesnym jądrze, a starsze niż 2.6.0 na pewno nie będzie działać.)
Pozostawia to gradację „minimalnego wysiłku wymaganego” do uruchomienia starszych bibliotek (lub plików binarnych zależnych od starszych bibliotek), w zależności od tego, ile lat i jak głęboko sięga starość:
- Minimal: Upuść starą wersję biblioteki do katalogu, ustaw LD_LIBRARY_PATH i gotowe.
- Typowe (jest to używane z wieloma zastrzeżonymi grami i programami): upuść starą wersję biblioteki i wszystkie jej zależności z wyjątkiem libc, ustaw LD_LIBRARY_PATH i gotowe.
- Rozbudowana biblioteka (buggy; może nie działać): upuść starą wersję biblioteki, libstdc ++, libc, libdl i wszystkie jej zależności do katalogu, ustaw LD_LIBRARY_PATH i gotowe.
- Kontenery: Zainstaluj kompletny system bazowy dla innego, starszego systemu operacyjnego na wierzchu jądra hosta bez uruchamiania wirtualizacji (nadal działa tylko jedna kopia jądra Linux). Szybki , ale zajmuje kilka koncertów na dysku. Niezwykle kompatybilny z niemal wszystkim, co możesz na niego rzucić (w tym starożytne dystrybucje).
- Maszyny wirtualne: mogą uruchamiać wszystko, nawet systemy operacyjne inne niż Linux, a kompatybilność nie stanowi problemu, o ile oprogramowanie systemu gościa działa na tym samym procesorze, co sprzęt.