Проблема просто заміни OpenVZ полягає в тому, що багато бібліотек залежать одна від одної (стара проблема "DLL Hell"). Деякі бібліотеки залежать від OpenVZ, а OpenVZ залежить від інших бібліотек, які залежать від ще більшої кількості бібліотек тощо.
Залежно від того, скільки років вам потрібно пройти, ви можете уникати використання контейнерів, вводячи в каталог "згуртовану підмножину" старих бібліотек, а потім використовувати LD_LIBRARY_PATH
змінну середовища для наведення динамічного завантажувача на ваші старі лібри.
Зазвичай це добре працює, якщо версія libstdc ++ та libc у вашій хост-системі (in / lib або / usr / lib) сумісна з ABI версією, яка використовувалася для компіляції та посилання вашої старої версії OpenCV (та її залежностей). На жаль, на відміну від ядра Linux ABI, libc ABI змінюється періодично, а libstdc ++ ABI змінюється порівняно часто.
Таким чином, захоплення старого бінарного файлу OpenCV з необхідною версією буде приблизно таким чином:
- Спробуйте лише стару бібліотеку OpenCV у каталозі LD_LIBRARY_PATH. Якщо це не працює, ви отримаєте помилки щодо відсутніх бібліотек (якщо припустимо, що залежно від версій версії); перейдіть за тими відсутніми бібліотеками і помістіть їх у той самий каталог, що і старий OpenCV. Повторюйте, доки не зникнуть помилки бібліотеки.
- Якщо ви дістаєтесь до точки, коли ви отримуєте помилки пошуку символів у libstdc ++ або libc, або скарги на погану версію glibc, ви перебуваєте в затоці без весла, і вашими єдиними рішеннями (крім віртуалізації та встановлення старої версії ОС) є ...
Flatpak
http://flatpak.org/ - формат упаковки додатків, що включає всі лінзи залежності :)
і
Контейнери
Контейнери - це хороший підхід, тому що хороші контейнерні рішення, такі як LXC та LXD, повністю ізолюють гостя і навіть дозволяють гостю запускати своє PID 1
(init daemon). В основному, для запуску будь-якого процесу в Linux певні речі повинні бути сумісні між тим, що ви вже працюєте, і тим, що ви починаєте, тому що, наприклад, динамічний завантажувач (libdl) повинен мати можливість завантажувати спільні бібліотеки. Але контейнери мають змогу повністю їх ізолювати, тож ви можете використовувати несумісні версії libc, libdl та libstdc ++ у тому ж ядрі хоста.
Я рекомендую LXD, якщо ви запускаєте Ubuntu> = 16.04, або OpenVZ, якщо ви використовуєте стару хост-систему Debian або CentOS / RHEL. На жаль, LXD не надто простий у налаштуванні на не-Ubuntu дистрибутиви, а OpenVZ не (ще) підтримує останні дистрибутиви.
Приємне в ядрі Linux полягає в тому, що, за кількома винятками для специфічних для драйверів інтерфейсів (наприклад, менеджер прямого рендерінгу), ядро Linux ABI стабільно тривалий час. Це означає:
- Старі "простори користувачів" (усе, що працює над ядром, а не всередині нього) повинні працювати на набагато новіших ядрах.
- Нові простори користувачів повинні працювати на досить багато старих ядер.
На практиці це означає, що якщо ви не використовуєте тривимірні графічні драйвери або інше спеціалізоване обладнання у вашому контейнері, воно повинно "Просто працювати" незалежно від різниці у віці між контейнерною системою та ядром хоста (до певного ліміт; програмне забезпечення, скомпільоване для ядра Linux старше 2.6.9, як правило, не працює на сучасному ядрі, а старше 2.6.0 точно не працюватиме.)
Це залишає градацію "мінімальних зусиль, необхідних" для запуску старих бібліотек (або бінарних файлів, які залежать від старих бібліотек), залежно від того, скільки років і наскільки глибока старість:
- Мінімальний: занесіть стару версію бібліотеки до каталогу, встановіть LD_LIBRARY_PATH і все закінчиться.
- Типовий (використовується для багатьох фірмових ігор та програм): відкиньте стару версію бібліотеки та всі її залежності, за винятком libc, встановіть LD_LIBRARY_PATH і все закінчено.
- Широка заміна бібліотеки (баггі; можливо, не працює): викиньте стару версію бібліотеки, libstdc ++, libc, libdl та всі її залежності в каталог, встановіть LD_LIBRARY_PATH, і ви закінчите.
- Контейнери: Встановіть повну базову систему для іншої, старшої ОС над ядром хоста, не запускаючи віртуалізації (ви все ще використовуєте лише одну копію ядра Linux). Швидкий , але займає декілька концертів місця на диску. Надзвичайно сумісний практично з усім, що ви можете кинути на нього (включаючи стародавні дистрибутиви).
- Віртуальні машини: Можна запускати все, що завгодно, навіть не ОС Linux, і сумісність не викликає занепокоєння, якщо програмне забезпечення гостьової ОС працює на тому ж центральному процесорі, що і ваше обладнання.