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
CODE

설치나 업그레이드시 패키지 경로는 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
CODE


업그레이드

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

rpm -Uvh my-package.rpm
CODE

가능한 옵션

--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
CODE


자세한 정보 보기

목록 보기에서는 패키지의 용도나 라이선스, 홈페이지등을 알 수가 없다. -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
CODE

설치된 패키지의 정보는 위와 같이 볼 수 있지만 만약 설치하기 전에 패키지의 정보를 보고 싶을수 있다. 이 경우 -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.
CODE


패키지의 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
CODE

파일이 속한 패키지 알기

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

# rpm -qf `which httpd`

httpd-2.2.15-30.el6.centos.x86_64
CODE

위에 -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
CODE


설치 경로 보기

패키지내 어떤 파일이 어디에 설치되었는지는 -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
CODE

아직 설치하지 않은 패키지의 경우 -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
CODE


문서 파일 목록 보기

패키지내 문서 파일 목록만 보려면 -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
CODE

 

설정 파일 목록 보기 

패키지내 설정 파일 목록만 보려면 -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
CODE

 

스크립트 파일 목록 보기 

패키지내 스크립트 파일 목록만 보려면 --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
CODE

패키지의 의존성 목록 보기

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
CODE

설치전 패키지는 마찬가지로 -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)  
...
CODE

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
CODE

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
CODE

경로명으로 패키지 검증

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

# rpm -Vf `which httpd`

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

전체 패키지 검증

-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
CODE

전자서명 검증

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
CODE

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
CODE

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

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

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

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

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

  1. rpm database 를 생성한다.

    rpm --initdb --root /home/lesstif/var --dbpath /home/lesstif/var/lib/rpm
    CODE
  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
CODE


  • -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