히비스서커스의 블로그

[CentOS 7] curl: error while loading shared libraries: libssl.so.1.0.0: cannot open shared object file: No such file or directory 본문

Programming/Linux

[CentOS 7] curl: error while loading shared libraries: libssl.so.1.0.0: cannot open shared object file: No such file or directory

HibisCircus 2021. 7. 11. 17:13
728x90

나의 첫 깃헙 issue

 

상황

 

CentOS 7버전의 리눅스 서버에서 docker설치 후 NVIDIA docker를 설치하기 위한 가장 첫번째 단추로 NVIDIA Container Toolkit을 설치하는 부분이 있다. 이 부분의 코드는 다음과 같다.

 

$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
     && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo | sudo tee /etc/yum.repos.d/nvidia-docker.repo

 

자세한 내용은 모르겠으나 GPG key와 안정적인 레퍼지토리를 설치하는 코드인 듯 하다. 그런데 다음과 같은 에러를 마주쳤다.

 

curl: error while loading shared libraries: libssl.so.1.0.0: cannot open shared object file: No such file or directory

 

구글링을 암만해봐도 나처럼 NVIDIA docker를 설치하다가 에러를 마주친 사람이 없었다. libssl.os.1.1.0이 라이브러리인 것 같은데 다운은 안 받아지고 openssl에 포함된 것인줄 알고 최신버전을 받았는데도 해결되지 않았다. 하루종일 해결을 하기 위해 찾아다니다가 용기를 내어 NVIDIA docker github에 issue를 올렸다.

 

https://github.com/NVIDIA/nvidia-docker/issues/1522

 

[CentOS 7] libssl.so.1.0.0: cannot open shared object file · Issue #1522 · NVIDIA/nvidia-docker

To install NVIDIA-Docker for CentOS 7, I follow the description https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html When I setup the stable repository and the GPG k...

github.com

 

아주 빠르게 젠틀한 답을 받았다. '서버에 curl이 설치되어 있지 않은 것 같다. 자세한 내용은 아래의 stackoverflow를 읽어보면 도움이 될 것이다.'

 

https://stackoverflow.com/questions/56440506/curl-is-not-installing-with-ssl-support-in-centos-at-user-defined-perfix/56440905

 

Curl is not installing with ssl support in Centos (at user defined --perfix)

There is already a curl & openssl version installed in my system (Centos). I am trying to install curl with ssl support. what I've done: I have installed openssl from git (master) and installe...

stackoverflow.com

 

그렇다. curl이 제대로 설치되어 있지 않았고 이는 openssl과 연동(?) 비슷하게 되어 있어야 하였다. 정말 많은 블로그들참조하여 해결하였는데 그 과정을 자세하게 적어보겠다. 이를 해결하기 위해 2일 정도 소요가 된 것 같은데 나와 같은 에러를 마주친 분들은 이 글을 보고 시간을 더 단축시키길 바란다. 

 

 

 

원인분석

먼저 openssl과 curl에 대해서 정말 간단하게만 알아보자. 

 

openssl: C 언어로 작성된 라이브러리로 기본적인 암호화 기능 및 여러 유틸리티 함수들이 구성되어 있다. 네트워크를 통한 데이터 통신에 쓰이는 TLS와 SSL의 오픈 소스 구현판이다. (출처: 위키백과)

 

curl: 다양한 통신 프로토콜을 이용하여 데이터를 전송하기 위한 라이브러리와 명령 줄 도구를 제공하는 컴퓨터 소프트웨어 프로젝트이다. "client URL"을 대표하며 libcurl과 cURL이라는 2개의 제품을 만든다. (출처: 위키백과)

 

내가 이해한 것은 이 둘이 데이터 통신에 쓰이며 openssl -> curl 순으로 설치가 되어야 잘 작동할 수 있다는 것이다.

 

 

해결과정

이미 서버에 openssl과 curl이 설치되어 있는데 버전이 안맞을 수 있다. 안전하게 다른 곳에 설치하여 진행해보자.

 

1. 디렉토리 구조

 

(/ - root 디렉토리)

├─ bin 

(이하 생략)

└─ test (임의로 만든 디렉토리)

 

이와 같은 구조라고 가정하고 진행해보겠다. 이때 우리가 볼 것은 bin 디렉토리랑 test 디렉토리이다.

bin 디렉토리에는 일반적으로 시스템에서 가장 필수적인 실행파일들을 모아두고 있는 디렉토리다.

test 디렉토리는 이번 해결을 위해 만든 디렉토리로 이곳에서 openssl과, curl을 다운받을 예정이다.

 

2. openssl과 curl 다운

 

openssl은 이곳에서 맞는 버전을 찾고

https://www.openssl.org/source/

 

/source/index.html

The master sources are maintained in our git repository, which is accessible over the network and cloned on GitHub, at https://github.com/openssl/openssl. Bugs and pull patches (issues and pull requests) should be filed on the GitHub repo. Please familiari

www.openssl.org

 

curl은 이곳에서 맞는 버전을 찾는다.

https://curl.se/download/

 

curl downloads

curl download archive

curl.se

 

찾았다면 test 파일로 이동하여 원하는 버전을 wget 명령어를 통해 다운한다.

$ cd /test
$ wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz
$ wget https://curl.se/download/curl-7.77.0.tar.gz

 

두 tar.gz 파일들의 압축을 풀어준다.

$ tar zxvf openssl-1.1.1k.tar.gz
$ tar zxvf curl-7.77.0.tar.gz

 

 

3. ./configure, make, sudo make install

 

--prefix에 들어갈 경로로 쓰일 new_openssl_curl 이라는 디렉토리를 /bin에 만들어주자.

$ mkdir /bin/new_openssl_curl

 

 이제 디렉토리 경로가 아래와 같이 바뀌었을 것이다.

 

(/ - root 디렉터리)

├─ bin 

      └─ new_openssl_curl (dir)

(중략)

└─ test 

      ├─ openssl-1.1.1k.tar.gz

      ├─ openssl-1.1.1k (dir)

      ├─ curl-7.77.0.tar.gz

      └─ curl-7.77.0 (dir)

 

 

먼저 openssl-1.1.1k 디렉토리로 이동하여 ./configure, make, sudo make install 명령어를 해줄 것이다. 여기서 ./configure는 설치한 파일을 인스톨하는 명령어이고 --prefix는 이때의 경로를 지정해주는 명령어이다.

$ cd /test/openssl-1.1.1k
$ ./configure --prefix=/bin/new_openssl_curl 
$ make
$ sudo make install

 

설치된 openssl의 버전을 확인하기 위해 /bin/new_openssl_curl/lib/openssl로 이동해보자. (설치를 해주었기 때문에 lib라는 디렉토리가 생겼다.) 여기서 버전이 맞지 않는다거나 에러가 뜬다면 기존의 라이브러리 path에서 openssl을 찾으려고 하려는 것일 수 있다. 이를 위해 export LD_LIBRARY_PATH라는 걸 처리해준다. 

$ cd /bin/new_openssl_curl/lib/openssl
$ openssl version

## libssl관련 에러나 버전이 안 맞는 경우 경로를 바꿔줄 것
$ export LD_LIBRARY_PATH=/bin/new_openssl_curl/bin

 

목록들을 확인하면 libssl.so.1.1.1로 되어 있기 때문에 이를 libssl.so.1.0.0을 참조하도록 심볼릭 링크를 지정해주자.

$ ls -atlr

## (생략)
-rwxr-xr-x 1 root root 518420 2018-05-15 15:31 libssl.so.1.1.0
## (생략)

$ sudo ln -s libssl.so.1.1.0 libssl.so.1.0.0

 

 

다음으로 curl-7.77.0 디렉토리로 이동하여 ./configure, make, sudo make install 명령어를 해준다. openssl과 같이 --prefix가 사용되지만 --with-ssl이라는 것이 추가적으로 들어간다. 이는 자세한 것은 모르겠으나 openssl의 경로랑 이어가기 위한 옵션인 것 같다.

$ cd /test/curl-7.77.0
$ ./configure --prefix=/bin/new_openssl_curl --with-ssl 
$ make
$ sudo make install

 

이렇게 하면 전반적인 curl에 관한 설치가 완료된 것이다. 완료된 것의 대략적인 경로는 아래와 같다.

 

(/ - root 디렉터리)

├─ bin

      └─ new_openssl_curl 

            └─ lib

                  ├─ c_rehash

                  ├─ curl 

                  ├─ curl-config

                  └─ openssl

(중략)

└─ test 

      ├─ openssl-1.1.1k.tar.gz

      ├─ openssl-1.1.1k (dir)

      ├─ curl-7.77.0.tar.gz

      └─ curl-7.77.0 (dir)

 

 

 

다시 맨 처음 NVIDIA-docker에서 curl이 나오는 코드로 이동해보자. 여기서 그대로 curl를 사용하지말고 /bin/new_openssl_curl/lib로 이동한 후 ./curl를 변경하여 해보자.

$ cd /bin/new_openssl_curl/lib
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
   && ./curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo | sudo tee /etc/yum.repos.d/nvidia-docker.repo

 

 

나의 상황과 동일한 상황이었다면 에러 메시지가 아닌 [nvidia-container]관련 메시지가 나올 것이다. 혹시 비슷한 상황이더라도 이번 포스팅이 도움이 되길 바란다. 적어도 나보다 적게 고생하길..!

 

 

 

 

-히비스서커스-

 

 

 

 

728x90