본문 바로가기
IT Security/LINUX Basic

37. Linux - yum, rpm 대신 소스파일로 프로그램 설치하기

by Rosmary 2021. 5. 31.
728x90
반응형








필자가 최근 리눅스에서 Python의 최신 버전을 깔기 위해 yum과 rpm 명령어를 열심히 날렸으나, 최신 버전의 설치가 불가능한 상황에 맞닥드리게 되었다. 특이하게도 CentOS7은 yum으로 python3 설치 시 최신 버전을 3.6.x 버전으로 표시하는데, 실제 필자가 필요로하는 버전은 최신 안정화버전인 3.9버전 이상이기 때문에 yum으로 설치가 불가능한 상황이었다.

CentOS의 Python 기본 설치 버전은 2.7이다. 따라서 Python3 사용을 위해 별도의 설치 과정을 거쳐야 한다.


물론 rpm 파일이야 널리고 널려있지만, 이번만큼은 source 파일로 직접 설치하는 과정을 진행해보려 한다. 사실, Python 뿐만 아니라 SQLite라고 불리는 패키지 또한 최신 버전으로 설치를 진행해야 하는데, SQLite는 rpm 파일이 없어서 source 파일로 직접 설치해야했기도 했고, 필자 역시 source 파일 설치를 진행한지 너무 오래되어 복습하고 정리도 할 겸 말이다.

시간이 없어서 rpm이나 yum으로 설치해야하는 분들은 아래의 링크를 참조하기 바란다.

* 리눅스 패키지 yum으로 설치하기
(필자가 yum 사용법에 대해 작성한 줄 알았는데 내용이 없다. 대신 Redhat의 메뉴얼 페이지로 링크를 걸어놓는다.
* 리눅스 패키지 rpm으로 설치하기




1. 소스(source) 파일 설치 과정

리눅스 패키지를 소스 파일로 설치한다는 것은 어떤 의미인가? 우리가 사용하려는 패키지는 누군가에 의해 프로그래밍언어로 작성된 파일의 모음이다. 이 파일을 소스 파일이라고 한다. 문제는 소스 파일들이 사람이 읽기 좋은 형태로 되어 있기 때문에, 0과 1밖에 모르는 컴퓨터로써는 이 파일들이 어떤 의미를 가지는지 알지 못한다.

따라서 인간이 만든 소스 파일들을 컴퓨터가 이해할 수 있도록 변환하는 과정이 필요한데, 이를 컴파일(Compile, C나 Java를 건드려보신 분들이면 잘 아실 것이다)이라고 한다. 우리가 설치하려는 소스 파일이 컴파일이 되어야지만 비로소 컴퓨터에서 컴파일된 소스 파일을 참고하여 설치를 진행할 수 있게 된다.

컴파일 시 문제가 되는 점은, 설치하려는 운영체제(리눅스)의 환경이 사용자마다 다르다는 점이다. 예를 들어보자. 일반적으로 소스 파일이 컴파일 된 후 설치가 진행되면, 해당 패키지의 명령어는 /usr/local/bin에 설치된다. 하지만 필자의 리눅스에 /usr/local/bin 폴더가 없다면? 설치가 진행되다가 에러가 날 것이다. 따라서 컴파일을 진행하기 전, 리눅스 환경에 맞게 별도의 환경 설정을 진행해주어야 한다. 이는 뒤에서 조금 더 알아보고...

이렇게 컴파일이 진행되고 나면 컴퓨터가 설치를 진행하는 절차를 이해할 수 있는 파일이 하나 생성되는데, 이 파일을 이용하여 설치를 진행하게 된다.

대략적인 내용은 살펴보았으니, 실습을 통해 조금 더 세부적인 내용으로 들어가보자.





2. 소스 파일의 다운로드


참고!! 소스 파일 다운로드 전, 아래의 패키지가 설치되어 있는지 확인하자
** Python 의존성 패키지: openssl-devel libffi-devel bzip2-devel gcc 및 Development Tools 그룹

** 명령어: sudo yum groupinstall "Development Tools" -y
sudo yum install openssl-devel libffi-devl bzip2-devl gcc -y

Python 3.9을 리눅스에 소스 파일로 설치하기 위해 가장 먼저 해야할 것은, python 3.9 버전의 소스파일을 찾는 일이다. 다행히 이런 소스파일은 구글링을 통해 쉽게 얻을 수 있다. 소스 파일의 링크 주소만 알고 있다면, 리눅스에서도 명령어로 해당 파일을 바로 다운받을 수 있다. 아래의 명령어로 다운을 시도해보자. 필자는 gzip 파일을 다운로드 할 것이다.

** 명령어: wget {소스파일 링크 주소}

** 소스 파일 주소는 아래와 같이 링크 주소를 복사하여 사용하면 된다.





리눅스에서 이런 소스 파일은 보통 /usr/src/아래에 저장해놓는 것이 불문율이다(src라는 폴더 명에서도 알수 있듯이 말이다). 따라서 다운로드 받은 파일을 /usr/src 폴더 아래로 이동할 것이다.


보다시피, 우리가 다운로드 받은 파일은 gzip으로 묶인 파일이다. 따라서 이 파일을 tar 명령어로 풀어주어야 한다. tar 명령어 사용법은 여기를 참조하자.

** 명령어: tar -xvf Python-3.9.5.tgz


압축 해제한 뒤 생성된 폴더에 들어가 내부의 파일을 살펴보자. 파일 및 폴더 수가 꽤나 많은데, 이들이 바로 설치에 필요한 소스 파일들이다.


이제 컴퓨터에게 설치를 할 수 있도록 컴파일 하는 과정을 알아보도록 하자.




3. 환경설정 - configure 파일 설정 및 실행

압축 해제된 파일을 보다보면 configure라는 이름의 파일이 보일 것이다. 파일 이름이 의미하는대로, 어떤 설정으로 컴파일을 진행할 것인지를 나타내는 파일이라고 보면 된다. 이 파일은 19000줄에 가까운 매우 '장황한' 스크립트 문서다. 이 파일의 1419번째 줄에는 이 파일의 사용 방법이 나온다(또는 sh configure --help를 입력하면 된다).


환경설정 파일인 configure 파일은 sh 명령어 또는 ./configure 명령어로 실행이 가능한데, 이 파일을 실행하게 되면, 파일 내부의 설정값에 따라 컴파일을 진행하기 위한 설정값 적용 과정이 진행되게 된다. 소스파일로 설치하는 경우, configure 파일에서 공통적으로 사용하는 옵션은 그렇게 많지 않은 편이다.

도움말의 옵션을 보면 --prefix와 --exec-prefix 옵션이 보이는데, 이 두 옵션은 프로그램에 필요한 파일들을 어디에 설치할 것인지를 묻는 옵션이라고 보면 된다. --prefix와 --exec-prefix의 차이점은, 사용하는 운영체제(Linux)에 독립적인지, 또는 종속적인지에 따라 설치할 파일의 위치를 달리할 수 있다는 것인데, 사실상 운영체제의 종속성과 상관없이 동일한 폴더에 설치하는 것이 일반적인 듯 하다. 옵션없이 configure로 환경 설정 진행 시, 기본값은 "/usr/local"로 지정된다.

아래에 보면 --bindir나 --sbindir와 같은 옵션들도 보이는데, 이 옵션들은 별도의 설정이 없는 경우, --prefix에서 설정한 경로 아래의 bin 폴더에 생성되게 된다.

"어?? 그럼 이 설정들은 일반적인 리눅스에서는 해 줄 필요가 없지 않나요?"

맞다. 그럼에도 불구하고 대부분의 Linux 운영자들은 이 옵션을 사용하는데, 그 이유는 여러 소스파일 프로그램이 잠깐 동안만 설치되었다가 지워져야 하는 경우, 이 파일들을 조금 더 쉽게 삭제하기 위함이다. 만약 Python과 SQLite 라는 패키지를 소스파일로 동시에 설치했다고 가정해보자. 그리고, SQLite파일은 잠깐만 사용하고 지운다고 해보자. 그럼, /usr/local/bin 아래에 설치된 명령어(--bindir 옵션에 의해 명령어는 이곳에 설치된다) 중 SQLite와 관련된 명령어만 별도로 찾아내어 삭제해야 한다. 명령어 뿐만 아니라 /usr/local/etc/ 아래의 설정 파일도 SQLite와 관련된 파일만 삭제해야하는데, 이 파일들의 양이 많으면 골치아프게 된다.

따라서 configure 파일 실행 시, --prefix 옵션으로 파일이 설치될 위치를 따로 지정해주게 된다. 보통 /usr/local 아래에 별도의 파일을 만든다. 필자는 Python3.9버전을 설치하므로, --prefix 값을 /usr/local/python39로 지정하려 한다. 이와 별개로 필자는 Python 3.9 버전 설치에 필요한 옵션을 추가하려 한다.

** 명령어: sh configure --prefix=/usr/local/python39 --enable-optimizations

뭔가 모를 명령어들이 쭈욱 나오며, configure 파일이 무사히 완료되면 마지막에 creating Makefile이라는 문구가 출력된다.


** 참고로, C파일로 소스코드가 작성된 경우, gcc(C언어 컴파일러)라는 패키지가 없다면 configure가 아래와 같이 진행되지 않는다. yum이나 rpm으로 gcc를 설치한 뒤 진행하도록 하자.



configure 파일의 실행 결과로 Makefile 이라는 이름의 파일이 생성되는데, 이 파일이 패키지 설치 시 소스 파일을 컴파일하고 설치할 수 있도록 하는 파일이다.


그럼, 생성된 Makefile로 컴파일 및 설치를 진행해보자.



4. 컴파일 및 설치

지금까지 진행한 내용은 컴퓨터가 컴파일을 진행할 때 참고할 환경설정을 지정해주는 것 뿐이었다. 따라서 /usr/local 아래에는 python39 폴더가 생성되지 않은 상태다.


이제 컴퓨터가 Makefile을 참조하여 소스 파일을 컴파일 할 수 있도록 실행시켜야 한다. make 명령어를 입력하면 Linux가 소스파일을 자신이 알아볼 수 있는 형태로 변환하게 된다.

** 명령어: make (필자와 동일하게 Python 3.9를 설치하는 경우, 아래의 주의사항을 먼저 읽어보자)

뭔가 모를 로그들이 쭈욱 뜨는데, 대략 5분 정도 걸려야 마무리되니 커피 한 잔 마시고 오자...

make 명령어가 오류 없이 마무리되는 경우, 소스파일의 컴파일이 완료된 것이며, 이 상태에서 make install 명령어를 입력하면 프로그램의 설치가 마무리된다.

** 명령어: make install

설치가 완료되는 경우, 위와 같이 설치가 완료되었다는 내용이 비스무리하게 출력된다.


< 주의 >
Error: Could not import runpy module
SystemError: <built-in function compile> returned NULL without setting an error

** 아래와 같이 오류 문구와 함께 make 명령어가 마무리되는 경우, 컴파일이 완료된 것이 아니다. 오류가 발생하는 경우, 해당 오류에 대해 구글링 후, 필요한 조치를 취하고 make 명령어를 다시 입력하도록 하자.


필자의 경우, runpy 모듈 import가 이루어지지 않아 발생한 문제다. 참고로 이 에러는 Python 2.7 버전이 기본으로 설치되어 있던(지워도 소용없다) CentOS7에서 발생하는 문제인데, 이를 해결하기 위해서는 make 명령어 대신, make altinstall 명령어를 사용하여, 기존 Python과 충돌되는 부분을 피해 컴파일과 설치를 동시에 진행하면 된다.

참고로, make 도중 오류가 난 경우, make clean 명령어를 사용하면 컴파일 된 내용을 삭제할 수 있다. 오류로 인해 다시 make 명령어를 사용해야 하는 경우 make clean 명령어를 실행한 뒤, make를 진행하는 것을 권장한다.




5. 설치한 프로그램의 확인

이제 필자가 설치한 Python이 잘 동작하는지 확인해보자. 먼저 python 명령어를 입력해보자. 하지만 python 명령어를 입력하면 필자가 설치한 버전과 다른 버전이 표시된다.


yum과 rpm 설치와 달리, 소스 파일로 설치하는 패키지의 경우, 패키지 관련 명령어가 /usr/bin이 아니라, --prefix에 지정한 폴더 하위의 bin 파일에 위치하게 된다. /usr/local/python39/bin 폴더 아래를 보면 다음과 같이 python 명령어가 python3.9라는 이름으로 지정된 것이 보인다.

python 외에 pip 명령어도 보인다.



해당 파일을 일반적인 명령어처럼 사용하려면, 명령어 파일을 /usr/bin 아래로 이동해주어야 한다. 하지만 이미 python 명령어가 존재하기 때문에 필자는 새로 설치한 두 Python명령어의 이름 뒤에 3을 붙여 파일을 이동해주려 한다.


이제 이 상태에서 python3라는 명령어를 치면 필자가 원했던 Python 3.9버전을 사용할 수 있게 된다.





이번 포스팅에서는 리눅스의 패키지 소스 파일을 설치하는 방법에 대해 알아보았다. 간략하게 정리하자면,

----------------------------------------------------------------------------------------------------------------
Configure 파일: 컴퓨터가 소스 파일을 컴파일 하기 전, 환경 설정을 진행 -> Makefile 생성
make 명령어 : 컴퓨터가 Makefile을 참조하여 소스파일을 컴파일 하도록 하는 명령어
make clean 명령어: 컴파일된 소스파일의 삭제.
make install 명령어: 컴파일된 소스파일을 컴퓨터가 실행하여 프로그램을 설치하도록 하는 명령어
----------------------------------------------------------------------------------------------------------------

라고 보면 된다.

그런데... SQLite 3.9 버전은 도대체 소스파일이 어디있는 걸까...?



PS: Python을 소스파일로 설치할 경우, rpm 등에 의해 검색되지 않는데, 이 때문에 다른 패키지에 대한 의존성을 확인할 수가 없다. 의존성이 있는 패키지가 설치되지 않은 경우, 아래처럼 pip 명령어의 사용이 불가능하기 때문에, 별도의 의존성 패키지를 설치해주어야 한다.





Fin.




반응형

댓글