소개
이 실습에서는 강력한 rpm 명령줄 유틸리티를 사용하여 RPM 기반 Linux 배포판에서 소프트웨어 패키지를 관리하는 기초를 배웁니다. 상세 패키지 정보 조회, 설치된 패키지의 무결성 검증, RPM 파일 내용 검사 등 필수적인 패키지 관리 작업을 직접 수행해 봅니다.
각 단계를 진행하면서 특정 rpm 명령어를 사용하여 파일이 어떤 패키지에 속하는지 확인하고, 패키지 의존성 및 설정 파일을 나열하며, 역의존성(reverse dependencies)을 확인하는 방법을 익힙니다. 또한, 패키지 제거 시 시스템에 미칠 영향을 파악하기 위해 제거를 안전하게 시뮬레이션하는 방법과 rpm2cpio 및 cpio 도구를 사용하여 설치 전 RPM 패키지 내부를 살펴보는 방법도 배웁니다.
rpm -qi 및 rpm -qf를 이용한 기본 패키지 정보 조회
이 단계에서는 Red Hat 패키지 관리자(rpm)를 사용하여 설치된 패키지에 대한 정보를 조회하는 방법을 배웁니다. rpm은 CentOS, Fedora, RHEL과 같은 RPM 기반 Linux 배포판에서 소프트웨어를 관리하기 위한 강력한 명령줄 유틸리티입니다. 여기서는 두 가지 핵심 조회 옵션에 집중합니다. -qi는 상세 패키지 정보를 가져오고, -qf는 특정 파일이 어떤 패키지에 속하는지 확인하는 데 사용됩니다.
먼저 시스템에 이미 설치된 패키지의 세부 정보를 확인해 보겠습니다. bash 셸은 시스템의 핵심 구성 요소이므로 좋은 예시가 됩니다. -q 플래그는 'query(조회)'를 의미하며, i 플래그는 'information(정보)'을 의미합니다.
먼저 실습 작업 공간으로 이동하여 이 실습에서 생성할 명령어 출력 파일들을 한곳에 모아둡니다.
cd /home/labex/project
터미널에서 다음 명령어를 실행하여 bash 패키지에 대한 정보를 조회하고 그 결과를 bash-package-info.txt에 저장합니다.
rpm -qi bash | tee bash-package-info.txt
패키지의 다양한 속성이 나열된 상세한 출력을 볼 수 있습니다. 출력 내용은 다음과 유사할 것입니다(버전 번호와 날짜는 다를 수 있음).
Name : bash
Version : 4.4.20
Release : 5.el8
Architecture: x86_64
Install Date: <some_date>
Group : System Environment/Shells
Size : 4989189
License : GPLv3+
Signature : RSA/SHA256, <some_date_and_time>, Key ID <some_key_id>
Source RPM : bash-4.4.20-5.el8.src.rpm
Build Date : <some_date>
Build Host : <some_build_host>
Relocations : (not relocatable)
Vendor : CentOS
URL : http://www.gnu.org/software/bash
Summary : The GNU Bourne-Again Shell
Description :
The GNU Bourne-Again Shell (Bash) is a shell or command language
interpreter that is compatible with the Bourne shell (sh). Bash
incorporates useful features from the Korn shell (ksh) and the C
shell (csh). Most sh scripts can be run by bash without
modification.
이 출력은 패키지의 버전, 목적 요약, 상세 설명 등 풍부한 정보를 제공합니다.
이제 시스템에 /usr/bin/bash와 같은 bash 실행 파일이 있을 때, 어떤 패키지가 이를 설치했는지 알고 싶다고 가정해 봅시다. 이는 시스템 감사나 문제 해결 시 흔히 수행하는 작업입니다. 이를 위해 -qf 플래그를 사용할 수 있으며, 여기서 f는 'file(파일)'을 의미합니다.
다음 명령어를 실행하여 /usr/bin/bash 파일을 소유한 패키지를 찾고 결과를 bash-owner.txt에 저장합니다.
rpm -qf /usr/bin/bash | tee bash-owner.txt
명령어는 이 파일을 제공하는 패키지의 전체 이름을 반환합니다.
bash-5.1.8-9.el9.x86_64
보시다시피, 시스템은 /usr/bin/bash가 bash 패키지에서 왔음을 정확히 식별하며, 이는 앞서 확인한 정보와 일치합니다. rpm -qif /usr/bin/bash를 실행하면 이 플래그들을 조합하여 파일을 소유한 패키지 정보를 직접 얻을 수도 있습니다.
rpm -qR 및 rpm -qc를 이용한 패키지 의존성 및 설정 파일 나열
이 단계에서는 rpm을 계속 탐색하며 패키지의 의존성과 관련 설정 파일을 나열하는 방법을 배웁니다. 대부분의 소프트웨어는 올바르게 작동하기 위해 다른 패키지에 의존하므로 의존성을 이해하는 것은 매우 중요합니다. 또한 시스템 관리 및 사용자 정의를 위해서는 설정 파일의 위치를 아는 것이 필수적입니다.
/home/labex/project에서 계속 작업합니다. 먼저 bash 패키지가 필요로 하는 다른 패키지나 기능이 무엇인지 확인해 보겠습니다. 이를 위해 -qR(또는 --requires) 플래그를 사용합니다. R은 'requires(요구 사항)'를 의미합니다.
다음 명령어를 실행하여 bash의 의존성을 확인하고 결과를 bash-requires.txt에 저장합니다.
rpm -qR bash | tee bash-requires.txt
출력은 bash가 의존하는 패키지 및 시스템 기능 목록입니다. 이 목록은 꽤 길 수 있습니다.
/bin/sh
config(bash) = 4.4.20-5.el8
filesystem >= 3
libc.so.6()(64bit)
info
libc.so.6(GLIBC_2.17)(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
libc.so.6(GLIBC_2.28)(64bit)
libc.so.6(GLIBC_2.3)(64bit)
...
rtld(GNU_HASH)
이 출력은 bash가 libc.so.6, filesystem 패키지 및 기타 런타임 구성 요소와 같은 핵심 시스템 기능에 의존하고 있음을 보여줍니다.
다음으로, bash 패키지의 일부로 설치된 설정 파일을 찾아보겠습니다. 이는 새 사용자를 위해 셸의 기본 동작을 수정해야 할 때 유용합니다. 이를 위해 -qc 플래그를 사용하며, 여기서 c는 'configfiles(설정 파일)'를 의미합니다.
다음 명령어를 실행하여 bash의 설정 파일을 나열하고 결과를 bash-config-files.txt에 저장합니다.
rpm -qc bash | tee bash-config-files.txt
출력에는 설정 파일의 전체 경로가 표시됩니다.
/etc/skel/.bash_logout
/etc/skel/.bash_profile
/etc/skel/.bashrc
/etc/skel에 있는 이 파일들은 사용자 계정이 생성될 때 새 사용자의 홈 디렉터리로 복사되는 템플릿 파일입니다.
플래그를 조합하여 특정 명령어와 관련된 설정 파일을 찾을 수도 있습니다. 예를 들어, passwd 명령어에서 사용하는 설정 파일을 보려면 -qcf를 사용할 수 있습니다. 이는 rpm에게 먼저 파일의 패키지를 찾고(-f /usr/bin/passwd), 그 다음 설정 파일을 나열(-c)하도록 지시합니다.
rpm -qcf /usr/bin/passwd | tee passwd-config-files.txt
이 명령어는 passwd 유틸리티와 관련된 설정 파일을 보여줍니다.
/etc/pam.d/passwd
이는 명령어의 동작을 변경하기 위해 편집해야 할 파일을 빠르게 식별할 수 있는 강력한 방법입니다.
rpm -V를 이용한 패키지 무결성 및 파일 변경 확인
이 단계에서는 rpm -V(또는 rpm --verify)를 사용하여 설치된 패키지의 무결성을 확인하는 방법을 배웁니다. 이 명령어는 중요한 보안 및 문제 해결 도구입니다. 패키지에 의해 설치된 파일들을 파일 크기, 권한, 체크섬 등 RPM 데이터베이스에 저장된 정보와 비교합니다. 이를 통해 시스템 파일에 대한 무단 변경이나 실수로 인한 변경을 감지할 수 있습니다.
먼저 lsscsi와 at 유틸리티 패키지가 시스템에 설치되어 있는지 확인합니다. 검증 테스트를 위해 이 패키지들을 사용하겠습니다.
sudo dnf install -y lsscsi at
/home/labex/project에서 계속 작업합니다. 이제 lsscsi 패키지를 검증해 보겠습니다. 방금 설치했고 아무런 변경을 하지 않았으므로 검증 테스트를 통과해야 합니다. 성공적인 검증은 아무런 출력을 생성하지 않습니다.
rpm -V lsscsi | tee lsscsi-verify.txt
예상대로 명령어 프롬프트는 아무런 메시지 없이 반환되며, 이는 lsscsi 패키지의 모든 파일이 원래 상태임을 나타냅니다.
다음으로, 의도적으로 설정 파일을 수정하고 rpm -V가 어떻게 변경 사항을 보고하는지 확인해 보겠습니다. at 패키지에 속하는 /etc/at.deny 파일에 한 줄을 추가하겠습니다. 이 파일은 어떤 사용자가 at 명령어를 사용할 수 없는지 제어합니다.
echo "labex" | sudo tee -a /etc/at.deny
파일을 수정했으니 이제 at 패키지를 다시 검증해 보겠습니다.
sudo rpm -V at | tee at-verify.txt
이번에는 명령어가 출력을 생성하여 변경 사항이 감지되었음을 나타냅니다.
S.5....T. c /etc/at.deny
이 출력의 의미를 분석해 보겠습니다.
S: 파일 Size(크기)가 변경되었습니다.5: MD5 체크섬이 변경되었습니다.T: 수정 Time(시간)이 변경되었습니다.c: 이는 configuration file(설정 파일)임을 나타냅니다./etc/at.deny: 수정된 파일의 경로입니다.
8자 문자열 S.5....T.의 각 문자 위치는 서로 다른 테스트를 나타냅니다. .은 테스트를 통과했음을 의미합니다. 이 출력은 /etc/at.deny 설정 파일이 설치 이후 변경되었음을 명확하게 보여줍니다.
-qVf 플래그를 사용하여 특정 파일을 소유한 패키지를 직접 검증할 수도 있습니다.
sudo rpm -qVf /etc/at.deny | tee at-file-verify.txt
이 명령어는 먼저 /etc/at.deny를 소유한 패키지(at)를 찾은 다음 검증하므로 동일한 출력을 생성합니다.
rpm -e --test를 이용한 역의존성 확인 및 패키지 제거 시뮬레이션
이 단계에서는 역의존성(reverse dependencies)을 확인하고 패키지 제거를 안전하게 시뮬레이션하는 방법을 배웁니다. rpm -qR 명령어가 패키지가 필요로 하는 것(의존성)을 보여준다면, rpm -q --whatrequires는 다른 패키지들이 그 패키지를 필요로 하는 것(역의존성)을 보여줍니다. 패키지를 제거하면 시스템의 다른 부분이 손상될 수 있으므로 제거 전에 이를 아는 것은 매우 중요합니다.
/home/labex/project에서 계속 작업합니다. 패키지 제거의 결과를 안전하게 확인하려면 rpm -e --test 명령어를 사용할 수 있습니다. -e 플래그는 'erase(삭제)'를 의미하며, --test 플래그는 RPM에게 실제로 파일을 삭제하지 않고 드라이 런(dry run)을 수행하도록 지시합니다.
많은 다른 패키지들이 의존하는 핵심 시스템 패키지를 검사해 보겠습니다. glibc 패키지는 Linux 시스템의 거의 모든 프로그램에 근간이 되는 GNU C 라이브러리를 제공합니다. 어떤 패키지들이 glibc를 필요로 하는지 확인해 봅시다.
rpm -q --whatrequires glibc | tee glibc-whatrequires.txt
출력에는 glibc에 의존하는 여러 패키지가 표시됩니다.
glibc-common-2.34-168.el9_6.19.x86_64
glibc-langpack-en-2.34-168.el9_6.19.x86_64
libstdc++-11.5.0-5.el9_5.x86_64
glibc-headers-2.34-168.el9_6.19.x86_64
pam-1.5.1-23.el9.x86_64
glibc-devel-2.34-168.el9_6.19.x86_64
nscd-2.34-168.el9_6.19.x86_64
보시다시피 많은 중요한 시스템 패키지가 glibc에 의존합니다. 이제 glibc를 제거하려고 하면 어떻게 되는지 확인해 보겠습니다. 전체 시스템을 망가뜨릴 수 있는 실제 제거를 방지하기 위해 --test 플래그를 사용합니다.
sudo rpm -e --test glibc 2>&1 | tee glibc-remove-test.txt
많은 패키지가 glibc를 필요로 하기 때문에 RPM은 의존성 오류를 보고하고 제거를 차단합니다. 출력에는 실패한 의존성 목록이 길게 표시됩니다.
error: Failed dependencies:
glibc = 2.34-168.el9_6.19 is needed by (installed) glibc-common-2.34-168.el9_6.19.x86_64
glibc = 2.34-168.el9_6.19 is needed by (installed) glibc-langpack-en-2.34-168.el9_6.19.x86_64
glibc >= 2.34 is needed by (installed) libstdc++-11.5.0-5.el9_5.x86_64
... (additional dependency errors)
이제 의존성이 적은 패키지를 살펴보겠습니다. 앞서 설치한 lsscsi 패키지는 역의존성이 적은 유틸리티 패키지입니다. 무엇이 이 패키지를 필요로 하는지 확인해 봅시다.
rpm -q --whatrequires lsscsi | tee lsscsi-whatrequires.txt
lsscsi를 필요로 하는 패키지가 없음을 나타내는 출력이 표시될 것입니다.
no package requires lsscsi
lsscsi에 의존하는 패키지가 없으므로 안전하게 제거를 시뮬레이션할 수 있습니다.
sudo rpm -e --test lsscsi 2>&1 | tee lsscsi-remove-test.txt
이 명령어는 오류 없이 완료되어야 하며, 이는 lsscsi를 제거해도 시스템의 다른 패키지가 손상되지 않음을 나타냅니다.
이는 패키지 제거의 영향을 예측하고, 먼저 역의존성을 확인하여 시스템이 손상되는 것을 방지하는 방법을 보여줍니다.
rpm2cpio와 cpio를 이용한 RPM 패키지 내용 검사
이 단계에서는 설치 없이 RPM 패키지 파일의 내용을 검사하는 강력한 기술을 배웁니다. 이는 설치 전 패키지에 포함된 파일을 확인하거나, 손상되거나 삭제된 파일을 복구하기 위해 패키지에서 단일 파일을 추출할 때 유용합니다. 이 과정에는 두 가지 명령어가 포함됩니다. RPM 파일을 cpio 아카이브로 변환하는 rpm2cpio와, 그 아카이브에서 파일을 나열하거나 추출할 수 있는 cpio입니다.
/home/labex/project에서 계속 작업합니다. 먼저 검사할 실제 .rpm 파일이 필요합니다. dnf 패키지 관리자를 사용하여 bash 패키지 파일을 현재 디렉터리(/home/labex/project)로 다운로드하겠습니다. download 하위 명령어는 설치하지 않고 패키지 파일만 가져옵니다.
sudo dnf download bash
파일이 성공적으로 다운로드되었음을 나타내는 출력이 표시됩니다. 파일 이름에는 버전과 아키텍처가 포함됩니다.
Last metadata expiration check: ...
bash-<version>.<arch>.rpm
이제 ls 명령어를 사용하여 .rpm 파일이 /home/labex/project 디렉터리에 있는지 확인합니다.
ls bash-*.rpm
RPM 파일이 준비되었으므로 이제 rpm2cpio와 cpio 명령어를 함께 사용하여 내용을 나열할 수 있습니다. rpm2cpio 명령어는 RPM 파일을 읽고 cpio 아카이브를 표준 출력으로 내보냅니다. 그런 다음 이 출력을 파이프(|)를 통해 표준 입력에서 아카이브를 읽는 cpio 명령어로 전달합니다. cpio의 -t 플래그는 목차를 나열하도록 지시합니다.
rpm2cpio bash-*.rpm | cpio -t | tee bash-rpm-contents.txt
이렇게 하면 bash 패키지에 포함된 모든 파일과 디렉터리의 긴 목록이 생성됩니다. 출력은 다음과 비슷할 것입니다.
.
./etc
./etc/skel
./etc/skel/.bash_logout
./etc/skel/.bash_profile
./etc/skel/.bashrc
./usr
./usr/bin
./usr/bin/bash
./usr/bin/sh
./usr/share
./usr/share/doc
...
이 기술을 사용하면 패키지의 페이로드를 완전히 볼 수 있어, 설치할 경우 시스템에 정확히 무엇이 배치될지 확인할 수 있습니다.
요약
이 실습에서는 Linux 환경에서 RPM 유틸리티를 사용하여 소프트웨어 패키지를 관리하고 조회하는 방법을 배웠습니다. rpm -qi를 사용하여 설치된 패키지에 대한 상세 정보를 검색하고, rpm -qf를 사용하여 특정 파일이 어떤 패키지에 속하는지 식별하는 것으로 시작했습니다. 또한 rpm -qR로 패키지의 의존성을 나열하고 rpm -qc로 설정 파일의 위치를 찾는 연습을 하여 패키지가 시스템에 어떻게 통합되는지에 대한 포괄적인 시각을 얻었습니다.
이러한 조회 기술을 바탕으로 rpm -V를 사용하여 설치된 패키지 파일의 무결성을 확인하고 변경 사항을 검사하는 방법을 배웠습니다. 또한 역의존성을 안전하게 확인하고 rpm -e --test로 패키지 제거를 시뮬레이션하여 변경 없이 잠재적인 영향을 이해하는 방법도 살펴보았습니다. 마지막으로 rpm2cpio와 cpio를 사용하여 설치 전 RPM 패키지 파일의 내용을 추출하고 나열함으로써 패키지 내부를 검사하는 능력을 갖추게 되었습니다.



