본문 바로가기
ОКБ (실험 설계국)/Trouble Shooting

6. [CentOS7] vsftpd 소스파일 설치 에러 해결 방법

by Rosmary 2019. 8. 23.
728x90
반응형

< 발생 오류 1>

===================================================

/usr/bin/ld: cannot find -lcap
collect2: error: ld returned 1 exit status

make: *** [vsftpd] 오류 1

===================================================

<발생 오류 2>

===================================================

/lib/libcap.so.2: error adding symbols: File in wrong format
collect2: error: ld returned 1 exit status
make: *** [vsftpd] 오류 1

===================================================

 

 

필자가 안드로이드 리눅스에 vsftpd 소스파일을 설치하면서 일어난 문제 중에 일주일 가까이 해결을 하지 못한 문제가 하나 있다. 이 문제 해결을 위해, 노트북에 VMware와 리눅스를 설치하고, vsftpd를 똑같이 소스 컴파일하여 설치를 진행한 뒤, 차이점을 비교하고 문제를 찾아보고자 했다.

 

컴퓨터에 설치한 리눅스는 안드로이드와 마찬가지로, CentOS7이다. 설치 후에는, vsftpd.beasts.org 홈페이지에서, gzip으로 압축된 vsftpd 파일(3.0.3버전)을 다운받아, 압축 해제를 진행했다. 압축이 풀린 폴더에 들어가니, configure 없이 바로 설치를 진행할 수 있는 형태라, 바로 make;make install 명령어를 입력했다. 그런데...

 

 

 

1. /usr/bin/ld: cannot find -lcap  (libcap을 찾을 수 없습니다)

 

*  -lxxxxx 형태로 에러가 발생하며 xxxxx로 표시한 부분은 라이브러리 파일명이다.

 

 

지금까지 소스 컴파일을 진행하면서 한번도 보지 못했던 오류가 발생한다.(이건 뭐... 문제 하나 해결하기 위해, 나름의 해결 방법을 찾아보려고 애쓰는 과정에 또 문제를 덤으로 얻었다...) 빡침을 뒤로하고, 오류를 읽어보니, lcap이라는 놈을 찾을 수 없단다. 이게 도대체 뭘까??

 

다행히 구글링을 해보니, 완전히 똑같지는 않아도 비슷한 에러로 질문을 올린 사람들이 많다. 그 글들을 읽고 내린 판단은 다음과 같다.

 

============================================================================

1. 프로그램을 조금 더 쉽게, 그리고 가볍게 만들기 위해, 라이브러리(lib)라는 놈을 사용한다.

2. 이 라이브러리는 다양한 종류가 존재하며, OS에 공통적으로 설치되어 있는 것도 있고, 아닌 것도 있다.

3. window에서 설치하는 대부분의 프로그램은, window 내에 내장된 라이브러리가 아니라면, 설치 파일에 꼽사리 끼워준다.

============================================================================

 

리눅스의 서비스 프로그램은, 패치 업그레이드 과정에서, 사소한 오류가 상당히 많이 발생하는 듯 한데,(특히 CentOS 6에서 CentOS7으로 넘어가는 과정에서 이런 사소한 오류들이 정말 많은 것 같다). 업그레이드 된 프로그램이 기존에 사용했던 라이브러리 대신, 다른 라이브러리를 사용하게 되는 경우에 이런 오류가 나타나는 듯 했다.

 

필자도 이 가설에 중점을 두고, 문제를 풀어본다. 우선 lcap, libcap이라는 녀석과 관련된 패키지에 무엇이 있는지 yum 명령어로 찾아본다.

 

정확히 libcap이라는 이름만을 가진 패키지를 보니, x86_64이라는 이름으로 끝나는 패키지 하나, 그리고 i686이라는 이름으로 끝나는 패키지가 보인다. 아마도 이 패키지가 필자의 리눅스에 설치되어 있지 않아, make 과정에서 오류가 일어났던 게 아닌가 싶다. 그래서 rpm 명령어로, 필자의 CentOS7에 libcap 패키지의 설치 유무를 확인한다.

 

 

버전이 2.22인 libcap 패키지가 설치되어 있음을 확인했다. 그렇다면, vsftpd make 과정에서, 이 libcap을 전혀 인식하고 있지 못하기 때문에 오류가 일어났다고 생각할 수 있다. yum list 명령어로, 설치 가능한 다른 libcap 패키지에 대해 찾아본다. 

 

 

버전은 동일하지만, 패키지 확장자명이 다른 libcap 패키지가 설치 가능하다고 나온다. 해당 패키지를 설치하고, 

 

다시 소스파일이 위치한 폴더에서 make 명령어로 vsftpd의 binary 파일을 생성해 본다.

 

다행히, 같은 오류가 발생하지 않는 것을 보니, 아까의 오류는 해결된 듯 하다. 그러나... 다른 오류가 생겼다.

 

 

 

2. /lib/libcap.so.2.... File in wrong format (파일 포맷이 잘못되었습니다)

 

이제 막 리눅스 튜토리얼을 벗어났는데, 레벨 99짜리 지옥 던전에 던져진 듯 한 기분이다. 날씨가 선선해지니, 이제 필자가 미쳐도 상관없다고 생각하는 컴퓨터의 농락인지는 모르겠다만... 다시 오류를 살펴본다.

 

이번에는 /lib/libcap.so.2의 문제였다. 소켓과 관련된 문제라면 이는 다운로드 받은 설치 파일의 내용을 뜯어봐야 알 수 있는 것이었다. 다행히도, 지난 2주 동안 필자가 소켓 때문에 고생을 하다가 여기까지 흘러들어온 터라, 소켓 관련된 파일은 쉽게 찾을 수 있었다. 

 

vsftpd 소스파일 폴더에는 vsf_findlibs.sh라는 폴더가 있다. 이름에서도 알 수 있듯이, vsf(tpd)에서 라이브러리를 찾아주는(findlib) 스크립트 코드다. grep 명령어를 이용해, 스크립트 내에 libcap과 관련된 코드가 무엇이 있는지 확인해보았다.

 

다행히 조건문 하나만 나온다. 조건문을 읽어보니, "/lib/libcap.so.1이 존재한다면, 혹은 /lib/libcap.so.2가 존재한다면, 혹은 둘 다 아니라면"이라는 가정 아래, 간략한 코드가 작성되어 있다. 첫 오류에서, /lib 폴더 내에 libcap.so.1이나, libcap.so.2 파일이 존재하지 않아(libacp.so.2는 필자가 다운로드 받은 vsftpd 소스파일에서 인식을 못하는 듯 하다), 저런 경고가 나온 듯 하다. 

 

이 코드를 보고 나니, 굳이 libcap.so 파일을 찾느라 고생할 필요 없이, libcap.so.1 파일의 존재 여부에 대해서만 찾아보면 될 듯 했다. 조건의 폴더를 살펴본다.

 

 

역시나, /lib/libcap.so.1 파일이 존재하지 않는다. 조금 더 정확하게 말하자면, 이 /lib 폴더는 /usr/lib으로 심볼릭 링크가 연결되어 있는데, 이 파일 내에 libcap.so.1이 존재하지 않는다는 것이다. /lib 과 비슷한 역할을 하는 /lib64 폴더(/usr/lib64폴더로 심볼릭 링크 연결되어 있다)에, libcap.so.1 파일이 존재하는지 알아보았다.

 

/lib64 폴더에는 모두 존재한다. 그렇다면 해결 방법은 두 가지다. vsf_findlibs.sh 파일에서 조건의 /lib 을 /lib64로 변경하거나, /lib64/libcap.so1.10을 /lib폴더 안에 libcap.so.1이라는 이름으로 심볼릭 링크를 만들거나. 필자는 후자를 택했다.

 

 

다시 vsftpd 소스 파일 폴더로 돌아가, 설치를 진행해본다.

 

 

(make clean 명령어를 쓰지 않아서인지) 맨 처음 진행했던 것과 달리, 설치가 매우 빠르게 끝났다. 이제 vsftpd에 필요한 샘플 파일을 적절한 위치로 복사하고, 서비스를 구동한 뒤, ftp를 루프백으로 실행해본다.

 

성공이다!!!

 

 

FIN.

반응형

댓글