rpm详解
-
rpm使用方法
-
rpm起源
-
rpm是什么
-
rpm命名格式
-
rpm优缺点
-
rpm获取注意
-
rpm命令使用
rpm起源
由于在linux中安装应用程序需要源码包编译安装,对于非专业人员而言难度太大,因而出现一种将源码编译好的二进制程序,库文件,配置文件,帮助文件等打包成一个或多个特定格式的程序包,而管理这类包的工具之一,则称为rpm.
rpm是什么
rpm 是 reahat package manage,最开始由redhat公司在其rhel系统上提供的程序包管理器,但是由于rpm的使用十分的方便,因此现在rpm是rpm is package manager,成为linux中通用的程序包管理器之一.
rpm命名格式
首先我们先了解一下,此类程序包的命令方法.直接上实例更加明显, php-5.4.16-21.el7.x86_64.rpm 格式为name-VERSION-rpm_release.os.arch.rpm name:程序的名称,php VERSION:程序源码包的版本号,5.4.16 rpm_release:rpm的发行号,21 os:操作系统版本,el7 arch:编译此包的cpu架构,x86_64 注:arch中有noarch,其表示此包可在任何架构平台上安装; 对于用户而言,程序能够运行则足够,但是对于某些需要在此程序上进行二次开发,或者添加额外组件的专业人员,那该怎么办呢? 因此rpm有一个拆包的机制,将一个程序分为主包跟其子包来管理,一般用户只需要安装主程序就能稳定使用,专业人员根据自己需求去安装其它子包.以下来看看哪些是子包, openssl-1.0.1e-34.el7.x86_64 openssl-devel-1.0.1e-34.el7.x86_64 openssl-libs-1.0.1e-34.el7.x86_64 子包格式为application-function-VERSION-rpm_release.os.arch.rpm function:该程序的某功能组件 常见的有:libs-->库文件 utils-->工具程序 devel-->开发组件
rpm优缺点
优点
为了更好的管理程序包的安装,卸载,更新和查询等操作,rpm提供 1.rpm包的组成文件列表(每个rpm包所必有的) 2.rpm包安装或卸载时的脚本信息 3.公共数据库保存 程序包的名称和版本 依赖关系 功能说明 安装生成的各文件的文件路径及校验码信息 等信息
缺点
1 rpm包都是在特定环境定制的,因此对安装环境有所要求. 2 在linux中,各程序之间的依赖关系由作者所设计,但由于程序包多种多样,其依赖关系则非常的复杂,如果安装一个应用程序,它会需要很多其它程序,才能正常运行起来,在安装中很常见.因此这在rpm中是个弊端.
rpm获取注意
由于rpm包是源码编译再将其打包,则rpm包也随处可见,任何人都能够进行发布rpm包.我们所需注意的是 1.包的来源性 2.包的完整性
rpm命令使用
rpm作用有:安装,卸载,更新,查询,校验常用功能
rpm RPM Package Manager rpm包管理器 rpm [options] PACKAGE_FILE ... 基本选项: --version:显示RPM版本号 -v:显示操作过程详细信息 -vv:显示更加详细的信息
安装格式:
rpm {-i|--install} [install-options] PACKAGE_FILE ...
-i:安装
-h:hash,以#表示安装进度
--force:强制安装
--nodeps:不检查包的依赖关系
--test:不安装,简单的检查和报告可能的冲突
--replacepkgs:覆盖安装
example:
安装rpm包,时会因依赖关系而无法安装,若想忽略依赖关系安装,则需使用--nodeps
]# rpm -ivh httpd-2.2.15-53.el6.centos.x86_64.rpm
error: Failed dependencies:
apr-util-ldap is needed by httpd-2.2.15-53.el6.centos.x86_64
httpd-tools = 2.2.15-53.el6.centos is needed by httpd-2.2.15-53.el6.centos.x86_64
libdb-4.7.so()(64bit) is needed by httpd-2.2.15-53.el6.centos.x86_64
libpcre.so.0()(64bit) is needed by httpd-2.2.15-53.el6.centos.x86_64
忽略依赖关系并安装
]# rpm -ivh --nodeps httpd-2.2.15-53.el6.centos.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:httpd-2.2.15-53.el6.centos ################################# [100%]
卸载格式:
rpm {-e|--erase} {ERASE OPTIONS} PACKAGE_NAME ...
-e:卸载
--nodeps:不检查包的依赖关系
--test:测试卸载,跟-vv连用
--allmatches:删除此包所有的版本
注:如果程序包的配置文件被修改过,卸载时,此文件通常不会被删除,而是被重命名(加后缀.rpmsave)后留存.
还需要注意卸载时,不要加.rpm后缀,因为安装完成之后,就不是以rpm结尾的包.
建议:尽量不要卸载程序,只要不启用就可以,以免由依赖关系所引起不必要的麻烦.
example:
卸载tcsh的rpm包
]# rpm -e tcsh-6.17-24.el6.x86_64
]#
更新格式:
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
-U:升级或安装(如果不存在旧文件,直接安装最新包)
-F:升级(如果旧文件不存在,则什么都不做)
--oldpackage:降级到旧版本
--force:有冲突时强制升级
--nodeps:不检查包的依赖关系
--test:不安装,简单的检查和报告可能的冲突
注意:(1) 不要对内核做升级操作;Linux支持多内核版本并存,因此,直接安装新版本内核;同样不要对python进行升级.
(2) 如果某原程序包的配置文件安装后曾被修改过,升级时,新版本的程序提供的同一个配置文件不会覆盖原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供;
example:
(只是为做演示,是rpm的发行号更新)
1 旧版本httpd升级为新版本httpd
]# rpm -Uvh --nodeps --oldpackage httpd-2.2.15-53.el6.centos.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:httpd-2.2.15-55.el6.centos.2 ################################# [ 50%]
Cleaning up / removing...
2:httpd-2.2.15-53.el6.centos ################################# [100%]
2 新版本降级到旧版本
]# rpm -Uvh --nodeps --oldpackage httpd-2.2.15-53.el6.centos.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:httpd-2.2.15-53.el6.centos ################################# [ 50%]
Cleaning up / removing...
2:httpd-2.2.15-55.el6.centos.2 ################################# [100%]
查询格式:
rpm {-q|--query} [select-options] [query-options] [PACKAGE_FILE ...]
-q:是否安装指定的程序包
select-options
-a:查看所有已经安装的包
-f:查看某个文件自己的安装包,/path/to/file
-p:查看没有安装的包
query-option
--changelog:查看程序包的变化信息
-i,--info:查看包的详细信息
-c:查看包的配置文件
-l:查看包安装的文件列表
-d:查看包安装的帮助文件列表
--dump:查看包文件列表元数据的详细信息
--provides:查看包的capabilities
--requires:查看包所依赖的capabilities
--scripts:查看包安装或卸载时执行的脚本
此类脚本有四种:
preinstall:安装过程开始之前执行的脚本
postinstall:安装过程完成之后执行的脚本
preuninstall:卸载开始之前执行的脚本
postuninstall:卸载之后执行的脚本
Capabilities:即该包能够提供的能力(例如:httpd能提供web server的能力)
example:
1 查看httpd是否已经安装
]# rpm -q httpd
httpd-2.2.15-55.el6.centos.2.x86_64
2 查看系统上所有以安装的rpm包
]# rpm -qa
gcc-4.8.2-16.el7.x86_64
policycoreutils-2.2.5-11.el7.x86_64
cairomm-1.10.0-8.el7.x86_64
...
3 查看安装/usr/sbin/httpd的rpm包
]# rpm -qf /usr/sbin/httpd
httpd-2.2.15-55.el6.centos.2.x86_64
4 查看尚未安装的包
]# rpm -qp httpd-2.2.15-53.el6.centos.x86_64.rpm
httpd-2.2.15-53.el6.centos.x86_64
5 查看httpd包的版本修改日志
]# rpm -q --changelog httpd
* Fri Nov 18 2016 Johnny Hughes <johnny@centos.org> - 2.2.15-54.2
- Roll in CentOS Branding
6 查看httpd包所安装的所有文件清单
]# rpm -ql httpd
/etc/httpd/conf.d/welcome.conf
/etc/httpd/conf/httpd.conf
/etc/httpd/conf/magic
/etc/logrotate.d/httpd
...
7 查看httpd包的详细信息
]# rpm -qi httpd
Name : httpd
Version : 2.2.15
Release : 55.el6.centos.2
Architecture: x86_64
...
The Apache HTTP Server is a powerful, efficient, and extensible web server.
8 查看httpd包提供的capabilities
config(httpd) = 2.2.15-55.el6.centos.2
httpd-mmn = 20051115
httpd-suexec = 2.2.15-55.el6.centos.2
mod_actions.so()(64bit)
...
webserver
httpd = 2.2.15-55.el6.centos.2
httpd(x86-64) = 2.2.15-55.el6.centos.2
9 查询httpd包所依赖的capabilities
]# rpm -q --requires httpd
/bin/bash
/bin/sh
...
rtld(GNU_HASH)
system-logos >= 7.92.1-1
rpmlib(PayloadIsXz) <= 5.2-1
10 查询httpd包安装及卸载时所执行的脚本
]# rpm -q --scripts httpd
preinstall scriptlet (using /bin/sh):
# Add the "apache" user
getent group apache >/dev/null || groupadd -g 48 -r apache
...
preuninstall scriptlet (using /bin/sh):
if [ $1 = 0 ]; then
...
/sbin/service httpd condrestart >/dev/null 2>&1 || :
技巧使用:
一般当安装出现缺少某库时,可以使用-qf来查询此库由哪个程序包所提供,进而解决.
例如:
当安装时出现缺少,liblogin.so.2库时:
# find / -name "liblogin.so.2"|xargs rpm -qf
cyrus-sasl-plain-2.1.23-13.el6_3.1.x86_64
校验格式:
rpm {-V|--verify} [select-options] [verify-options]
-V:检查包安装之后生成的文件是否发生了改变
如果没有输出结果,则
当有结果输出时,则根据下面查询对应原因:
S file Size differs
M Mode differs (includes permissions and file type)
5 digest (formerly 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
P caPabilities differ
S:文件大小改变
M:文件权限和类型发生改变
5:MD5这一种指纹码内容改变
D:设备主/次号改变
L:Link路径改变
U:文件所属人改变
G:文件所属组改变
T:文件修改时间改变
p:文件的Capabilities发生改变
example:
在httpd所安装的文件中添加一个数
echo 1 >> /etc/httpd/conf/httpd.conf
大小改变,MD5码改变,文件修改时间改变
# rpm -V --nodeps httpd
S.5....T. c /etc/httpd/conf/httpd.conf
包来源合法性验证和完整性验证:
获取并导入信任的包制造者的公匙:
对于CentOS发行版其命令
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-#
导入公匙之后时,会进行自动验证其完整性
也可手动验证:
rpm {-K|--checksig} PACKAGE_FILE...
数据库重建:
rpm的数据库路径:/var/lib/rpm/
查询通过此数据库进行
centos 6 获取帮助: man rpm
centos 7 获取帮助: man rpmdb
rpm {--initdb|--rebuilddb}[--dbpath DIRECTORY] [--root DIRECTORY]
--initdb:初始化数据库;当前系统中无数据库时,创建一个新的数据库;
--rebuildb:通过读取当前系统已安装的包,重新构建一个数据库;
--dbpath DIRECTORY:指定数据库安装路径
--root DIRECTORY:指明所在根目录
example:
在/tmp/rpm下创建一个数据库
# rpm --initdb --dbpath /tmp/rpm
# ls /tmp/rpm
__db.001 __db.002 __db.003 __db.004 Packages
当数据库损坏时,进入/tmp/rpm目录下,执行以下命令
# rpm --rebuilddb
# rpm --initdb
原创文章,作者:N25_sadan,如若转载,请注明出处:http://www.178linux.com/64508

