天天看点

程序包管理(一)rpm

一、编程语言与操作系统:

    应用程序

    ____________________

    |lib call |            |

    |-------------------|

    |system call        |

    |———————————----————|

    |各种硬件            |

    ————————————————————|

    API:application program interface

    ABI:application binary interface 

        Api应用层级兼容,未必abi层次也兼容,有些程序对二进制的识别格式是不相同的

        UNix-like:ELF格式的程序

        windows:exe,msi

            linux:wine模拟windows库

            windows:Cywin虚拟出linux运行环境

    系统级开发:C/C++:httpd,vsftpd,nginx

        go编程语言:新贵

        C/C++编程依赖于系统上的标准库

    应用级开发:java/Python/perl/ruby/php

        java:hadoop,hbase,(jvm)运行环境

        Python:openstack 云管理平台,(pvm)

        perl:(perl)perl的解释器

        ruby:(ruby)解释器/虚拟机{运行环境} 

        php:(php)

        //一般解释器或者虚拟机{jvm,pvm} 使用C/C++编写

        php:世界上最好的语言

c/C++程序格式:    

    源代码:文本格式的程序代码

        编译开发环境:编译器、头文件、开发库

    二进制格式:文本格式的代码-->编译器-->二进制格式(二进制程序、库文件、配置文件)

java/python 

    源代码:编译成能够在其虚拟机(jvm/pvm)上运行的格式

        开发环境:编译器、开发库

    二进制:

    项目构建工具://不再需要考虑程序编译主次关系,由项目构建关系负责,项目构建工具借助于配置文件实现

        c/c++:make

        java:maven

    程序包管理器:

        源代码 --> 目标二进制格式 -->组织成为一个或有限几个“包”文件;

            安装、升级、卸载、查询、校验等操作

        程序包管理器:

            debian:kali,ubuntu //dpt,dpkg , ".deb"

            redhat:rhel,centos,fedora //redhat package manager,rpm , ".rpm" //perl-C现在使用的是C语言写的

                    //rpm:rpm is package manager;成为标准

            slckware:S.u.S.E:  //rpm,suse的rpm和rhel的是不兼容的,suse为rpm开发了一个重要的库,后期被rhel收纳

                     //rpm:".rpm" 命令rpm

            Gentoo: //采用了freebsd的机制,ports的包机制

            Archlinux //轻量级,

    源代码:name-VERSION.tar.[xz,gz,bz2]

        VERSION:major-minor-release

            major:重大改变

            minor:局部改变

            release:修复bug,小串代码改变

    rpm包命令格式:

        vsftpd-3.0.2-10.el7.x86_64.rpm

        name-VERSION-release.arch.rpm

        release:是制作rpm包的次数

        VERSION.release是源代码的release

        arch:architecture:i386,x64(amd64),ppc(powerpc),noarch(通用平台)

            i386:支持较老版本的32bit cpu

            i686:支持较新版本的32bit cpu

        拆包:

            redis-3.0.2.tar.gz--> redis.3.0.2-1.el7.x86_64

            //把一个包的多种功能,拆成多个部分,按需组织rpm包

            //主包和分支包

            主包:name-VERSION-release.arch.rpm

            支包:name-function-VERSION-release.arch.rpm

                function:devel,utils(工具程序),libs,plugins(插件)

    依赖关系:每个程序包的功能都很简单,包之间存在很复杂的依赖关系

        x,y,z

            x-->y,z

                y-->a,c,b

                c-->Y

        前端工具:自动解决依赖关系

            yum:rpm包管理器的前端工具

            apt-get(apt-cache):deb包

            zypper:suse上的rpm包管理器

            dnf:Fedora 22+ 系统上的rpm包管理器的前端工具

    程序包管理:

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

        1.程序包的组成清单(每个程序包单独实现)

            文件清单

            安装或卸载时运行的脚本

        2.数据库(公共)

            程序包的名称和版本

            依赖关系

            功能说明

            安装生成的各文件路径及校验码信息

            /var/lib/rpm/ rpm数据库所在

二、获取程序包的途径:

    1.系统发行版的光盘或者官方的文件服务器

        http://mirrors.aliyun.com

        http://mirrors.sohu.com

        http://mirrors.163.com

    2.项目官方站点

        apache官网:www.apache.org

        zabbix:www.zabbix.com

    3.第三方组织

        (a)EPEL:

            mirrors.aliyun.com/epel/7/x86_64

        (b)搜索引擎

            pkgs.org

            rpmfind.net

            rpm.pbone.net 

    4.自己动手,丰衣足食

    建议:校验,检查其合法性

        来源合法性:

        程序包的完整性:

三、Centos上rpm命令管理程序包

(1)安装

    安装,升级,卸载,查询和校验,数据库维护

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

    -i :install

        -v  verbose通用选项,显示过程

        -vv 更详细

        -h 以hash输出进度条

        --test 仅仅是检查一下,测试不安装

        --nodeps //忽略依赖关系,no dependce

        --replacepkgs //替代安装

        --noscripts //有些程序包安装过程中,可能需要运行一段自带脚本,

        rpm可以自带脚本:

            四类:

                preinstall:安装之前,%pre

                postinstall:安装完成之后,%post

                preuninstall:卸载开始前,%preun

                postuninstall :卸载完成之后,%postun

            --noscripts

            --nopre

            --nopost

            --nopreun

            --nopostun

        --nosignature //来源合法性,不检查包签名信息

        --nodigest //不检查包完整幸信息,头文件摘要

    -U :update,-F --freshen//使更新

    -e :--erase

    -q:--query

        -l :list生成文件

    -V:--verify校验

    数据库维护:

        --builddb,--initdb

(2)升级

    -U update

    Uvh /Fvh

    rpm {-U|--upgrade} [install-options] PACKAGE_FILE ... //和安装一样

        -U 升级或者安装,有没有老版本,都会安装

        -F 升级,有老版本才会安装

        --oldpackage :降级安装老的程序包,不兼容

        --force:强制升级

        其他和rpm -ivh 一样

    注意:

        (1)不要对内核做升级操作,更新内核需要重启系统

            //linux支持多内核版本并存,因此,直接安装新版本内核即可

        (2)如果某源程序包的配置文件,安装后曾被修改过,升级时,新版本的程序提供的同一个配置那文件不会覆盖原有的

            配置文件,而是把新版本的配置文件,重命名后(filename.rpmnew)后,提供

(3)卸载

    -e 

        --allmatches //假如存在多版本的话,多版本一并删除

        --nodeps  //忽略依赖关系

        --test  //dry run 仅仅测试

        --noscripts //不执行脚本

        rpm -e zsh //pack_name zsh即可,数据库中有文件保存

        rpm -ivh 文件名 

(4)查询

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

    -q  zsh //查询指定包zsh是否安装

        select-options:

            -a,--all 不加选项,查询所有已经安装的包

                rpm -qa |grep zsh

            -f /etc/fstab 查询文件的安装包

            -g,--group 组名//查询指定包组中包含的包

            -p,--packaeg package_file:实现查看未安装包的,结合query-optionss实现

                rpm -qpl zsh-5.0.2-14.el7.x86_64.rpm //查询未安装程序包的安装能够生成文件

            --wahtprovice CAPABILITY//查询提供某种能力的包

                rpm -q --whatprovide 'config(bash)'

            --whatrequires CAPABLITY //查询指定的CAPABILITY被哪个程序包所依赖

        query-options

            --changelog //查询rpm包的changelog,不是源码的

                rpm -q --changelog zsh //查看zsh的改进日志

            -l,--list //程序包安装生成的所有文件列表

                rpm -ql zsh

            -i info,查询程序包相关信息,版本号,大小,所属的包组,等

                rpm —qi bash

            -c ,--configfiles:查询指定的程序包的配置文件

                rpm -qc  bash

            -d,--docfile :查询指定的程序包的帮助文档

                rpm -qd bash

            --provides:列出指定的程序包提供的CAPABILITY

                rpm -q --provides bash //bash提供的

                rpm -q --whatprovides 'config(bash)'

            -R requires//查询指定程序包的所依赖的程序包

                rpm -qR bash

            --scripts //查询脚本

                rpm -q --scripts bash

                rpm -qp --scripts zsh-5.0.2-14.el7.x86_64.rpm

        ql,qf,qc,qi,qd    //qf文档的产生源

(5)校验

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

    -V //rpm -V zsh //安装完成后,校验

<code>       </code><code>S file Size differs</code>

<code>       </code><code>M Mode differs (includes permissions and file type)</code>

<code>       </code><code>5 digest (formerly MD5 sum) differs</code>

<code>       </code><code>D Device major/minor number mismatch</code>

<code>       </code><code>L readLink(2) path mismatch</code>

<code>       </code><code>U User ownership differs</code>

<code>       </code><code>G Group ownership differs</code>

<code>       </code><code>T mTime differs</code>

<code>       </code><code>P caPabilities differ</code>

        rpm -ql zsh //随意修改其中一个文件

        rpm -V zsh //就能看到效果 

        select-options:和查询的select-options一样

            -a,-f,-g,-p

        verify-options:

            --nodeps 不校验依赖

            --nodigest 不校验包头,

            --noscripts 不检查脚本

            --nofiles 不检查

            --nosignature 不检查包头签名信息

        //默认检查所有属性

         rpm -V --nofiles zsh

(6)包来源合法性验证和完整性验证

    来源合法性验证:

    数字签名:非对称加密:一个公钥,一个私钥

        包的制作者,

        1.首先使用单项加密,计算出包的特征码,定长输出

        2.然后再用自己的私钥加密特征码,这叫数字签名 ,

        3.把加密后的特征码附加到包后    

    //只要拿到公钥,就能解密

        中间者:能够解密特征码,因为能拿到对方公钥,但是不能再次加密,因为没有作者的私钥

    //用户拿到作者的公钥,进行解密特征码,解密成功,则认为来源合法

    //我用同样的方法,进行单项加密计算特征码,一样则证明包内容没有修改过//完整性

    如何拿到对方的公钥:

        1.从网上下载,不可靠

        2.互联网上是使用CA来实现,可靠手段拿到对方公钥

    rpm --import /mnt/RPM-GPG-KEY-CentOS7 //导入公钥

        /etc/pki/rpm-gpg/ 导入到此地

        对于CentOS发行版:rpm --import

    rpm -ivh zsh-***** //自动进行校验操作

    rpm -K zsh-5.03..... //手动验证

    验证:

        安装此组织签名的程序时,会自动执行验证

        手动验证:rpm -K PACKAGE_FILE 

        1

    数字签名:保证来源合法性和数据完整性

(7)数据库重建

        rpm管理数据库路径:/var/lib/rpm/

            查询操作:就是基于该数据库查询

            Centos6:man rpm //rpm --initdb|--rebuilddb

            Centos7:man rpmdb

        rpmdb 

            --initdb  初始化db,当前无任何数据库时创建一个新的,当前有,不执行任何操作

            --rebuildb 重建db,重新构建,通过读取当前系统上所有已经安装过的程序包进行重新创建

            --dbpath 指定db路径

            rpmdb --initdb --dbpath=/tmp/rpm

四、rpm命令小结

linux程序包管理器,rpm包管理器

<code>    </code><code>安装:rpm -ivh ,--nodeps,--replacepkgs</code>

<code>    </code><code>卸载:-e,--nodeps</code>

<code>    </code><code>升级:-U|-F vh </code><code>//F只用于升级,--nodeps,--oldpackage</code>

<code>    </code><code>查询:-q,-a,f,i,qd,qc,--script,changelog,provides/whatprovides,requires/whatrequires</code>

<code>    </code><code>校验:-V,</code>

<code>    </code><code>验证合法性:--import,-K手动验证,--nodigest,--nosignature</code>

<code>    </code><code>数据库重建:rpmdb --initdb --rebuilddb</code>

本文转自MT_IT51CTO博客,原文链接:http://blog.51cto.com/hmtk520/1950170,如需转载请自行联系原作者