rpm command 정리 및 사용법

rpm 명령어와 사용법 정리


주요 명령어와 옵션

rpm 은 command 와 option 으로 이루어져 있고 command 마다 별도의 옵션을 지정해 줄 수 있다.  GNU 의 옵션 처리기인 getopt 를 사용하므로 간단 옵션(short option)과 긴 옵션(long option) 둘 다를 지원한다.

다음은 주요 명령어를 표로 정리한 것이다.

주요 명령어 도표

명령어long 명령어용도
-q--query패키지 정보 질의
-i--install패키지 설치
-U--upgrade패키지 업그레이드
-e--erase패키지 삭제
-V--verify패키지 검증
-K--checksig서명 검증


General options

명령어마다 mode가 다르므로 사용할 수있는 별도의 옵션이 있지만 일반적으로 사용할 수 있는 옵션들이 있다. 아마 가장 많이 사용하는 옵션은 -v 일 것이다.

  • -?, --help : 도움말 출력
  • --version : rpm 버전 출력
  • -v : 자세한 정보 출력
  • -vv : 디버깅용 정보 출력
  • --dbpath DIRECTORY_PATH: rpm 데이타베이스 파일 경로 설정. 기본 경로는 /var/lib/rpm 
  • --root DIRECTORY_PATH: 파일 시스템의 루트 디렉터리 경로 설정. rpm 을 사용자 디렉터리에 설치했을 경우등에 유용함. 기본 경로는 /
  • --pipe CMD: rpm 명령어의 출력을 CMD 명령어로 전송

설치 및 업그레이드

설치(-i)와 업그레이드(-U) 모드에 주로 사용하는 추가 옵션은 vh 이며 의미는 다음과 같다.

  • -v : verbose 자세한 정보 출력
  • -h: print hash marks: 설치 진행 상황을 # 문자를 이용하여 출력한다.

설치

-ivh 옵션뒤에 설치할 패키지 파일명을 적어준다. 만약 의존성 있는 프로그램이나 라이브러리가 없을 경우 설치가 실패한다.

설치
rpm -ivh gzip-1.3.12-19.el6_4.x86_64.rpm

설치나 업그레이드시 패키지 경로는 URL 도 가능하다. 다음은 URL 에서 rpm 으로 바로 설치하는 예제이다.

rpm -ivh http://mirror.centos.org/centos/6/os/x86_64/Packages/gzip-1.3.12-19.el6_4.x86_64.rpm


업그레이드

기존에 설치된 my-package보다 업그레이드된 my-package.rpm 을 설치한다.

rpm -Uvh my-package.rpm

가능한 옵션

--nodeps

rpm 은 기본적으로 의존성을 확인하므로 의존성 있는 패키지가 설치되지 않았을 경우 설치나 업그레이드가 안 될수 있다. --nodeps 옵션을 지정하면 의존성을 확인하지 않으므로 통과하게 된다.

--replacepkgs

패지키가 이미 설치되어 있으면 rpm 은 설치를 거부하나 이 옵션을 추가하면 설치를 진행한다.

--replacefiles

설치하려는 패키지가 기존에 설치된 패키지의 파일을 교체하는 경우 rpm 은 설치를 거부하나 이 옵션을 추가하면 설치를 진행한다.

--oldpackage

업그레이드 옵션(-U) 으로 패키지 설치시 설치하려는 버전이 기존에 설치된 버전보다 낮으면 설치를 진행하지 않는다. --oldpackage 옵션을 사용하면 버전이 낮아도 설치되므로 패키지 downgrade 시 유용하다.

--force

위에서 설명한 --replacepkgs, --replacefiles, 그리고 --oldpackage 세 개 옵션을 사용한 것과 동일하다. 패키지 다운그레이드나 강제 재설치등에 사용할 수 있으나 기존 파일을 덮어쓰므로 주의해야 한다.


RPM Query

-q, --query 옵션은 패키지의 정보를 질의하는 메인 명령어이다. 여러 가지 하위 옵션이 있으므로 다양한 질의를 사용할 수 있다.

 

전체 설치 패키지 보기

시스템에 설치된 전체 패키지의 목록을 보려면 -a 옵션을 추가하면 된다.

# rpm -qa |less
 
biosdevname-0.5.0-2.el6.x86_64
libssh2-1.4.2-1.el6.x86_64
filesystem-2.4.30-3.el6.x86_64


자세한 정보 보기

목록 보기에서는 패키지의 용도나 라이선스, 홈페이지등을 알 수가 없다. -i (--info) 옵션을 추가하면 자세한 정보를 볼 수 있다.

# rpm -qi httpd 
Name        : httpd                        Relocations: (not relocatable)
Version     : 2.2.15                            Vendor: CentOS
Release     : 30.el6.centos                 Build Date: Fri Apr  4 08:57:21 2014
Install Date: Fri May 23 15:56:20 2014         Build Host: c6b10.bsys.dev.centos.org
Group       : System Environment/Daemons    Source RPM: httpd-2.2.15-30.el6.centos.src.rpm
Size        : 3076415                          License: ASL 2.0

설치된 패키지의 정보는 위와 같이 볼 수 있지만 만약 설치하기 전에 패키지의 정보를 보고 싶을수 있다. 이 경우 -p 옵션뒤에 패키지 명을 기술하면 설치전 패키지의 정보를 출력한다. 

# rpm -qpi httpd-2.2.15-29.el6.centos.x86_64.rpm 

Name        : httpd                        Relocations: (not relocatable)
Version     : 2.2.15                            Vendor: CentOS
Release     : 29.el6.centos                 Build Date: Wed Aug 14 02:30:33 2013
Install Date: (not installed)               Build Host: c6b8.bsys.dev.centos.org
Group       : System Environment/Daemons    Source RPM: httpd-2.2.15-29.el6.centos.src.rpm
Size        : 3076447                          License: ASL 2.0
Signature   : RSA/SHA1, Wed Aug 14 02:32:39 2013, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
URL         : http://httpd.apache.org/
Summary     : Apache HTTP Server
Description :
The Apache HTTP Server is a powerful, efficient, and extensible
web server.


패키지의 change log 보기 

패키지 업그레이드시 어떤 부분이 변경되었는지 궁금할 경우가 있다. --changelog 옵션을 사용하면 패키지의 개정 이력을 확인할 수 있다. 특정 버그나 보안 문제때문에 패키지를 업그레이드할 경우등에 유용하게 사용할 수 있다.

다음 명령어는 2014년 큰 이슈가 되었던 openssl 의 HeartBleed 버그를 해결했는지 확인하기 위한 명령어다.

openssl 패키지의 변경 로그 보기
# rpm -q --changelog openssl
 
* Mon Apr 07 2014 Tomáš Mráz <tmraz@redhat.com> 1.0.1e-16.7
- fix CVE-2014-0160 - information disclosure in TLS heartbeat extension
* Tue Jan 07 2014 Tomáš Mráz <tmraz@redhat.com> 1.0.1e-16.4
- fix CVE-2013-4353 - Invalid TLS handshake crash
* Mon Jan 06 2014 Tomáš Mráz <tmraz@redhat.com> 1.0.1e-16.3
- fix CVE-2013-6450 - possible MiTM attack on DTLS1
* Fri Dec 20 2013 Tomáš Mráz <tmraz@redhat.com> 1.0.1e-16.2
- fix CVE-2013-6449 - crash when version in SSL structure is incorrect

파일이 속한 패키지 알기

패키지의 내용과 설치 경로를 알수 있지만 반대로 어떤 프로그램이나 파일이 어떤 패키지로부터 설치되었는지 궁금할 수도 있다.  이럴 경우 -f ,–file 옵션을 추가하면 파일이 포함된 패키지를 알 수 있다.

# rpm -qf `which httpd`

httpd-2.2.15-30.el6.centos.x86_64

위에 -d 옵션을 추가하면 해당 패키지에 포함된 문서의 설치 경로를 볼 수 있다.

# rpm -qdf `which httpd`            

/usr/share/doc/httpd-2.2.15/ABOUT_APACHE
/usr/share/doc/httpd-2.2.15/CHANGES
/usr/share/doc/httpd-2.2.15/LICENSE
/usr/share/doc/httpd-2.2.15/NOTICE
/usr/share/doc/httpd-2.2.15/README


설치 경로 보기

패키지내 어떤 파일이 어디에 설치되었는지는 -l (–list) 옵션을 추가하면 된다.

# rpm -ql httpd

/etc/httpd
/etc/httpd/conf
/etc/httpd/conf.d
/etc/httpd/conf.d/README
/etc/httpd/conf.d/welcome.conf

아직 설치하지 않은 패키지의 경우 -p 옵션뒤에 패키지명을 기술하면 설치될 전체 경로를 알수 있다.

# rpm -qpl httpd-2.2.15-29.el6.centos.x86_64.rpm  

/etc/httpd
/etc/httpd/conf
/etc/httpd/conf.d
/etc/httpd/conf.d/README
/etc/httpd/conf.d/welcome.conf
/etc/httpd/conf/httpd.conf
/etc/httpd/conf/magic
/etc/httpd/logs


문서 파일 목록 보기

패키지내 문서 파일 목록만 보려면 -d (–docfiles) 옵션을 사용한다. 소스 rpm 파일내 %doc 에 있는 목록과 동일하다.

# rpm -qd httpd   
  
/usr/share/doc/httpd-2.2.15/ABOUT_APACHE
/usr/share/doc/httpd-2.2.15/CHANGES
/usr/share/doc/httpd-2.2.15/LICENSE
/usr/share/doc/httpd-2.2.15/NOTICE
/usr/share/doc/httpd-2.2.15/README

 

설정 파일 목록 보기 

패키지내 설정 파일 목록만 보려면 -c (–configfiles) 옵션을 사용한다. 소스 rpm 파일내 %config에 있는 목록과 동일하다. 

# rpm -qc httpd 

/etc/httpd/conf.d/welcome.conf
/etc/httpd/conf/httpd.conf
/etc/httpd/conf/magic
/etc/logrotate.d/httpd
/etc/sysconfig/htcacheclean
/etc/sysconfig/httpd
/var/www/error/HTTP_BAD_GATEWAY.html.var

 

스크립트 파일 목록 보기 

패키지내 스크립트 파일 목록만 보려면 --scripts 옵션을 사용한다. 소스 rpm 파일내 %pre, %post, %preun, 그리고 %postun에 있는 목록과 동일하다.

# rpm -q --scripts httpd

preinstall scriptlet (using /bin/sh):
# Add the "apache" user
getent group apache >/dev/null || groupadd -g 48 -r apache
getent passwd apache >/dev/null || \
  useradd -r -u 48 -g apache -s /sbin/nologin \
    -d /var/www -c "Apache" apache
exit 0
postinstall scriptlet (using /bin/sh):
# Register the httpd service
/sbin/chkconfig --add httpd

패키지의 의존성 목록 보기

rpm 의 장점인 의존성 관리 기능이다. -R, --requires 옵션을 이용하면 패키지를 설치하려면 필요한 의존성 목록을 확인할 수 있다.

# rpm -qR mod_ssl       

/bin/cat  
/bin/sh  
config(mod_ssl) = 1:2.2.15-30.el6.centos
httpd  
httpd = 0:2.2.15-30.el6.centos
httpd-mmn = 20051115
libc.so.6()(64bit)  
libc.so.6(GLIBC_2.2.5)(64bit)  
libc.so.6(GLIBC_2.3.4)(64bit)  
libc.so.6(GLIBC_2.4)(64bit)  
libcrypto.so.10()(64bit)  
libcrypto.so.10(OPENSSL_1.0.1)(64bit)  
libcrypto.so.10(libcrypto.so.10)(64bit)  
libssl.so.10()(64bit)  
libssl.so.10(libssl.so.10)(64bit)  
openssl >= 0.9.7f-4
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rtld(GNU_HASH)  
rpmlib(PayloadIsXz) <= 5.2-1

설치전 패키지는 마찬가지로 -p 옵션을 추가하여 의존성 정보를 확인할 수 있다.

# rpm -qRp mod_ssl-2.2.15-29.el6.centos.x86_64.rpm 

/bin/cat  
/bin/sh  
config(mod_ssl) = 1:2.2.15-29.el6.centos
httpd  
httpd = 0:2.2.15-29.el6.centos
httpd-mmn = 20051115
libc.so.6()(64bit)  
...

Verify 

대문자 -V 명령을 사용하면 패키지를 검증할 수 있다. 


설치 검증

설치한 패키지가 원래 패키지와 어떻게 다른지 확인할 수 있다. 다음 명령은 httpd 패키지가 설치후 어떻게 변경되었는지 표시해 준다. 왼쪽 항목의 의미는 다음과 같다.

  • S file Size differs
  • M Mode differs (includes permissions and file type)
  • 5 MD5 sum differs
  • D Device major/minor number mismatch
  • L readlink(2) path mismatch
  • U User ownership differs
  • G Group ownership differs
  • T mTime differs
# rpm -V httpd                                  

S.5....T.  c /etc/httpd/conf/httpd.conf
..?......    /usr/sbin/suexec
.M.......    /var/log/httpd

httpd.conf 가 설치후 수정되어서 사이즈(S)와 MD5 해쉬값(5)이 달라졌고 수정(T)되었으므로 mTime 이 변경되었다. -p 옵션을 추가하고 패키지의 절대 경로를 입력하면 해당 패키지와 현재 설치된 패키지를 비교해 준다.

다음은 현재 시스템은  httpd-2.2.15-30이 설치되어 있는데 httpd-2.2.15-29 패키지로 검증했을 경우 결과이다. 마이너 버전이 다르므로 MD5 해쉬값과 변경날자가 다르다고 표시된다

# rpm -Vp httpd-2.2.15-29.el6.centos.x86_64.rpm 

Unsatisfied dependencies for httpd-2.2.15-29.el6.centos.x86_64:
        httpd-tools = 2.2.15-29.el6.centos is needed by httpd-2.2.15-29.el6.centos.x86_64
.......T.    /etc/httpd/conf.d/README
.......T.  c /etc/httpd/conf.d/welcome.conf
S.5....T.  c /etc/httpd/conf/httpd.conf
.......T.  c /etc/httpd/conf/magic
.......T.  c /etc/logrotate.d/httpd
.......T.    /etc/rc.d/init.d/htcacheclean
.......T.    /etc/rc.d/init.d/httpd
.......T.  c /etc/sysconfig/htcacheclean
.......T.  c /etc/sysconfig/httpd
..5....T.    /usr/lib64/httpd/modules/mod_actions.so
..5....T.    /usr/lib64/httpd/modules/mod_alias.so
..5....T.    /usr/lib64/httpd/modules/mod_asis.so
..5....T.    /usr/lib64/httpd/modules/mod_auth_basic.so
..5....T.    /usr/lib64/httpd/modules/mod_auth_digest.so
..5....T.    /usr/lib64/httpd/modules/mod_authn_alias.so
..5....T.    /usr/lib64/httpd/modules/mod_authn_anon.so

경로명으로 패키지 검증

-f 옵션을 추가하면 특정 경로에 있는 프로그램이나 파일이 속한 패키지의 변경 내역을 확인할 수 있다. 다음은 httpd 패키지를 검증한다.

# rpm -Vf `which httpd`

S.5....T.  c /etc/httpd/conf/httpd.conf
..?......    /usr/sbin/suexec
.M.......    /var/log/httpd

전체 패키지 검증

-Va 옵션으로 시스템에 설치된 전체 패키지중 변경된 파일을 검증할 수 있다.

# rpm -Va 
 
prelink: /usr/bin/vim: at least one of file's dependencies has changed since prelinking
S.?......    /usr/bin/vim
prelink: /usr/sbin/powertop: at least one of file's dependencies has changed since prelinking
S.?......    /usr/sbin/powertop
prelink: /usr/bin/unzip: at least one of file's dependencies has changed since prelinking
S.?......    /usr/bin/unzip

전자서명 검증

rpm 포맷은 전자서명을 첨부할 수 있으므로 위변조 여부를 확인할 수 있다. 검증은 -K 옵션으로 수행할 수 있다.

# rpm -K  gcc-4.4.7-4.el6.x86_64.rpm

gcc-4.4.7-4.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK

rpm 패키지가 위변조 되었을 경우 다음과 같이 에러가 발생한다.

# rpm -K mod_ssl-2.2.15-29.el6.centos.x86_64.rpm 

mod_ssl-2.2.15-29.el6.centos.x86_64.rpm: rsa sha1 (MD5) PGP MD5 NOT OK

다른 벤더가 서명했는데 서명자의 검증용 키가 없을 경우도 검증이 실패하게 된다. 이럴 경우 검증용 키를 구한후에 --import 명령으로 rpm 에 추가해야 한다.

rpm --import /usr/share/rhn/RPM-GPG-KEY

사용자 계정으로 rpm 패키지 설치

root 권한이 없는 시스템에서 작업하는데 필요한 패키지가 설치되어 있지 않을 경우가 있다.

고객사 시스템등 root 권한 요청이 어려운 경우 사용자 계정으로 rpm db 를 생성하고 필요한 패키지를 설치하고 작업할 수 있다. 

  1. rpm database 를 생성한다.

    rpm --initdb --root /home/lesstif/var --dbpath /home/lesstif/var/lib/rpm
  2. -ivh 옵션으로 패키지(ex: make-3.82.rpm)를 설치한다. 주의할 점은 --root 와 --dbpath, --relocate 옵션을 추가해야 한다.

rpm --root /home/lesstif/var --dbpath /home/lesstif/var/lib/rpm \
 --relocate /usr=/home/lesstif/var --nodeps -ivh gcc*.rpm


  • -r, --root=DIR :  use ROOT as top level directory (default:"/")

  • --dbpath=DIR :  use database in DIRECTORY
  • --relocate=<old>=<new>:     relocate files from path <old> to <new>




같이 보기

Ref