지난 2개의 포스팅을 통해, rpm 명령어를 사용하여 Linux에 설치된 패키지(프로그램)에 대해 확인하는 방법, 그리고 새 패키지의 설치와 삭제 방법에 대해 알아보았다.
패키지의 설치 및 삭제에 대해 설명한 포스팅에서, 쉬운 예시를 들기 위해 net-tools 패키지를 설치/삭제해보았는데, 실제 리눅스에서 rpm 명령어를 통해 수동으로 패키지를 설치하는 경우, 의존성이라고 불리는 녀석 때문에 간간히 설치가 진행되지 않는 경험을 하신 분들도 있을 것이다. 일반적으로 yum 명령어를 사용하여 패키지를 설치하는 경우, 설치하려는 패키지가 필요로 하는 다른 패키지나 소캣 파일도 함께 자동으로 설치를 진행해주나, 인터넷이 끊겨있는 서버에서는 이러한 의존성을 관리자가 일일히 확인하여 모두 설치를 진행해주어야 한다. 예시를 하나 보자.
1. 의존성(Dependency)이란
필자는 ntp 서버와 관련된 패키지를 가상 LInux 서버에 설치하려 한다. ntp 서버는 Network Time Protocol의 약자로 서버 시간을 동기화(동일하게) 할 수 있도록 만들어주는 서버다. 여러 서버들이 연동되는 경우, 각 서버 운영체제의 시간이 차이없이 동일하게 움직여야 만들어야 할 필요가 있는데, 서버가 위치한 장소에 따라 시간 흐름이 미세하게 차이가 생길 수 밖에 없기 때문에(아인슈타인의 상대성 이론에 대해 개요 정도만 알고 있어도 이해가 되는 부분이다), 이를 보정하는 서비스가 ntp라고 보면 된다. ntp 서버의 구동에 대해서는 추후 다시 포스팅 할 예정이니 여기까지만 하고...
우선 이 ntp라는 패키지를 rpm.pbone.net에서 다운받아 rpm 명령어로 수동 설치하면, 다음과 같이 오류가 뜨면서 설치가 되지 않는 것을 확인할 수 있다.
오류의 내용을 보면 Failed dependencies라는 문구와 함께, 아래에 패키지 이름으로 보이는 파일들이 2개 보인다. 이것이 의미하는 바는, ntp 패키지의 설치를 위해 libopts.so 파일의 설치와 ntpdate 패키지 설치가 선행되어야 한다는 의미이다.
동일한 ntp 패키지를 yum 명령어를 사용하여 설치해보면, 이 두 파일이 자동으로 설치가 진행되는 것을 알 수 있다.
즉, 의존성이란 패키지를 설치하기 위해 필요한 다른 패키지 또는 파일을 의미하는 것이라고 보면 된다. 그럼, 우리가 설치하려는 패키지가 어떤 파일에 의존하고 있는지 알 수 있는 방법이 있을까?
우리가 rpm 파일을 다운받는 rpm.phone.net에서는 rpm 파일 다운로드 전, rpm 파일에 대한 정보를 제공하는데 아래쪽에 Requires라고 적힌 부분이 바로 해당 패키지가 의존하는 파일들이다. Linux 설치 시, 대부분은 기본으로 설치되는 패키지가 많지만, ntp처럼 기본적으로 설치되지 않는 패키지들도 분명 존재하기는 한다. 설치 패키지가 필요로하는 의존 파일들 역시, 클릭하면 다운로드 받을 수 있는 창으로 이동하게 되며, 이곳에서 rpm파일을 다운받아 설치를 진행해주면 된다.
ntp 패키지는 현재 2개의 패키지에 대해 의존성을 가지고 있다. 따라서 의존성을 가지는 패키지를 다운받아 하나씩 설치를 진행하면서 ntp의 의존성 목록이 줄어드는지 확인해보자.
먼저 필자는 ntpdate 패키지를 먼저 설치를 진행한 뒤, ntp 설치를 진행해보았다.
ntpdate 패키지를 설치한 뒤, ntp 패키지 설치를 진행하자, Dependency 목록이 1개 줄어든 것이 확인되었다. 이제 libopt 소캣파일 설치를 위한 autogen-libopt 패키지를 설치한 뒤, ntp를 설치해보겠다.
의존성이 필요한 패키지를 설치하고 나면, ntp 패키지 설치가 잘 진행되는 것을 확인할 수 있다. 조금 복잡한 프로그램인 경우, 해당 패키지가 필요로 하는 의존성 파일들이 다른 의존성 파일을 요구하는 경우가 종종 있다. 이런 경우, rpm을 이용한 수동 설치가 조금 복잡해지는 편이다. 하지만 일반적인 상황에서는 yum을 사용하여 자동으로 의존성이 있는 패키지도 설치를 진행해주기 때문에 크게 걱정할 부분은 아니다. 다만 만일의 상황에 대비하여 이러한 경우도 있을 수 있다는 것을 알아두면 좋다.
2. rpm의 기타 명령어
간혹 Linux 서버를 운영하다보면, 필요하지 않은 패키지를 삭제해야 할 상황이 올 때도 있다. 하지만 위의 경우와 같이 다른 패키지가 의존성을 가지는 패키지라면 삭제 시 상당히 곤욕스러운 상황이 발생할 수 있다. 예를 들어, npt 패키지는 libopt 소캣 파일 사용을 위해 autogen-libopt 패키지를 필요로 하는데, 만약 autogen-libopt 파일이 삭제되게 된다면? 난리나는 거다....
(1) --nodpes 옵션
따라서 rpm 패키지의 경우, 다른 패키지가 의존성을 띄는 경우, 함부로 삭제되지 않도록 만들어놓았다. 아래의 예시를 보자. 현재 ntp 패키지는 ntpdate와 autogen-libopt 패키지를 의존하고 있는데, 이 두 패키지를 지우려고 시도한다면 아래와 같이 지울 수 없다는 문구가 나타나게 된다.
둘 다 ntp 패키지가 의존하고 있는 파일이라 지울 수 없다는 문구가 나타난다. 물론, 이러한 의존성을 무시하고 삭제할 수 있는 방법이 있긴 하다. 바로 rpm 명령어의 --nodeps 명령어를 사용하면 된다. --nodeps 옵션은 no dependency의 약자로 보면 되는데, 패키지의 설치와 삭제 시 의존성을 검사하지 않고 진행하겠다는 의미다. 이 옵션으로 앞의 ntpdate 패키지를 삭제하면 다음과 같이 삭제가 잘 진행되는 것을 확인할 수 있다.
분명 ntp는 ntpdate에 의존함에도 불구하고, ntpdate 패키지가 삭제된 것이 확인된다. 반대로 의존성을 확인하지 않고 설치하는 방법도 가능하다. ntp와 연관된 모든 패키지를 삭제하고, ntp를 --nodeps 명령어로 설치를 진행하면 다음과 같이 설치가 잘 진행되는 것을 확인할 수 있다.
물론, 이렇게 의존성을 확인하지 않고 설치한 패키지는 제대로 동작하지 않을 가능성이 있다. 그럼에도 불구하고 이 옵션이 사용되는 이유는, 특정 패키지가 설치되어 있는 경우, 의존성을 가진 패키지 설치에 도움이 될 수 있지만, 어떤 패키지에 대해서는 설치를 진행하지 못할 수도 있기 때문이다(필자도 이 부분이 이해되지 않긴 하지만... 사람이 만든 것이니 그럴 수 있다 치자).
(2) --whatrequires, --requires
다시 ntp와 연관된 모든 패키지를 설치해보자. 그럼, 어떤 패키지가 다른 패키지가 의존하는 패키지인지 알 수 있는 방법에는 무엇이 있을까? 예를 들어, A라는 패키지와 B, C라는 패키지가 모두 Z라는 패키지에 대해 의존성을 가지고 있는데, 멋모르고 --nodeps로 Z 패키지를 지워버리면 A, B, C 모두 동작에 영향이 있을 수 있다. 만약 이 패키지 중 하나라도 서비스에 크리티컬한 영향을 주는 것이라면....(으악....끔찍하다)
그렇기 때문에, rpm 명령어는 특정 패키지가 다른 패키지에 대해 의존성을 가지는 지 확인할 수 있는 옵션을 따로 제공한다. 바로 --whatrequires 라는 옵션인데, 이 옵션을 사용하면 명령어에 명시한 패키지 명을 필요로 하는 모든 패키지를 보여준다. ntpdate 패키지에 대해 이 명령어를 사용해보자.
패키지에 대해 질의를 하는 내용이기 때문에 --whatrequires 옵션 사용을 위해서는 -q 옵션도 함께 사용해주어야 한다. ntpdate 패키지는 ntp패키지가 의존하는 패키지라는 결과가 출력되는 것을 확인할 수 있다.
반대로, 내가 질의하는 패키지가 의존하는 파일들에는 무엇이 있는지 확인하는 옵션은 --requires다. ntp 패키지에 대해 이 옵션을 적용하면, rpm.pbone.net에서 보았던 ntp 패키지의 의존 파일 목록을 동일하게 확인할 수 있다.
두 옵션을 사용하여 패키지의 설치 및 삭제 시, 의존성을 가진 패키지를 확인함으로써, 설치 및 삭제 후 다른 패키지의 동작에 끼치는 영향을 미리 파악할 수 있다는 장점이 있다.
(3) --test 옵션
새 패키지의 설치 또는 기존 설치된 패키지 삭제를 진행하기 전, 테스트 형태로 시뮬레이션 할 수 있는 옵션도 rpm 명령어가 제공한다. 바로 --test 옵션인데, 이 옵션을 설치 또는 삭제 옵션과 함께 사용하면, 실제 설치/삭제는 진행하지 않되, 그 과정이 동일하게 화면에 표시된다.
위의 세 예시 모두 상세히 내용을 확인해보면 알 수 있겠지만, 실제 설치와 삭제는 진행되지 않았다. 즉, --test 명령어를 사용하여 이 패키지들이 제대로 설치/삭제되는지 확인하는 용도로 사용하는 옵션이라고 보면 된다.
(4) --scripts와 --changelogs
이 부분은 아마도, 패키지를 개발하는 분들이 많이 사용할 옵션일 듯 하다. --scripts 명령어는 패키지의 설치 및 삭제 시 실행되는 bash 스크립트, 즉 파일의 설치와 삭제를 진행하는 코드를 표시해주는 옵션이다.
마지막으로 --changelogs는 해당 패키지의 개발 내용을 출력하는 명령어다. 해당 패키지가 어떤 패치를 거쳤는지, 어떤 부분이 변화되었는지를 출력해주는데, 이 역시 패키지 개발자에게 많이 필요한 내용일 듯 하다.
내용의 상단에는 최신 내용이, 내용의 하단으로 갈 수록 예전의 개발 내용이 나타난다. 따라서 이 옵션 사용시에는 파이프로 more 명령어를 달아 많이 사용한다.
지금까지 3개의 포스팅을 통해 rpm 명령어의 옵션과 그 사용법에 대해 정리해보았다. 사실 패키지 설치에는 rpm 명령어보다, 자동으로 설치 과정을 진행해주는 yum(Ubuntu계열은 apt-get) 명령어가 압도적으로 많이 사용되지만, rpm 명령어의 경우 인터넷이 연결되지 않은 상황에서 사용할 수 있기 때문에 Linux 서버 관리를 업으로 하시거나 개발하시는 분이라면 반드시 알고 있어야 할 명령어다.
다음 포스팅부터는 ntp 서버에 대해 다루어볼까 한다. 사실 ntp 서버는 한 번도 시도해보지 않은 부분이라 조금 시간이 걸릴 수는 있을 것 같지만 말이다.
< Appendix >
명령어 | 옵션 | 설명 |
rpm | -e(U)vh --nodeps | 설치, 삭제 시 의존성 검사 없이 진행 |
-q --whatrequires | 질의한 패키지를 필요로 하는 패키지 목록 출력 | |
-q --requires | 질의한 패키지가 필요로 하는 패키지 목록 출력 | |
-q --scripts | 패키지 설치/삭제 시 실행되는 스크립트 출력 | |
-q --changelog | 패키지 개발 내역 연대순으로 확인 |
FIN.
'IT Security > LINUX Basic' 카테고리의 다른 글
34. Linux - NTP 서버 설치 및 시간 동기화2 (0) | 2020.12.09 |
---|---|
33. Linux - NTP 서버 설치 및 시간 동기화1 (0) | 2020.10.25 |
31. Linux - rpm 명령어 기본 사용법2(설치/삭제) (0) | 2020.10.24 |
30. Linux - rpm 명령어 기본 사용법1(질의) (0) | 2020.08.23 |
29. Linux - 리눅스 방화벽 4, 기타 방화벽 설정 (0) | 2020.08.16 |
댓글