标签:rpm包
目录:
1. RPM简介
2. RPM包获取方式
3. RPM包安装
4. RPM包卸载
5. RPM包升级
6. RPM包查询
7. RPM包校验
8. RPM数据库重建
1.简介:
RPM软件包管理器, RPM (原Red Hat Package Manager),现在被很多Linux发行版使用,现在就叫 RPM Package Manager
是一种二进制包管理器,可以完成软件安装、卸载、升级、查询、校验等操作。
2. RPM包获取方式
获取rpm包的途径:
众所周知,网上鱼龙混杂,随意下载到的rpm包可能会被人恶意篡改,而对系统安全产生威胁,我们需要找到一些靠谱的方式来找到权威的rpm包提供者,下面三种方式比较靠谱:
2.1 发行的光盘或站点服务器:
镜像:
http://mirrors.163.com
http://mirrors.sohu.com
http://mirrors.aliyun.com
...
很多高校也建立了开源镜像站点,可以供我们使用。
2.2 项目的官网
例如:http://www.zsh.org/
从官网可以看到源代码,并且可以下载到rpm包
2.3 很多第三方机构或个人制作并公开发布许多rpm包,例如:
一个可靠的途径: EPEL(Extra Packages for Enterprise Linux)
是由Fedora community来维护的,这里不详细叙述使用EPEL
使用文档可以参见: http://fedoraproject.org/wiki/EPEL
3. RPM包安装
当我们拿到来源可靠的RPM包后,接下来就是安装RPM包了,RPM的安装依靠rpm命令完成,语法如下:
rpm [option] /path/to/package_file #这里要指定RPM包的路径
3.1 -i: install,安装rpm包
当我们仅用 rpm -i 来安装某包时候,比如我们安装zsh包
前提: 我们使用光盘作为rpm包源 先用:
mount /dev/cdrom /media/cdrom #将光盘挂载到/media/cdrom下
ls /media/cdrom #看下光盘目录结构:
-r--r--r--. 2 root root 14 Nov 29 2013 CentOS_BuildTag
dr-xr-xr-x. 3 root root 2048 Nov 29 2013 EFI
-r--r--r--. 2 root root 212 Nov 27 2013 EULA
-r--r--r--. 2 root root 18009 Nov 27 2013 GPL
dr-xr-xr-x. 3 root root 2048 Nov 29 2013 images
dr-xr-xr-x. 2 root root 2048 Nov 29 2013 isolinux
dr-xr-xr-x. 2 root root 655360 Nov 29 2013 Packages
-r--r--r--. 2 root root 1354 Nov 27 2013 RELEASE-NOTES-en-US.html
dr-xr-xr-x. 2 root root 4096 Nov 29 2013 repodata
-r--r--r--. 2 root root 1706 Nov 27 2013 RPM-GPG-KEY-CentOS-6
-r--r--r--. 2 root root 1730 Nov 27 2013 RPM-GPG-KEY-CentOS-Debug-6
-r--r--r--. 2 root root 1730 Nov 27 2013 RPM-GPG-KEY-CentOS-Security-6
-r--r--r--. 2 root root 1734 Nov 27 2013 RPM-GPG-KEY-CentOS-Testing-6
-r--r--r--. 1 root root 3380 Nov 29 2013 TRANS.TBL
其中有一个目录为Packages, 这个目录下包含了所有的rpm包,我们来测试安装位于/media/cdrom/Packages/zsh-4.3.10-7.el6.x86_64.rpm
rpm -i /media/cdrom/Packages/zsh-4.3.10-7.el6.x86_64.rpm
你会发现什么都没提示就完成了,如果在运行一次就会提示你已经安装了
# rpm -i /media/cdrom/Packages/zsh-4.3.10-7.el6.x86_64.rpm
package zsh-4.3.10-7.el6.x86_64 is already installed
3.2 -v: 显示安装信息, -v需要结合-i来使用,如-iv,测试安装zsh:
# rpm -iv /media/cdrom/Packages/zsh-4.3.10-7.el6.x86_64.rpm
Preparing packages for installation...
zsh-4.3.10-7.el6
这次安装会提示你准备信息,和安装的名称。
3.3 -vv: 显示更详细的安装信息
详细到每一个文件的创建过程,以及改变记录,输出更多的debug信息
# rpm -ivv /media/cdrom/Packages/zsh-4.3.10-7.el6.x86_64.rpm
你会看到很多debug信息。
3.4 -h: hash,显示软件解压缩过程,例如:
# rpm -ih zsh-4.3.10-7.el6.x86_64.rpm
########################################### [100%]
########################################### [100%]
会显示解压缩过程
3.5 组合安装选项 -ivh
我们用的最多的还是rpm -ivh 这种组合选项,能够显示出足够多信息,例如:
# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm
Preparing... ########################################### [100%]
1:zsh ########################################### [100%]
3.6 --test:
仅测试安装,并不真正执行安装,如果我们运行一个没有对其他包有依赖的rpm包,如下:
# rpm -ivh --test zsh-4.3.10-7.el6.x86_64.rpm
Preparing... ########################################### [100%]
只会显示准备安装,但是没有真正的安装,如果有依赖关系,则会报错,给我们一种方式来测试依赖关系:
3.6 解决安装依赖问题
关于安装过程中,如果我们安装B包,但是B包依赖于A包,我们安装的时候就会出现问题,如果我们用上面的安装命令来安装php:
# rpm -ivh php-5.3.3-26.el6.x86_64.rpm
error: Failed dependencies:
php-cli(x86-64) = 5.3.3-26.el6 is needed by php-5.3.3-26.el6.x86_64
php-common(x86-64) = 5.3.3-26.el6 is needed by php-5.3.3-26.el6.x86_64
就会出现我们安装php,但是php依赖php-cli和php-common两个包,安装失败。
所以,解决安装包依赖问题有两种解决办法:
1. 解决依赖关系
按照依赖关系提示,我们把依赖包一一装好
2. 忽略依赖关系
忽略依赖关系,会强制安装指定包,但是软件很有可能无法正常运行,不推荐使用
--nodeps
例如忽略php的依赖包php-cli和php-common,强行安装php:
# rpm -ivh --nodeps php-5.3.3-26.el6.x86_64.rpm
Preparing... ########################################### [100%]
package php-5.4.41-47.el6.art.x86_64 (which is newer than php-5.3.3-26.el6.x86_64) is already installed
file /etc/httpd/conf.d/php.conf from install of php-5.3.3-26.el6.x86_64 conflicts with file from package php-5.4.41-47.el6.art.x86_64
file /usr/lib64/httpd/modules/libphp5.so from install of php-5.3.3-26.el6.x86_64 conflicts with file from package php-5.4.41-47.el6.art.x86_64
#
虽然安装上了php包,但是php服务并不能正常使用。
3.7 --replacepkgs 重新安装
替换上一次原有安装,如果原有的配置文件做了修改,很有可能不执行替换,而是将安装应该安装生成的配置文件重命名为 .rpmnew
例如,我们安装zsh,然后修改zsh生成的文件,然后使用--replacepkgs来重新安装,来测试我们修改的文件是否被重命名
首先,安装zsh
# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm
Preparing... ########################################### [100%]
1:zsh ########################################### [100%]
#
查找安装zsh时生成的配置文档
# rpm -qc zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc
我们修改下/etc/zprofile,在尾行添加一个注释信息
# echo "# This is comments" >> /etc/zprofile
然后使用 --replacepkgs重新安装zsh
# rpm -ivh --replacepkgs zsh-4.3.10-7.el6.x86_64.rpm
tail -1 /etc/zprofile #查看/etc/zprofile最后一行,我们上次更改的信息并没有被删除
4。 卸载程序包:
rpm [option] package_name #使用包名,而不是带版本号的那个文件名
-e: erase
如果被其他包依赖:
1. 将依赖于此包的所有包一并卸载
2. 忽略依赖关系 --nodeps
能卸载,但是依赖于此包的程序包可能会运行不正常
eg: warning: /etc/zprofile saved as /etc/zprofile.rpmsave
举例: 我们来删除zsh包
# rpm -e zsh
warning: /etc/zprofile saved as /etc/zprofile.rpmsave
注意,删除zsh时候我们得到一个warning,提示我们/etc/zprofile文件修改过,被转存到/etc/zprofile.rpmsave
!!! 如果包的配置文件安装后曾被改动过,卸载时,此文件不会卸载,而是被重命名并保留
5. RPM包升级
新版本替换老版本
rpm [option] /path/to/package_file
1. 升级或安装
-Uvh
2. 纯升级
-Fvh
升级后可能会带来版本冲突,
--force 可以强制升级
注意: 不应该对内核执行升级操作,而是安装
系统允许多内核并存
6. RPM包查询
6.1 查询某包是否安装
rpm -q package_name ... 可一次查询多个
例如:查询是否安装了cpp, python, bind
# rpm -q cpp python bind
cpp-4.4.7-11.el6.x86_64
python-2.6.6-52.el6.x86_64
package bind is not installed
6.2 查询所有已经安装的包
rpm -qa
按条件过滤: rpm -qa | grep ‘PATTERN‘
例如: 查询以python开头的包都有哪些?
# rpm -qa | grep ‘^python‘
python-ethtool-0.6-5.el6.x86_64
python-decorator-3.0.1-3.1.el6.noarch
python-iwlib-0.1-1.2.el6.x86_64
python-markupsafe-0.9.2-4.el6.x86_64
python-beaker-1.3.1-7.el6.noarch
python-pycurl-7.19.0-8.el6.x86_64
python-meh-0.12.1-3.el6.noarch
python-iniparse-0.3.1-2.1.el6.noarch
python-mako-0.3.4-1.el6.noarch
python-urlgrabber-3.9.1-9.el6.noarch
python-libs-2.6.6-52.el6.x86_64
python-2.6.6-52.el6.x86_64
python-slip-0.2.20-1.el6_2.noarch
python-slip-dbus-0.2.20-1.el6_2.noarch
6.3 查询包的描述信息
rpm -qi package_name #只能查询已经安装包的信息
例如: 查询zsh包的详细信息
# rpm -qi zsh
Name : zsh Relocations: (not relocatable)
Version : 4.3.10 Vendor: CentOS
Release : 7.el6 Build Date: Sun 24 Nov 2013 09:40:59 AM PST
Install Date: Thu 11 Jun 2015 08:26:36 AM PDT Build Host: c6b9.bsys.dev.centos.org
Group : System Environment/Shells Source RPM: zsh-4.3.10-7.el6.src.rpm
Size : 5009102 License: BSD
Signature : RSA/SHA1, Sun 24 Nov 2013 11:33:46 AM PST, Key ID 0946fca2c105b9de
Packager : CentOS BuildSystem <http://bugs.centos.org>
URL : http://zsh.sunsite.dk/
Summary : A powerful interactive shell
Description :
The zsh shell is a command interpreter usable as an interactive login
shell and as a shell script command processor. Zsh resembles the ksh
shell (the Korn shell), but includes many enhancements. Zsh supports
command line editing, built-in spelling correction, programmable
command completion, shell functions (with autoloading), a history
mechanism, and more.
简单解释下Relications意义为是否支持指定安装路径,Group为包组名
6.4 查询某包安装生成了哪些文件
rpm -ql package_name #会列出该包生成的所有文档,包括配置文件、帮助文档
4.1 查询某包安装生成了哪些配置文件(通常都是存放在/etc/下的文件)
rpm -qc package_name
4.2 查询某包安装生成了哪些帮助文件
rpm -qd package_name
4.3 查询程序包的相关脚本
rpm -q --scripts package_name
脚本有4类:
preinstall: 安装前要执行的脚本
postinstall: 安装完成后要执行的脚本
preuninstall: 卸载前要执行的脚本
postuninstall: 卸载后要执行的脚本
例如: 查询zsh包都安装了哪些配置文档?
# rpm -qc zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc
查询zsh包都安装了哪些帮助文档?
# rpm -qd zsh
/usr/share/doc/zsh-4.3.10/BUGS
/usr/share/doc/zsh-4.3.10/CONTRIBUTORS
/usr/share/doc/zsh-4.3.10/FAQ
/usr/share/doc/zsh-4.3.10/FEATURES
/usr/share/doc/zsh-4.3.10/LICENCE
/usr/share/doc/zsh-4.3.10/MACHINES
/usr/share/doc/zsh-4.3.10/NEWS
/usr/share/doc/zsh-4.3.10/README
/usr/share/doc/zsh-4.3.10/completion-style-guide
/usr/share/doc/zsh-4.3.10/zsh-development-guide
/usr/share/doc/zsh-4.3.10/zshprompt.pl
/usr/share/info/zsh.info-1.gz
...
6.5 查询某文件是由那个包安装生成的
rpm -qf /path/to/conf_file #指定某个配置文档
比如说/etc/fstab,我们想知道它是哪个包生成的,我们可以这么写:
# rpm -qf /etc/fstab
setup-2.8.14-20.el6_4.1.noarch
就可以知道/etc/fstab文件,是通过setup-2.8.14-20.el6_4.1.noarch 来生成的了。但是这仅针对于已经安装的包可用。
对没安装的包进行查询就需要下面的方法。
6.6 对尚未安装的包执行查询 -p
rpm [option] /path/to/package_file #必须指定包的位置及包的全名
例如:/media/cdrom/Packages/zsh-4.3.10-7.el6.x86_64.rpm
-qpi 描述信息
-qpl 会生成了哪些文件
-qpc 会生成哪些配置文件
-qpd 会生成哪些帮助文件
例如:我们想查询php包的描述信息
# rpm -qpi php-5.3.3-26.el6.x86_64.rpm
Name : php Relocations: (not relocatable)
Version : 5.3.3 Vendor: CentOS
Release : 26.el6 Build Date: Fri 22 Nov 2013 03:07:55 AM PST
Install Date: (not installed) Build Host: c6b9.bsys.dev.centos.org
Group : Development/Languages Source RPM: php-5.3.3-26.el6.src.rpm
Size : 3700269 License: PHP
Signature : RSA/SHA1, Sun 24 Nov 2013 11:33:09 AM PST, Key ID 0946fca2c105b9de
Packager : CentOS BuildSystem <http://bugs.centos.org>
URL : http://www.php.net/
Summary : PHP scripting language for creating dynamic web sites
Description :
PHP is an HTML-embedded scripting language. PHP attempts to make it
easy for developers to write dynamically generated webpages. PHP also
offers built-in database integration for several commercial and
non-commercial database management systems, so writing a
database-enabled webpage with PHP is fairly simple. The most common
use of PHP coding is probably as a replacement for CGI scripts.
The php package contains the module which adds support for the PHP
language to Apache HTTP Server.
查询生成了哪些文件?
rpm -qpl php-5.3.3-26.el6.x86_64.rpm
查询生成了哪些配置文件?
rpm -qpc php-5.3.3-26.el6.x86_64.rpm
查询生成了哪些帮助文件?
rpm -qpd php-5.3.3-26.el6.x86_64.rpm
总之,查询已安装包的特定信息使用的是 rpm -q{i,l,d} ,对未安装的包查询信息,就多了一个p, 为rpm -qp{i,l,d}
===================================================================================
7. RPM包校验
RPM包的合法性验证分两部分:
1. 来源合法性
2. 包的完整性
包的制作者使用单项加密提取原始数据的特征码,而后使用自己的私钥加密这段特征码,附加原始数据后面
验证过程:
前提:必须有可靠机制获取到包制作者的公钥
1、使用制作者的公钥解密 加密的特征码, 能解密则意味来源合法
2、使用与制作者同样的单向加密算法提取原始数据的特征码,并与解密出来的特征码做比对, 相同,则意味着完整性没问题
7.1 校验: 检查包后文件属性是否发生变化
rpm -V package_name #用的不多
如检查光盘中zsh包:
# rpm -V zsh
S.5....T. c /etc/zprofile
返回给我们一个 S.5....T. c /etc/zprofile, 具体含义如下:
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
某属性没变化的位,显示为 .
7.2 rpm包来源合法性及完整性检验:
前提: 在当前系统上导入包的制作者的公钥
导入公钥:
rpm --import /path/to/key_file
光盘上的公钥就在根目录下面:
-r--r--r--. 2 root root 1706 Nov 27 2013 RPM-GPG-KEY-CentOS-6
-r--r--r--. 2 root root 1730 Nov 27 2013 RPM-GPG-KEY-CentOS-Debug-6
-r--r--r--. 2 root root 1730 Nov 27 2013 RPM-GPG-KEY-CentOS-Security-6
-r--r--r--. 2 root root 1734 Nov 27 2013 RPM-GPG-KEY-CentOS-Testing-6
查看已导入公钥:
rpm -qa gpg-pubkey*
# rpm -qa gpg-pubkey*
gpg-pubkey-5ebd2744-418ffac9
gpg-pubkey-c105b9de-4e0fd3a3
gpg-pubkey-4520afa9-50ab914c
查看单条pubkey的详细内容
rpm -qi gpg-pubkey-NAME
比如我查看第一个公钥信息:
# rpm -qi gpg-pubkey-5ebd2744-418ffac9
Name : gpg-pubkey Relocations: (not relocatable)
Version : 5ebd2744 Vendor: (none)
Release : 418ffac9 Build Date: Fri 22 May 2015 09:58:23 AM PDT
Install Date: Fri 22 May 2015 09:58:23 AM PDT Build Host: localhost
Group : Public Keys Source RPM: (none)
Size : 0 License: pubkey
Signature : (none)
Summary : gpg(Atomic Rocket Turtle <admin@atomicrocketturtle.com>)
Description :
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: rpm-4.8.0 (NSS-3)
mQGiBEGP+skRBACyZz7muj2OgWc9FxK+Hj7tWPnrfxEN+0PE+n8MtqH+dxwQpMTd
gDpOXxJa45GM5pEwB6CFSFK7Fb/faniF9fDbm1Ga7MpBupIBYLactkoOTZMuTlGB
T0O5ha4h26YLqFfQOtlEi7d0+BDDdfHRQw3o67ycgRnLgYSA79DISc3MywCgk2TR
yd5sRfZAG23b4EDl+D0+oaMEAK73J7zuxf6F6V5EaxLd/w4JVB2xW0Glcn0fACOe
8FV9lzcZuo2xPpdGuyj02f/xlqvEav3XqTfFU2no61mA2pamaRNhlo+CEfGc7qde
/1twfSgOYqzeCx7+aybyPo8Th41b80FT19mfkjBf6+5NbUHffRabFFh1FmcPVNBn
F3FoA/95nRIzqDMItdTRitaZn02dIGNjdwllBD75bSVEvaR9O5hjBo0VMc25DB7f
DM2qEO52wCQbAKw9zFC284ekZVDaK4aHYt7iobHaqJEpKHgsDut5WWuMiSLR+SsF
aBHIZ9HvrKWLSUQKHU6A1Hva0P0r3GnoCMc/VCVfrLl721SjPbQzQXRvbWljIFJv
Y2tldCBUdXJ0bGUgPGFkbWluQGF0b21pY3JvY2tldHR1cnRsZS5jb20+iFkEExEC
ABkFAkGP+skECwcDAgMVAgMDFgIBAh4BAheAAAoJEDKpURRevSdEzcQAn1hSHqTO
jwv/z/picpOnR+mgycwHAKCBex2ciyXo5xeaQ9w7OMf7Jsmon7kBDQRBj/rMEAQA
6JvRndqE4koK0e49fUkICm1X0ZEzsVg9VmUW+Zft5guCRxmGlYTmtlC7oJCToRP/
m/xH5uIevGiJycRKB0Ix+Csl6f9QuTkQ7tSTHcaIKbI3tL1x6CCBoWeTGYaOJlvk
ubrmajiMFaBfopLH2firoSToDGoUvv4e7bImIHEgNr8AAwUEAND0YR9DOEZvc+Lq
Ta/PQyxkdZ75o+Ty/O64E3OmO1Tuw2ciSQXCcwrbrMSE6EHHetxtGCnOdkjjjtmH
AnxsxdONv/EJuQmLcoNcsigZZ4tfRdmtXgcbnOmXBgmy1ea1KvWcsmecNSAMJHwR
7vDDKzbj4mSmudzjapHeeOewFF10iEYEGBECAAYFAkGP+swACgkQMqlRFF69J0Sq
nQCfa/q9Y/oY4dOTGj6MsdmRIQkKZhYAoIscjinFwTru4FVi2MIEzUUMToDK
=NOIx
-----END PGP PUBLIC KEY BLOCK-----
检查包: 安装过程中会自动进行
手动检查:
rpm -K /path/to/package_file
rpm --checksig /path/to/package_file
不检查包完整性(只检查来源合法性):
rpm -K --nodigest
不检查来源合法性(只检查包完整性)
rpm -K --nosignature
例如: 手动检查zsh包的包完整性及来源合法性
# rpm -K zsh-4.3.10-7.el6.x86_64.rpm
zsh-4.3.10-7.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
仅检查zsh包的包完整性:
# rpm -K --nosignature zsh-4.3.10-7.el6.x86_64.rpm
zsh-4.3.10-7.el6.x86_64.rpm: sha1 md5 OK
仅检查zsh包的来源合法性:
# rpm -K --nodigest zsh-4.3.10-7.el6.x86_64.rpm
zsh-4.3.10-7.el6.x86_64.rpm: rsa (md5) pgp OK
===========================================================================================
8. 数据库重建:
RPM的安装,卸载,查询升级,校验等操作都需要RPM的数据库数据正确,如果数据库出错,则无法操作RPM
数据库目录位于: /var/lib/rpm
重建有两种方式:
8.1. rpm --initdb : 初始化
如果事先没有库,会新建一个库; 如果有库,则不会新建
8.2 rpm --rebuilddb : 重建
直接重建,覆盖原有的数据库
两种方式重建RPM数据库都不会有提示,直接显示完成
总结,RPM包管理器是很重要的知识点,整理笔记成此博客,锻炼下自己梳理内容的能力,也方便日后查看,如果有理解不正确的地方,欢迎大家多多指教!
本文出自 “Richier” 博客,请务必保留此出处http://richier.blog.51cto.com/1447532/1661144
标签:rpm包
原文地址:http://richier.blog.51cto.com/1447532/1661144