您的位置:首页 > 产品设计 > 产品经理

你玩游戏吗?软件包的管理(一)——RPM

2015-04-12 17:42 281 查看
RPM包管理员(简称RPM,全称为The RPM Package Manager)是在Linux下广泛使用的软件包管理器。RPM此名词可能是指.rpm的文件格式的软件包,也可能是指其本身的软件包管理器(RPM Package Manager)。最早由Red Hat研制,现在也由开源社区开发。RPM通常随附于Linux发行版,但也有单独将RPM作为应用软件发行的发行版(例如Gentoo)。RPM仅适用于安装用RPM来打包的软件,目前是GNU/Linux下软件包资源最丰富的软件包类型之一。——维基百科
Linux在桌面上的尴尬地位有一大部分原因是因为娱乐软件的缺乏和软件安装的难度大,今天我们就来说说Linux下软件包管理的内容。
我觉得维基百科这次对RPM的解释并不是太好,早先RPM叫做:Red hat Package Manager,后来因为使用的人很多也很好用,被Linux Standard Base定义为Linux的包管理器的标准才改名为RPM Package Manager这种递归缩进的形式。在接触Linux之前总觉得游戏的安装很神秘,能够把那么多的东西融合到一块儿并受玩家控制,在接触到Linux软件包的安装之后发现,它们也不过就是一些文件放在了特定的目录下罢了。
我们先来认识一下RPM包名:



它是这样的一种形式:

appname-VERSION-RELEASE.ARCH.rpm
VERSION:
major: 主版本号
minor: 次版本号
release: 发行号
RELEASE: 包自身的修订号;有时候还会包含适用于的OS信息;
比如bash-4.3.2-2.centos6.x86_64.rpm中的2.centos6
ARCH: 适用的平台
x86: i386, i486, i586, i686
x86_64: x86_64, amd64
powerpc: ppc
noarch: 跟平台无关;
对RPM我们不打算做过多的讲解,因为在实际使用中yum(下一篇就是他)几乎已经替代了RPM,其原因就是在安装软件包的时候会牵扯到依赖关系的问题,具体就是:你安装A需要B或者B的库,那么你就得先装B,但是B又需要C,更可恶的是可能C需要A。OMG,你会发现你掉到一个无底洞之中了。如图:



图中rpm -ivh 表示以详细信息人类易读的模式显示安装过程,卸载就是rpm -e,使用起来很简单,就不再截图了,下面详细介绍一下rpm -q的使用方法(还是文本的形式):

查询某包是否已经安装,以及检查安装的所有包;还可以查看某包的详细信息;

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

[select-options]:
1、查询某包或某些包是否安装:
rpm -q PACKAGE_NAME...

2、查询已经安装的所有包:
rpm -qa

## [root@bogon Packages]# rpm -qa | wc -l --> 查看安装了多少包
## [root@bogon Packages]# rpm -qa | grep 'yum*' --> 查找特定包

3、查询某文件是由哪个包安装生成:
rpm -qf /PATH/TO/SOMEFILE

4、查询尚未安装的包文件的相关信息
-p
# rpm -qpi PACKAGE_FILE
##[root@bogon Packages]# rpm -qpi ruby-1.8.7.374-2.el6.x86_64.rpm --> 查看没装的rpm包的信息,必须写全包的名字

[query-options]:
1、查询某包的简要说明信息:
rpm -qi PACKAGE_NAME

## [root@bogon Packages]# rpm -qi yum --> 包的详细信息
##Name : yum Relocations(能否更改安装路径): (not relocatable)
##Version : 3.2.29 Vendor(供应商): CentOS
##Release : 60.el6.centos Build Date(构建时间): Thu 16 Oct 2014 11:15:10 PM CST
##Install Date: Thu 26 Mar 2015 08:45:50 AM CST Build Host(在哪个主机上): c6b8.bsys.dev.centos.org
##Group : System Environment/Base Source RPM(源码包): yum-3.2.29-60.el6.centos.src.rpm
##Size : 4776299 License(遵循的协议): GPLv2+
##Signature : RSA(签名来源)/SHA1(完整性检查), Sat 18 Oct 2014 03:53:51 AM CST, Key ID 0946fca2c105b9de
##Packager(创建包的人) : CentOS BuildSystem <http://bugs.centos.org>
##URL : http://yum.baseurl.org/ ##Summary : RPM package installer/updater/manager
##Description :
##Yum is a utility that can check for and automatically download and
##install updated RPM packages. Dependencies are obtained and downloaded
##automatically, prompting the user for permission as necessary.

2、查询某包安装生成的文件列表:
rpm -ql PACKAGE_NAME

3、查询某包安装完成后生成的所有配置文件:
rpm -qc PACKAGE_NAME

## [root@bogon Packages]# rpm -qc yum --> 查询软件包的配置文件

4、查询某包安装完成后生成的所有帮助文件:
rpm -qd PACKAGE_NAME

5、查看某包制作时随版本变化的changelog信息:
rpm -q --changelog PACKAGE_NAME
##[root@bogon Packages]# rpm -q --changelog yum --> 查看rpm包的更新日志

6、查询某包提供的capabilities:
rpm -q --provides PACKAGE_NAME
##[root@bogon Packages]# rpm -q --provides yum --> 查看rpm包提供的能力功能

7、查询某包所依赖的capabilities:
rpm -q --requires PACKAGE_NAME
##[root@bogon Packages]# rpm -q --requires yum --> 查看rpm包所依赖的能力功能

8、查询某包安装或卸载时执行脚本:
rpm -q --scripts PACKAGE_NAME

脚本有四类:
preinstall: 安装过程开始之前执行的脚本;
postinstall: 安装过程完成之后执行的脚本;
preuninstall: 卸载开始之前执行的脚本 ;
postuninstall: 卸载过程完成之后执行的脚本;

##[root@bogon Packages]# rpm -q --scripts zsh --> 查看rpm包安装或卸载时执行的脚步
##postinstall scriptlet (using /bin/sh): --> 安装时运行的脚本
## if [ ! -f /etc/shells ] ; then
## echo "/bin/zsh" > /etc/shells
## else
## grep -q "^/bin/zsh$" /etc/shells || echo "/bin/zsh" >> /etc/shells
## fi
##
## if [ -f /usr/share/info/zsh.info.gz ]; then
## # This is needed so that --excludedocs works.
## /sbin/install-info /usr/share/info/zsh.info.gz /usr/share/info/dir \
## --entry="* zsh: (zsh). An enhanced bourne shell."
## fi
##
## :
##preuninstall scriptlet (using /bin/sh): --> 卸载前执行的脚本
## if [ "$1" = 0 ] ; then
## if [ -f /usr/share/info/zsh.info.gz ]; then
## # This is needed so that --excludedocs works.
## /sbin/install-info --delete /usr/share/info/zsh.info.gz /usr/share/info/dir \
## --entry="* zsh: (zsh). An enhanced bourne shell."
## fi
## fi
## :
##postuninstall scriptlet (using /bin/sh): --> 卸载后执行的脚本
## if [ "$1" = 0 ] ; then
## if [ -f /etc/shells ] ; then
## TmpFile=`/bin/mktemp /tmp/.zshrpmXXXXXX`
## grep -v '^/bin/zsh$' /etc/shells > $TmpFile
## cp -f $TmpFile /etc/shells
## rm -f $TmpFile
## fi
## fi

校验:
查询包安装之后生成的文件是否发生了改变

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

常见用法:rpm -V PACKAGE_NAME

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

##[root@bogon Packages]# rpm -V yum --> 查看包的配置文件是否改变
## S.5....T. c /etc/yum.conf --> .代表没变,字母代表变了
## 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 --> 功能

程序包的合法性验正:
来源合法:
由我们信任的制作者提供
依赖于:制作者的数字签名;签名是作者使用自己的私钥加密程序包的特性码进行的;
内容合法:
包未被二次修改;完整性校验成功
依赖于:制作者提供的程序特征码;
验正方式:安装者用同样的特征码提取算法提取程序包的特征码,并与原作者提供的相比较;

验正其光盘中程序包的来源及完整性:
rpm --import /path/to/RPM-GPG-KEY-FILE

例如:# rpm --import RPM-GPG-KEY-CentOS-6

验正:rpm {-K|--checksig} PACKAGE_FILE
--nosignature: 不检查来源合法性
--nodigest: 不检查完整性

##[root@bogon media]# rpm --import RPM-GPG-KEY-CentOS-6 --> 导入密码文件
##[root@bogon Packages]# rpm -K yum-3.2.29-60.el6.centos.noarch.rpm --> 验证rpm包是否合法
## yum-3.2.29-60.el6.centos.noarch.rpm: rsa sha1 (md5) pgp md5 OK
##[root@bogon Packages]# rpm -K --nosignature yum-3.2.29-60.el6.centos.noarch.rpm --> 不验证签名
## yum-3.2.29-60.el6.centos.noarch.rpm: sha1 md5 OK
##[root@bogon Packages]# rpm -K --nodigest yum-3.2.29-60.el6.centos.noarch.rpm --> 不验证完整性
## yum-3.2.29-60.el6.centos.noarch.rpm: rsa (md5) pgp OK

rpm管理器数据库:/var/lib/rpm
##/var/lib/rpm --> rpm管理器的数据库,rpm所安装的所有包的所有信息都在这里存放
重建数据库:
rpm {--initdb|--rebuilddb} [-v] [--dbpath DIRECTORY]

--initdb: 初始化数据库,即数据库完全不存时,可新建之;

--rebuilddb: 无论当前数据存在与否,都会直接重建此库;
关于RPM其他的使用方法大家使用man命令查看吧,我们的重点是下一篇yum。
希望本文能够帮助到您,如有错误敬请指正,拜谢!

本文出自 “Linuxlove” 博客,请务必保留此出处http://linuxlover.blog.51cto.com/2470728/1631560
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: