码迷,mamicode.com
首页 > 其他好文 > 详细

RPM包管理

时间:2015-06-12 15:16:27      阅读:151      评论:0      收藏:0      [点我收藏+]

标签: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包,例如:

http://rpmfind.net

http://rpm.pbone.net

一个可靠的途径: 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包管理

标签:rpm包

原文地址:http://richier.blog.51cto.com/1447532/1661144

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