OpenVZ를 대체 할 때의 문제는 많은 라이브러리 서로에 의존하다 (오래된 "DLL 지옥"문제). 일부 라이브러리는 OpenVZ에 의존하며 OpenVZ는 다른 라이브러리에 의존합니다.
몇 년이 걸릴지에 따라 오래된 라이브러리를 "응집력있는 하위 집합"으로 가져 와서 컨테이너를 사용하지 말고 LD_LIBRARY_PATH
환경 변수는 이전 libs에서 동적 로더를 가리 킵니다.
이것은 일반적으로 호스트 시스템 (/ lib 또는 / usr / lib)의 libstdc ++ 및 libc 버전이 ABI 호환 이전 버전의 OpenCV (및 종속성)를 컴파일하고 링크하는 데 사용 된 버전이 포함되어 있습니다. 불행히도 Linux 커널 ABI와는 달리 libc ABI가 가끔 바뀌며 libstdc ++ ABI가 비교적 자주 변경됩니다.
따라서 필요한 버전으로 OpenCV의 오래된 바이너리를 얻으려면 대략이 프로세스가 필요합니다.
- 시험 다만 LD_LIBRARY_PATH 디렉토리에있는 오래된 OpenCV 라이브러리. 작동하지 않으면, 누락 된 라이브러리에 대한 오류가 발생합니다 (종속성이 올바르게 버전을 지정한다고 가정). 누락 된 라이브러리를 가져 와서 오래된 OpenCV와 같은 디렉토리에 넣으십시오. 누락 된 라이브러리 오류가 사라질 때까지 반복하십시오.
- libstdc ++ 또는 libc에서 심볼 탐색 오류가 발생하거나 불량 glibc 버전에 대한 불만이 생기면 외륜없이 크릭이되고 가상화 및 이전 OS 버전 설치 이외의 유일한 솔루션은 다음과 같습니다. ...
플랫 팩
http://flatpak.org/ - 모든 의존 라이브러리를 포함하는 응용 프로그램 패키징 형식
과
컨테이너
컨테이너는 좋은 방법입니다. 좋은 LXC 및 LXD와 같은 컨테이너 솔루션은 게스트를 완전히 분리하고 게스트가 자체적으로 PID 1
(init 데몬). 기본적으로 리눅스에서 프로세스를 시작하려면, 동적 로더 (libdl)가 공유 라이브러리를로드 할 수 있어야하기 때문에, 이미 실행중인 작업과 시작중인 작업간에 호환이 이루어져야합니다. 그러나 컨테이너에는 완전히 분리 할 수있는 방법이 있으므로 동일한 호스트 커널에서 호환되지 않는 버전의 libc, libdl 및 libstdc ++를 사용할 수 있습니다.
이전 데비안 또는 CentOS / RHEL 호스트 시스템을 실행하는 경우 Ubuntu & gt; = 16.04 또는 OpenVZ를 실행하면 LXD를 권하고 싶습니다. 불행히도 LXD는 우분투가 아닌 다른 배포판에도 설치하기가 쉽지 않으며 OpenVZ는 최신 배포판을 지원하지 않습니다.
리눅스 커널에 대한 좋은 점은 (직접 렌더링 관리자와 같은) 드라이버 특정 인터페이스를 제외하고 리눅스 커널 ABI는 안정된 오랫동안. 그 의미는:
- 오래된 "userspaces"(그 안에있는 것과는 반대로 커널에서 실행되는 모든 것)는 상당히 새로운 커널에서 작동해야합니다.
- 새로운 사용자 공간은 꽤 오래된 구 커널에서 작동해야합니다.
실제로 이것이 의미하는 바는 컨테이너에 3D 그래픽 드라이버 또는 다른 종류의 특수 하드웨어를 사용하지 않는 한 컨테이너 시스템과 호스트 커널 간의 연령 차이에 관계없이 "그냥 작동"해야한다는 것입니다 (특정 2.6.9보다 오래된 Linux 커널 용으로 컴파일 된 소프트웨어는 일반적으로 최신 커널에서는 작동하지 않으며 2.6.0보다 오래되면 확실히 작동하지 않습니다.
예전 라이브러리를 사용하려면 오래된 라이브러리에 의존하는 오래된 라이브러리 (또는 오래된 라이브러리에 의존하는 바이너리)를 실행하려면 최소한의 노력이 필요합니다.
- 최소 : 라이브러리의 이전 버전을 디렉토리에 놓고 LD_LIBRARY_PATH를 설정하면 완료됩니다.
- Typical (많은 독점적 인 게임과 프로그램에서 사용됨) : 라이브러리의 이전 버전과 모든 의존성을 삭제하십시오. 를 제외하고 libc, LD_LIBRARY_PATH를 설정하면 끝난다.
- 광범위한 라이브러리 교체 (버그가 있거나 작동하지 않을 수도 있음) : 라이브러리의 이전 버전 libstdc ++, libc, libdl 및 모든 종속성을 디렉토리에 놓고 LD_LIBRARY_PATH를 설정하면 완료됩니다.
- 컨테이너 : 가상화를 실행하지 않고 호스트 커널 위에 다른 구형 OS에 대한 완전한 기본 시스템을 설치하십시오 (여전히 Linux 커널 복사본 하나만 실행하고 있음). 빠른 ,하지만 몇 기가 바이트 디스크 공간을 차지합니다. 매우 당신이 그것에 던질 수있는 무엇이든과 호환됩니다 (고대의 배포판 포함).
- 가상 머신 : 게스트 OS 소프트웨어가 하드웨어가 실행되는 것과 동일한 CPU에서 실행되는 한 비 Linux OS에서도 가능하며 호환성은 문제가되지 않습니다.