Jeff Notes

rpm命令详解

系统版本:

[root@centos71d1 ~]# cat /etc/redhat-release 
CentOS Linux release 7.1.1503 (Core) 
[root@centos71d1 ~]# uname -r
3.10.0-229.el7.x86_64

 
rpm命令用于在Linux系统中查询、安装、升级、卸载、校验程序包,以及维护rpm数据库。

 

基本命令


语法:

rpm OPTIONS PACKAGE_FILE

OPTIONS:

查询


语法:

rpm { -q | --query } [select-options] [query-options]

 
[select-options]

[query-options]

 
示例:

[root@centos71d1 ~]# rpm -ivh zsh-5.0.2-28.el7.x86_64.rpm

[root@centos71d1 ~]# rpm -q zsh
zsh-5.0.2-28.el7.x86_64
#查询是否已经安装了zsh这个程序包,如果已经安装,则显示程序名和版本

[root@centos71d1 ~]# rpm -qa
#查询系统中已安装的所有的程序包

[root@centos71d1 ~]# rpm -qa | grep "^z"
zlib-1.2.7-13.el7.x86_64
zip-3.0-11.el7.x86_64
zsh-5.0.2-28.el7.x86_64
#查询系统中已安装的以“z”开头的程序包

[root@centos71d1 ~]# rpm -qf /etc/fstab 
setup-2.8.71-5.el7.noarch
#查询文件的来源

[root@centos71d1 ~]# rpm -q --changelog bash | less
#查询bash的程序包(rpm包)的changelog

[root@centos71d1 ~]# rpm -ql bash
#查询bash程序包安装生成的文件列表

[root@centos71d1 ~]# rpm -qi bash
#查询bash这个程序包的详细信息

[root@centos71d1 ~]# rpm -qc bash
/etc/skel/.bash_logout
/etc/skel/.bash_profile
/etc/skel/.bashrc
#查询bash程序包提供了哪些配置文件

[root@centos71d1 ~]# rpm -qd bash
#查询bash程序包提供了哪些文档

[root@centos71d1 ~]# rpm -q --provides bash
/bin/bash
/bin/sh
bash = 4.2.46-12.el7
bash(x86-64) = 4.2.46-12.el7
config(bash) = 4.2.46-12.el7
#查询bash程序包提供了哪些capability

[root@centos71d1 ~]# rpm -q --whatprovides bash
bash-4.2.46-12.el7.x86_64
#查询哪个程序包提供了“bash”这个capability

[root@centos71d1 ~]# rpm -q --whatrequires bash
initscripts-9.49.24-1.el7.x86_64
dracut-033-240.el7.x86_64
rsyslog-7.4.7-7.el7_0.x86_64
lvm2-2.02.115-3.el7.x86_64
bash-completion-2.1-6.el7.noarch
bash-completion-extras-2.1-11.el7.noarch
#查询哪些程序包需要依赖bash程序包

[root@centos71d1 ~]# rpm -qR bash
#查询bash程序包需要依赖哪些capability

[root@centos71d1 ~]# rpm -q --scripts bash
#查询bash程序包携带的安装脚本

[root@centos71d1 ~]# rpm -qpi zsh-5.0.2-28.el7.x86_64.rpm
#查询还未安装的zsh程序包的详细信息

[root@centos71d1 ~]# rpm -qpl zsh-5.0.2-28.el7.x86_64.rpm
#查询还未安装的zsh程序包,安装后将生成哪些文件

 

安装


语法:

rpm { -i | --install } [install-options] PACKAGE_FILE …

 
[general-options]

[install-options]

 
示例:

[root@centos71d1 ~]# mount -r /dev/cdrom /media/
#挂载centos7.1安装光盘

[root@centos71d1 ~]# cd /media/Packages/
[root@centos71d1 Packages]# rpm -ivh zsh-5.0.2-7.el7.x86_64.rpm
#安装zsh,显示安装信息,hash marks输出进度条

[root@centos71d1 Packages]# rpm -ivvh zsh-5.0.2-7.el7.x86_64.rpm
#安装zsh,hash marks输出进度条,显示更详细的安装信息

[root@centos71d1 Packages]# rpm -q zsh
zsh-5.0.2-7.el7.x86_64
#查询已安装的zsh包
[root@centos71d1 Packages]# rpm -ql zsh | less
#查询安装zsh生成的所有文件的列表

[root@centos71d1 Packages]# rpm -e zsh
#卸载zsh

[root@centos71d1 Packages]# rpm -ivh --test php-common-5.4.16-23.el7_0.3.x86_64.rpm 
error: Failed dependencies:
libzip.so.2()(64bit) is needed by php-common-5.4.16-23.el7_0.3.x86_64
#安装测试,测试安装冲突或依赖关系

[root@centos71d1 Packages]# rpm -ivh --nodeps php-common-5.4.16-23.el7_0.3.x86_64.rpm
#忽略依赖关系安装,安装完成后,不一定可以使用

#假如修改了某工具的配置文件,无法复原,可以这样做:
#1. 删除该配置文件
#2. 覆盖安装
[root@centos71d1 Packages]# rm -f /etc/zshrc 
[root@centos71d1 Packages]# rpm -ivh --replacepkgs zsh-5.0.2-7.el7.x86_64.rpm

 

升级


语法:

rpm { -U | --upgrade } [install-options] PACKAGE_FILE …
rpm { -F | --freshen } [install-options] PACKAGE_FILE …

OPTIONS:

 
注意:

  1. 不要对内核做升级操作,Linux支持多内核版本并存,可直接安装新版本内核
  2. 如果某原程序包的配置文件安装后曾被修改过,升级时,新版本的程序提供的同一个配置文件不会覆盖原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供

 
示例:

[root@centos71d1 ~]# rpm -q zsh
zsh-5.0.2-7.el7.x86_64

[root@centos71d1 ~]# wget http://mirror.centos.org/centos/7/os/x86_64/Packages/\
zsh-5.0.2-28.el7.x86_64.rpm

[root@centos71d1 ~]# rpm -Uvh zsh-5.0.2-28.el7.x86_64.rpm

 

卸载


语法:

rpm { -e | --erase } [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME …

OPTIONS:

示例:

[root@centos71d1 ~]# rpm -e zsh
#卸载zsh;卸载只需要指定包名,而安装,需要指定包文件

 

校验


语法:

rpm { -V | --verify } [select-options] [verify-options]

代码:

 
示例:

[root@centos71d1 ~]# rpm -ql zsh
/usr/share/zsh/5.0.2/functions/zfput
....

[root@centos71d1 ~]# file /usr/share/zsh/5.0.2/functions/zfput
/usr/share/zsh/5.0.2/functions/zfput: ASCII text

[root@centos71d1 ~]# vim /usr/share/zsh/5.0.2/functions/zfput
#往zfput文件添加任意内容

[root@centos71d1 ~]# rpm -V zsh
S.5....T.    /usr/share/zsh/5.0.2/functions/zfput
#对zsh程序包生成的所有文件执行校验,发现zfput文件发生改变;S表示大小,5表示md5,T表示修改时间

 

来源合法性和完整性验证

获取并导入信任的包制作者密钥:

对于CentOS发行版:rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

验证:

  1. 安装此组织签名的程序时,会自动执行验证
  2. 手动验证: rpm -K PACKAGE_FILE

 
示例:

[root@centos71d1 ~]# rpm -e zsh
[root@centos71d1 ~]# rpm --import /media/RPM-GPG-KEY-CentOS-7
or [root@centos71d1 ~]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#导入centos7安装光盘上的程序包(rpm包)制作者的公钥,\
#可以验证安装光盘中提供的程序包的来源合法性和完整性;\
#通常该公钥也随系统的安装保存在/etc/pki/rpm-gpg目录中

[root@centos71d1 ~]# rpm -ivh zsh-5.0.2-28.el7.x86_64.rpm 
Preparing...                          ################################# [100%]
Updating / installing...
   1:zsh-5.0.2-28.el7                 ################################# [100%]
#导入公钥之后,在安装程序包时,就不会有警告提示

[root@centos71d1 ~]# rpm -K zsh-5.0.2-28.el7.x86_64.rpm 
zsh-5.0.2-28.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
#也可手动验证程序包文件的来源合法性和完整性

 

数据库维护


rpm管理器数据库路径: /var/lib/rpm

语法:

rpm { --initdb | --rebuilddb } [--dbpath DIRECTORY] [--root DIRECTORY]

获取帮助:

选项: