码迷,mamicode.com
首页 > 系统相关 > 详细

linux软件包管理之一(rpm包管理)

时间:2015-12-25 06:32:12      阅读:332      评论:0      收藏:0      [点我收藏+]

标签:yum   rpm   linux软件   

开场白


1、软件的安装卸载是很平常的事情,但是在linux上面却也这么的不简单。Linux的其中一个哲学思想就是 一个程序只做一件事,并且做好。 组合小程序来完成复杂任务。这样做有很多好处。但世界上的东西总是两面的,有得必有失。各个小程序之间往往会存在着复杂的依赖关系。


2、再往前走一步。软件最初的安装方式只有一种,那就是源代码编译安装,这种方式安装的软件更贴近本机的系统运行环境,但也更复杂。不仅要解决软件之间的依赖关系(所依赖的软件还要再编译安装),还要配置开发编译环境(可能会抓狂的),一切都完成了以后还要指定各种的编译参数,而且编译所耗费的时间也比较长。在问题出现的时候,总是有些人或组织来为我们解决问题。所以这时就有了包管理器,如redhat系的rpm,debian系的dpt,dpkg。


3、包管理器为我们解决了编译的问题,使用起来非常的快捷。但就像我们第一段所说的,依赖关系还是存在的,虽然简单了很多,但还是会发生几个小时过去还没有安装上软件的情况发生。那么包管理器的前端工具就又出现了,它会为我们自动解决依赖关系,从此安装软件变的简单多了。


4、虽说前端工具貌似可以解决所有问题,但在我们使用系统的过程中,它也是有局限性的。源代码安装也是很常用到的,但前端工具可以很简单的解决开发环境和依赖关系的问题。


目录:

一、rpm包管理器

1、程序包简介。

2、rpm包管理器。

3、rpm命令的使用。


二、yum使用

三、源代码安装软件


实验环境:

系统:CentOS_7.1

rpm版本:RPM version 4.11.1

yum版本:3.4.3


一、rpm包管理器。


1、程序包简介

rpm redhat的软件包管理器。全称为:redhat package manager。成为工业标准以后的全称为:rpm is package manager。它的软件包后缀也为.rpm。

debian 的软件包管理工具为dpt,dpkg,  软件包后缀为.deb

S.u.S.E的软件包管理器也是使用的redhatrpm。只不过因为打包路径的不同,所以并不通用。


程序包管理器分为两个部分:包管理工具和打包的文件。管理工具后面再说,我们先来看一下程序包所包含的东西:

  1. 编译好的二进制程序文件。

  2. 配置文件。

  3. 帮助文档。

  4. 编译好的二进制库文件。


程序包还有一种拆包的概念

源代码安装时可以指定功能,但程序包都是别人或组织以大众需求进行编译而成的,为了避免安装一堆用不到的功能,所以常常是不同功能的文件打包在不同的包内。以主包为基准包含主要的功能,后面就是各种不同的支包(开发包,库包,工具包等等)。

如以bind为例:

bind 主包;bind-devel 开发包;bind-libs 库包;bind-utils 工具包。



rpm包命名方式

源代码: name-version.tar.{gz|bz2|xz}   注意是源代码包的命名方式。
VERSION: major.minor,release

major主版本           重大的版本分支

minor 次版本          其中的一个功能有了重大变化,而不是所有的变化

release 发行号。     修正了某个BUG,修正了某一段代码。


RPM格式:

name-VERSION-relese.arch.rpm

version: 这是源代码的版本。就是上面的majob,minor,release。

release.arch:打包版本号。rpm的发行号

arch(archetecture)是硬件架构或系统的平台类型。


如: bash-4.3.2-2.e16.x86_64.rpm   

4.3.2是程序版本号 ,2.el6是release(2是rpm的打包版本,el6是软件平台),后面的x86_64是硬件平台。


硬件架构平台常用到的。
x86_64
i386, i586, i686, 都是x86系列的,新点或旧点。一般都彼此兼容。
ppc
noarch  代表通用硬件平台,如解释型语言写的程序。


获取程序包的途径
(1) 系统发行版的光盘或官方的文件服务器(或镜像站点):
            http://mirrors.aliyun.com,
            http://mirrors.sohu.com,
            http://mirrors.163.com
(2) 项目的官方站点

(3) 第三方组织:
            (a) EPEL
            (b) 搜索引擎
                http://pkgs.org
                http://rpmfind.net
                http://rpm.pbone.net
 (4) 自已动手制作。


来源合法性验正

不能随意安装来路不明的软件包。 源码包也一样。
源程序: 通过md5或sha1校验码验证;
rpm包: 发行商提供的合法性一定要是可信的     
验正包完整性: 校验码
验正来源合法: 公钥验证来源是正确的。

一定要找合法的来源渠道, 不要在google上随便找一个就用。
验正方法,我们下面会说到。



2、程序包管理器

功能:将编译好的应用程序的各组成文件打包成一个或几个程序包文件,从而更方便地实现程序包的安装、升级、卸载和查询等管理操作;

1、程序包的组成清单(每个程序包都单独实现);
                文件清单
                安装或卸载时运行的脚本
2、数据库(公共)
                程序包的名称和版本;
                依赖关系;
                功能说明;
                安装生成的各文件的文件路径及校验码信息;
                等等等
                

包管理基本功能:打包安装查询升级卸载校验数据库管理   

rpm的所有管理功能都是建立在数据库上面的,所以rpm数据库是非常重要的。 如果不小心给弄没了,可以找台软件包安装相近的机器,复制一份。rpm自带的生成数据库的命令不一定有用。        

Centos上的rpm数据库位置/var/lib/rpm/


3、rpm命令的使用:

rpm  [OPTIONS]  [PACKAGE_FILE]
     安装:-i, --install
     升级:-U, --update, -F, --freshen
     卸载:-e, --erase
     查询:-q, --query
     校验:-V, --verify
     数据库维护:--builddb, --initdb


rpm在man文档各个功能都是不同的部分,我们这里也按不同的部分分开来说,文档中的GENERAL OPTIONS是穿插在所有功能中的。

1、安装

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

最常用到的组合: rpm -ivh PACKGE_FILE


常用到的选项:

[GENERAL OPTIONS]:
-v:verbose,详细信息
-vv:更详细的输出             

[install-options]:
-h:hash marks输出进度条;每个#表示2%的进度;
--test:测试安装,检查并报告依赖关系及冲突消息等;
--nodeps:忽略依赖关系;不建议;
--replacepkgs:重新安装
                  

--noscripts 安装或卸载时不运行rpm包自带的以下四种脚本。
--nopre 不运行安装过程之前要运行的脚本。

--nopost 不运行安装过程完成之后要运行的脚本。
--nopreun 不运行卸载过程开始之前要运行的脚本。
--nopostun 不运行卸载过程完成之后要运行的脚本。
注意:rpm可以自带脚本;
四类:--noscripts
                            preinstall:安装过程开始之前运行的脚本,%pre , --nopre
                            postinstall:安装过程完成之后运行的脚本,%post , --nopost
                            preuninstall:卸载过程真正开始执行之前运行的脚本,%preun, --nopreun
                            postuninstall:卸载过程完成之后运行的脚本,%postun , --nopostun

可以把src的rpm包解开以后,查看它的sepc文件,其中一部分以%pre,%post之类开头的脚本段。


--nosignature:不检查包签名信息,不检查来源合法性;
--nodigest:不检查包完整性信息;


最常用到的恐怕就是ivh了。安装,显示详细信息,以#号显示过程。

[root@localhost ~]# rpm -ivh zsh-5.0.2-7.el7_1.2.x86_64.rpm 
warning: zsh-5.0.2-7.el7_1.2.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:zsh-5.0.2-7.el7_1.2              ################################# [100%]
[root@localhost ~]#

--test只是用来测试安装,不会真的安装。用来检测依赖关系或其它问题。只执行到上面的例子中的Preparing阶段。

--nodeps 忽略依赖关系,如果依赖的仅仅是一些文档类的包,倒也可以用。

--replacepkgs 重新安装,不会覆盖已有的配置文件。如果想完全的重新安装,最好是先卸载再安装。

脚本的作用,如安装之前创建要用到的用户和目录,安装之后设置权限,卸载之前保证环境,卸载之后清理文件等等。

包的签名信息和合法性,是基于包自带的签名和制做者的公钥来实现的。在没有导入制作者公钥之前就会报上面例子中第一行的错误。我们加上—nosignature试一下:

[root@localhost ~]# rpm -ivh --nosignature zsh-5.0.2-7.el7_1.2.x86_64.rpm 
Preparing...                          ################################# 
[100%]
Updating / installing...
   1:zsh-5.0.2-7.el7_1.2              
################################# [100%]
[root@localhost ~]#

注意只加--nodigest是没有效果的,因为包完整性是基于软件包的指纹信息,而没有公钥之前是得不到指纹信息的。所以还是会报没有KEY的错误。

大家都知道非对称密钥吧,以一种算法计算得出私钥,然后再从私钥中得出公钥。 以私钥加密的文件只能用公钥解密,而以公钥加密的文件则只能用私钥解密。


这里解释一下rpm包是如何做到这种验证的。

首先软件包在刚开始,会以单向加密计算出软件包的校验吗。校验吗就相当于一个文件或一些数据的指纹信息,基本上可以完全做到唯一的标示一个文件,只要程序包发生一丁点的变化,加密得出的校验码就是完全不同的。


技术分享

然后制作者会以一些算法(如RSA)生成自己的私钥和公钥,再以自己的私钥把特征码加密,也就形成了签名信息。只有制作者的公钥可以解密此签名信息。

技术分享


技术分享


而因为一对的公钥和私钥只能相互解密,所以只要拿到制作者的公钥,可以对签名解密,也就证明了软件包的来源合法性。 因为如果是另外的人加密的,用这个公钥是无法解开的。

把签名解开以后也就得到了程序包的特征吗。 此时就可以用相同的单相加密计算出程序包的特征码。只要与从签名解开的特征码一样,也就证明了程序包的完整性。

技术分享

大体上就是从能否解开签名信息而知道程序包是否正确。 从特证码知道程序包是否缺损。

所有的操作都依赖与公钥是正确的,这也就是CA的功能了,不过我们的程序包还用不到用CA来保证公钥的正确性。


导入制作者公钥:

获取并导入信任的包制作者的密钥:
对于CentOS发行版来说,安装完系统以后 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7,或是光盘根目录里面的RPM-GPG-KEY-CentOS-7。centos6也一样,只不过7是6而已。           

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


使用:rpm --import 公钥文件  来导入公钥。

在CentOS7上面还可以用rpmkeys --import命令,而且man文档中就是rpmkeys命令。

rpmkeys --import PUBKEY ...
rpmkeys {-K|--checksig} PACKAGE_FILE ...

[root@localhost cdrom]# rpmkeys --import RPM-GPG-KEY-CentOS-7
[root@localhost cdrom]# rpm -ivh Packages/zsh-5.0.2-7.el7.x86_64.rpm 
Preparing...                          ################################# [100%]
Updating / installing...
   1:zsh-5.0.2-7.el7                  ################################# [100%]
[root@localhost cdrom]#

可以看到现在没有报任何错误。

[root@localhost ~]# rpm -K zsh-5.0.2-7.el7_1.2.x86_64.rpm 
zsh-5.0.2-7.el7_1.2.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
[root@localhost ~]# 
单独的验证程序包文件也可以。

2、升级:
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...

-U:升级或安装;如果原本就没有安装此软件,则安装。
-F:升级,如果没有安装些软件,则不升级。
                
rpm  -Uvh PACKAGE_FILE ...
rpm  -Fvh PACKAGE_FILE ...
                
--oldpackage:降级;
--force:强制升级;有时候低版本的程序可能被其它程序所依赖,这时升级会报错。如果强制升级很可能会导致一些程序不能使用。这也是还要使用源代码安装软件的一个原因。

             
注意:(1) 不要对内核做升级操作; 4.0之前的内核必须要重启才能使用,可能会发生重启以后发现系统起不来了。可以直接安装新版本内核。Linux支持多内核版本并存,可以直接安装新版本内核;
(2)只要新升级安装的包的配置文件与老版本的配置文件不同,新的配置文件会重命名为*.rpmsave或*.rpmnew之类的名称。 是根据校验码之类的进行的比较。

[root@localhost ~]# rpm -Uvh zsh-5.0.2-7.el7_1.2.x86_64.rpm 
warning: zsh-5.0.2-7.el7_1.2.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:zsh-5.0.2-7.el7_1.2              ################################# [ 50%]
Cleaning up / removing...
   2:zsh-5.0.2-7.el7                  ################################# [100%]
[root@localhost ~]#

3、卸载:
 rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME ...
--allmatches:卸载所有匹配指定名称的程序包的各版本;
--nodeps:忽略依赖关系
--test:测试卸载,dry run模式

[root@localhost ~]# rpm -evh zsh
Preparing...                          ################################# [100%]
Cleaning up / removing...
   1:zsh-5.0.2-7.el7_1.2              ################################# [100%]
[root@localhost ~]#

4、查询:
rpm {-q|--query} [select-options] [query-options]

-q是基本,可以组合以下各选项。
[select-options]
    PACKAGE_NAME:查询指定的程序包是否已经安装,及其版本;
    -a, --all:查询所有已经安装过的包;
    -f  FILE:查询指定的文件由哪个程序包安装生成;
    -p, --package PACKAGE_FILE:用于实现对未安装的程序包执行查询操作;
    --whatprovides CAPABILITY:查询指定的CAPABILITY由哪个程序包提供;

    --whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖;

CAPABILITY表示的是一种能力,如生成的可执行程序,提供的web服务,提拱的shell功能等等。

                
[query-options]
     --changelog:查询rpm包的changlog;修改日志,这里只是rpm包的修改日志,而不是源码的changelog.

     -l, --list:程序安装生成的所有文件列表;
     -i, --info:程序包相关的信息,版本号、大小、所属的包组,等;
     -c, --configfiles:查询指定的程序包提供的配置文件;
     -d, --docfiles:查询指定的程序包提供的文档;
     --provides:列出指定的程序包提供的所有的CAPABILITY;
     -R, --requires:查询指定的程序包的依赖关系;
     --scripts:查看程序包自带的脚本片断;
                
常用到的组合:
-qi  PACKAGE:查询已安装程序的详细信息。

-qf FILE:查询某个文件是由哪个程序包所提供的

-qc PACKAGE:查询已安装程序的配置文件。

-ql PACKAGE:查询已安装程序所生成的文件。

-qd PACKAGE:查询已安装程序包所提供的文档。
-qpi  PACKAGE_FILE, -qpl PACKAGE_FILE, -qpc PACKAGE_FILE: 这些与上面都一样,只不过不是查询已安装程序的,而是查询还没有安装的程序包文件。

[root@localhost ~]# rpm -qf /etc/fstab 
setup-2.8.71-5.el7.noarch
[root@localhost ~]# 

[root@localhost ~]# rpm -qc zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc
[root@localhost ~]# 

[root@localhost ~]# rpm -qa | grep zs.*
zsh-5.0.2-7.el7_1.2.x86_64
[root@localhost ~]# 

[root@localhost ~]# rpm -qpc zsh-5.0.2-7.el7_1.2.x86_64.rpm 
warning: zsh-5.0.2-7.el7_1.2.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc
[root@localhost ~]#

最后一个例子是直接提供的程序包文件,而不是程序名称。倒数第二个用来在不知道某个程序具体的名称的时候很有用。



5、校验:
rpm {-V|--verify} [select-options] [verify-options]    

有没有怀疑过你的程序文件被改了,并且植入了后门。那么来校验一下吧。用来校验已安装的程序有没有被修改过,程序的所有文件。

有可能会报的错误:
S file Size differs 大小变化
M Mode differs (includes permissions and file type) 权限变化
5 digest (formerly MD5 sum) differs 校验码变化,rpm数据库中记录了所有程序的校验吗。
D Device major/minor number mismatch 设备主次号变化。
L readLink(2) path mismatch (readlink)路径变化。
U User ownership differs    属主变化。
G Group ownership differs 属组变化。
T mTime differs 修改时间变化
P caPabilities differ    CAPABILITY变化。

[root@localhost ~]# rpm -V zsh
[root@localhost ~]# 
没有消息就是最好的消息。
[root@localhost ~]# chmod o-x /usr/bin/zsh
[root@localhost ~]# rpm -V zsh
.M.......    /bin/zsh
[root@localhost ~]# 

[root@localhost ~]# touch /usr/bin/zsh
[root@localhost ~]# rpm -V zsh
.M.....T.    /bin/zsh
[root@localhost ~]# 

[root@localhost ~]# rpm -V -a
S.5....T.  c /etc/issue
S.5....T.  c /etc/yum.repos.d/CentOS-Base.repo
S.5....T.  c /etc/sudoers
.......T.  c /root/.bash_logout
S.5....T.  c /root/.bash_profile
S.5....T.  c /root/.bashrc
.....

修改权限的,修改时间的,最下面这个可以看到配置文件修改也是会报出来,也是程序的组合部分。


6、数据库重建:
rpm管理器数据库路径:/var/lib/rpm/

无论是升级、查询、删除操作还有yum安装都是需要rpm的数据库的。所以数据库是非常重要的。

      

获取帮助:
CentOS 6:man rpm
CentOS 7:man rpmdb
            
rpm {--initdb|--rebuilddb} [--dbpath DIRECTORY] [--root DIRECTORY]
--initdb:初始化数据库,当前无任何数据库可实始化创建一个新的;当前有时不执行任何操作;
--rebuilddb:重新构建,通过读取当前系统上所有已经安装过的程序包进行重新创建;


但我自己在测试中发现,一点用也没有,虽然出现一堆文件,但却没有任何软件安装的数据。不知道是不是我的虚拟机问题。朋友们如果可以重新生成数据库一定要告诉我一下啊。



谢谢浏览,如果朋友们有问题,尽管提出,大家一起学习。如果发现错误,也还请帮忙指出,谢谢了。

本文出自 “大蕃茄” 博客,请务必保留此出处http://fanqie.blog.51cto.com/9382669/1728040

linux软件包管理之一(rpm包管理)

标签:yum   rpm   linux软件   

原文地址:http://fanqie.blog.51cto.com/9382669/1728040

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!