Linux Upskill 6. 패키지 저장소 추가, tar, 컴파일과 설치

jiffydev·2021년 4월 9일
0

linux upskill

목록 보기
6/8

본 포스트는 박재호님의 유튜브 강의를 보고 개인적으로 정리한 내용입니다.

1. ubuntu 패키지 저장소 추가하기

일반적으로 ubuntu에 패키지를 설치할 때apt로 설치하면 되는데 저장소를 추가해야 하는 이유는 무엇일까?
먼저 소프트웨어가 베타버전이거나, 상위 버전을 미리 써 보고 싶을 때 사용한다. 또는 개인이 만들어서 유명하지는 않지만 패키지로 배포하는 소프트웨어를 패키지로 직접 설치하고 싶을 때 패키지 저장소가 필요하다.
다만, 패키지에 악성 파일을 심어놓는 경우도 있기 때문에 저장소가 올바른 저장소인지, 보안적인 문제는 없는지 확인 후 저장소를 추가해야 한다.

1-1. 명령어 실습

우선 패키지를 어떤 소스에서 가져오는지, 패키지의 목록을 살펴보자.

ubuntu@ip-172-26-9-205:~$ less /etc/apt/sources.list


이 목록이 패키지를 가져오는 소스의 리스트이고, 우리가 패키지를 설치하기 전 update, upgrade를 해주었는데, update 명령이 이 리스트를 최신회하는 명령인 것이다.

1-1-1. apt-cache

ubuntu@ip-172-26-9-205:~$ apt-cache dump | less

이 명령은 현재 캐시된 ubuntu 패키지 목록을 보여준다. 우리가 저장소를 추가하게 되면 패키지는 늘어나게 될 것이다.
참고로 패키지의 개수는 다음과 같이 확인할 수 있다.

ubuntu@ip-172-26-9-205:~$ apt-cache dump | grep "Package:" | wc -l

grep 명령은 이미 배웠으니 넘어가고, wc는 word count의 약자로 단어의 개수를 세는데 행 단위로 세게 된다.

1-1-2. PPA

이제까지는 ubuntu 패키지에 없는(표준 패키지가 아닌) 것을 설치하려면 필요한 것이 PPA(Personal Package Archive)이다.
PPA를 사용하기 위해서는 사전작업이 필요하다. 다음 명령어들을 실행해 주자.

ubuntu@ip-172-26-9-205:~$ sudo apt install software-properties-common

이번에는 php 7.3 버전을 설치해 보려고 한다. 그런데 이미 패키지가 존재하지는 않는지 확인해보자.

ubuntu@ip-172-26-9-205:~$ apt-cache dump | grep "php7." | less

찾아봐도 7.2까지만 나오고 7.3은 보이지 않을 것이다. 무슨 일이 있어도 반드시 7.3 버전을 사용해야 하기 때문에 아래처럼 저장소를 추가해야 한다.

ubuntu@ip-172-26-9-205:~$ sudo apt-add-repository ppa:ondrej/php


주의사항이 나오면 내용을 확인하고 엔터를 눌러주면 된다.
다음으로는 혹시 모르니 update를 통해 리스트를 최신화해주자.
그리고 정말로 7.3 버전 패키지가 있는지 확인하기 위해 cache에서 grep을 통해 검색해보겠다.

ubuntu@ip-172-26-9-205:~$ apt-cache dump | grep "php7.3" | less


잘 나오는 것을 볼 수 있다.

그러면 마지막으로 php 및 부수적인 소프트웨어를 설치해서 확인해보자.

ubuntu@ip-172-26-9-205:~$ sudo apt install php7.3 php7.3-common php7.3-opcache php7.3-cli php7.3-gd php7.3-curl php7.3-mysql


잘 설치되었다.

이제 우리는 ubuntu에 패키지가 없을 때도 PPA를 추가함으로써 패키지를 설치할 수 있게 되었다.

2. tar(tape archive)

tar은 많은 파일을 하나의 아카이브 파일로 묶는 유틸리티이다. 압축과 뭐가 다른가 싶지만, tar의 가장 큰 특징은 파일을 묶을 때 권한이 그대로 보존된다는 점이다.
그리고 부수적인 효과로, 파일을 묶는 것과 압축을 나눠 놨기 때문에 더 좋은 압축 알고리즘이 나오면 압축 알고리즘을 쉽게 바꿀 수 있고, 폴더를 옮길 때처럼 굳이 압축이 필요 없을 때도 자원을 낭비할 필요 없이 묶기만 하면 된다는 장점이 있다.

2-1. 명령어 실습

2-1-1. tar, gzip

ubuntu@ip-172-26-9-205:~$ tar cvpf myinits.tar /etc/init.d

우선 각 옵션에 대한 설명이다.

  • c: 아카이브 생성, 기존 아카이브 덮어쓰기
  • v: verbose. 처리되는 파일 정보를 상세히 표시
  • p: 권한을 유지
  • f: f 다음에 묶을 파일 이름을 명시


잘 묶였는지 확인할 때는 c를 t로 바꿔 주면 된다. 또한 권한이 유지된 것을 볼 수 있다.

이제 압축을 해 보자.

ubuntu@ip-172-26-9-205:~$ gzip myinits.tar



용량의 차이가 보이는가? 거의 1/5 수준으로 줄어든 것을 볼 수 있다.

그런데 아무래도 tar 후 gzip으로 압축하는 경우가 많다보니, 아예 tar 옵션에서 압축까지 할 수 있도록 해버렸다. z 옵션으로 압축하는데, 파일 확장자도 tar에서 tgz로 바꿔야 한다.

ubuntu@ip-172-26-9-205:~$ tar cvpfz myinits.tgz /etc/init.d

2-1-2. 압축 풀기

압축을 풀기 전에, 위에서 연습한 파일을 홈 디렉토리에서 풀게 되면 디렉토리가 지저분해지므로, 연습용 디렉토리를 만들어 그 안에 압축파일들을 이동시키자.

 ubuntu@ip-172-26-9-205:~$ mkdir tarsample
 ubuntu@ip-172-26-9-205:~$ cd tarsample
 ubuntu@ip-172-26-9-205:~/tarsample$ mv ../myinits.* .

그리고 두 파일의 압축을 각각 다음처럼 풀어주면 된다.

ubuntu@ip-172-26-9-205:~/tarsample$ gzip -d myinits.tar.gz
ubuntu@ip-172-26-9-205:~/tarsample$ tar xvpf myinits.tgz

압축이 잘 풀렸는지 확인하기 위해 /etc/init.d로 이동하여 ls -al 명령으로 확인해보자.
뭔가 이상한 점이 있지 않은가?

분명 tar만 했을 때는 원래 권한이 유지됐었는데, 압축을 풀고 나니 사용자로 바뀌어 있는 것을 볼 수 있다.
이는 root가 아닌 사용자가 root의 압축을 풀 수 없기 때문에 자동적으로 ubuntu 계정의 권한으로 바꿔 놓은 것이다.

그러면 이제 사용할 일이 없는 /tarsample/etc 디렉토리를 삭제하자.

ubuntu@ip-172-26-9-205:~/tarsample/etc/init.d$ cd ../../
ubuntu@ip-172-26-9-205:~/tarsample$ rm -rf ./etc/

2-1-3. 이동하지 않고 압축 & 압축 풀기

위에서는 mv 명령을 통해 압축한 파일을 옮기고 나서 풀었지만, 귀찮음을 덜기 위해 옮길 디렉토리에서 바로 압축과 압축 풀기를 진행할 수 있다.

ubuntu@ip-172-26-9-205:~/tarsample$ tar cvpf - /etc/init.d | tar xvpf - -C /home/ubuntu/tarsample/

-C는 압축을 풀 디렉토리를 변경하는 옵션으로, 뒤에 압축을 풀 디렉토리를 설정해야 한다.

지금까지 한 모든 명령들은 한 디렉토리의 파일을 모두 묶어(+압축) 다른 디렉토리로 옮기는 행위였다. 그런데 리눅스에는 이미 cp 명령이 있어, 재귀적으로 모든 파일을 옮길 수 있음을 떠올린다면 tar를 왜 썼는지 의문이 들 수도 있다.
그 이유는 과거에는 cp 명령이 파일의 소유주를 바꿔버렸기 때문으로, 권한을 유지하기 위해 tar를 사용할 수밖에 없었다.
물론 지금은 sudo cp -a로 파일 접근 권한을 보존할 수 있어서 권한 관련한 문제는 없지만 tar은 여전히 많이 사용하므로 잘 알아두는 것이 시스템 관리자로서도 도움이 될 것이다.

3. 소스 코드로 프로그램 컴파일하고 설치하기

패키지로 유틸리티 등을 다운받아 설치할 수도 있지만, 우리가 직접 작성한 코드 또는 남이 작성한 코드를 사용해야 할 경우도 있다. 이럴 때는 직접 컴파일을 해서 설치하는 과정이 필요하다.

3-1. 명령어 실습

3-1-1. nmap 소스코드를 받아 컴파일

nmap 홈페이지에 들어가 소스코드로 다운로드를 받아 보자.
좌측 다운로드 탭으로 들어가 밑으로 내려가 보면 아래와 같은 Source Code Distribution 항목이 있다.

여기서 밑의 안정화버전의 링크를 우클릭해 '링크 주소 복사'를 누른다.

다시 터미널로 돌아와 테스트용 디렉토리를 생성하고 링크 주소를 다음과 같이 복사해 다운로드하자.

일반적으로 패키지를 다운로드 받을 때는 apt-get을 사용했는데, url로 다운로드 받을 때는 wget을 사용한다.

이제 컴파일을 해야 하는데, 컴파일 방법에 관해서 우선은 이 페이지에서 방법을 각자 확인한 후 실습에 들어가도록 하겠다.

우선 파일 형식을 보면 tar.bz2라고 되어 있다. tar은 방금 배웠으니 bz2는 뭘까 궁금하다.
이럴 때는 file 명령어를 통해 어떤 파일인지를 확인할 수 있다.

ubuntu@ip-172-26-9-205:~/src$ file nmap-7.91.tar.bz2
결과) nmap-7.91.tar.bz2: bzip2 compressed data, block size = 900k

bzip2라는 압축된 파일인 것으로 보인다. 그러면 압축을 풀면 되는데, 위에서 배웠던 gzip의 경우 tar에서 z옵션을 통해 gzip 형식의 압축을 푼 것을 기억하고 있을 것이다. (x는 형식 상관 없이 압축을 풀 때 사용)
tar에는 bzip 관련 옵션도 있어, j를 붙이면 bzip의 압축을 풀 수 있다.

ubuntu@ip-172-26-9-205:~/src$ tar xvpfj nmap-7.91.tar.bz2

그러면 생성된 nmap-버전 디렉토리로 이동하여 설치를 준비해보자.
그런데 압축을 푼 파일들 중에 INSTALL이라는 파일이 보인다. 우선은 어떻게 인스톨하면 좋을지 확인하기 위해 head 명령으로 이 파일을 슬쩍 보자.

단 3줄로 설치가 끝난다고 되어 있다. 그러면 일단 저대로 진행해보도록 하겠다.

ubuntu@ip-172-26-9-205:~/src/nmap-7.91$ ./configure


세상일이 원래 내 뜻대로 되지 않는게 더 많다.
그래도 왜 안되는지 친절히 써있으니 확인해보면, C 컴파일러가 없다고 한다.
원인을 알았으니 설치하면 되는데, 컴파일러, make 등등을 한땀한땀 받아서 설치할 수도 있지만 리눅스에는 이러한 컴파일에 필수적인 요소들을 한 번에 받을 수 있는 명령어가 있다.

ubuntu@ip-172-26-9-205:~/src/nmap-7.91$ sudo apt install build-essential

설치해 보면 엄청난 용량의 파일이 설치되는 것을 볼 수 있다.
다만, 학습용으로 이렇게 컴파일러를 설치하는 것은 괜찮지만 상용 시스템에는 설치하지 않는 것을 추천한다.

컴파일러가 설치되었으니 이제 진짜로 설치를 해보자.

ubuntu@ip-172-26-9-205:~/src/nmap-7.91$ ./configure

필자의 경우는 바로 설치가 되었지만, 사용자에 따라서는 flex가 없어서 설치가 안되는 경우도 있다. 이럴 때는 아래처럼 필요한 패키지를 설치하고 다시 ./configure를 실행해보자.

ubuntu@ip-172-26-9-205:~/src/nmap-7.91$ sudo apt install flex
ubuntu@ip-172-26-9-205:~/src/nmap-7.91$ ./configure

그 외에도 뭐가 없어서 설치가 안된다는 메시지가 나오면 구글신의 힘을 빌리면 무엇을 설치해야 하는지 알 수 있으므로 열심히 검색해보자.
확인이 끝났다면 다음과 같은 화면을 볼 수 있을 것이다.

밑에 경고 메시지가 있는데, openssl로 컴파일을 하려면 준비가 많이 필요하므로 우선은 빌드 후 설치가 되는지만 확인하도록 하겠다.

다시 처음으로 돌아와서, 무사히 ./configure로 확인이 끝났으니 본격적으로 make, make install로 설치를 시작하자.

우선은 무사히 make가 되었다면 다음과 같은 메시지가 여러분을 맞이할 것이다.

그러면 일단은 nmap의 버전을 출력해 보도록 하자.

ubuntu@ip-172-26-9-205:~/src/nmap-7.91$ ./nmap -V


openssl, libssh2 없이 컴파일 되었다고 나와있는데 일단은 무시하고 nmap을 실행해 보겠다.

이처럼 실행이 되는 것을 볼 수 있지만 이것뿐이고 다른 기능은 사용하지 못할 것이다.

그렇다면 마지막으로, 설치를 어떻게 해야 할까? 설명에 make install을 하라고 써 있었으니 똑같이 하면 되겠다 싶지만

가슴이 웅장해지는 실패 메시지를 볼 수 있다.

실패한 이유는 위 메시지에도 나오지만 /user/local/에 설치하려고 하는 것이 그 이유로, nmap이 어디 설치되어 있는지 우선 확인해보자.

ubuntu@ip-172-26-9-205:~/src/nmap-7.91$ which nmap

/usr/bin/nmap에 설치되어 있다고 나올 것이다. 분명 같은 nmap인데 /usr/bin/nmap에도 있고 /user/local/bin에도 있다. 그러면 어떤게 먼저 실행될까?
이는 경로를 확인하여 알 수 있다.

ubuntu@ip-172-26-9-205:~/src/nmap-7.91$ echo $PATH


앞에 나온 miniconda, conda는 무시하고 그 다음부터 보면 /user/local/bin/user/bin보다 먼저 나오는 것을 볼 수 있다.
그래서 /user/local/bin에서 먼저 실행되는데, 이를 해결하려면 sudo 명령으로 make install을 실행하면 되지만, 앞에서 설명했듯 아직 openssl 문제를 해결하지 않았기 때문에 설치 작업은 추후 해결하도록 하겠다.

profile
잘 & 열심히 살고싶은 개발자

0개의 댓글