8月20日程序包管理

程序包管理

概述

   API:Application Program Interface应用编程接口
   ABI:Application Binary Interface应用二进制接口
   Unix-like,
      ELF
   Windows
      exe,msi

   库级别的虚拟化:  
           linux:WinE(模拟windows)
           Windows:Cywin(模拟linux)
   系统级开发:
      C/C++:httpd,vsftpd,nginx
      go

   应用级开发:
         java/python/perl/ruby/php
         java:hadoop,hbase,(jvm(java虚拟机))
         Python:openstack,(pvm(python虚拟机))
         perl:(per解释器)
         php:(php解释器)

   c/c++程序格式:
       源代码:文本格式的程序代码;
       编译开发环境:编译器、头文件、开发库
       二进制格式:文本格式的程序代码->编译器->二进制格式(二进制程序、库文件、配置文件、帮助文件)


java/python程序格式:
       源代码:编译成能够在其虚拟机(jvm/pvm)运行的格式;
       开发环境:编译器、开发库

     二进制:

项目构建工具:
    c/c++:make
    java:maven

程序包管理器:

   源代码-->目标二进制格式(二进制程序、库文件、配置文件、帮助文件)-->组织成为一个或有限几个“包”文件;
      安装、升级、卸载、查询、校验


   程序包管理器:
       debian:dpt,dpkg,".deb"
       redhat:redhat package manager,rpm, ".rpm";rpm is package manager;
       S.u.S.E:rpm,".rpm",

       Gentoo:ports
       Archlinux:

   源代码:name-VERSION.tar.gz
        VERSION:major,minor,release

rpm包命名格式:

    name-VERSION-release.arch.rpm
        VERSION:major.minor.release
        release.arch:rpm包的发型号
           release.os:3.el7.i386.rpm(适用于redhat7,32为的程序包,第三次制作的程序包)
           archetecture(架构):i386,x64(amd64),ppc,noarch

   redis-3.0.2.tar.gz-->redis-3.0.2-1.centos7.x64.rpm (包命名格式)

   changelog

     拆包:主包和支包
        主包:name-VERSION-release.arch.rpm
        支包:name-function(功能)-VERSION-release.arch.rpm
           function:devel,utils,libs,...

依赖关系:

 包和包之间存在复杂的依赖关系
  X,Y,Z

       X-->Y,Z
          Y-->A,B,C
          C-->Y
       循环依赖关系

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

      yum:rhel系列系统上rpm包管理器的前端工具;
      apt-get(apt-cache):deb包的管理器的前端工具;
      zypper:suse的rpm管理器前端工具;
      dnf:Fedora 22+系统上rpm包管理器的前端工具;

程序包管理器:

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

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

         /var/lib/rpm/ :这个路径下所存放的是rpm包的数据库

获取程序包的途径:

   (1)系统发行版的光盘或官方文件服务器(或镜像站点):
        htty://mirrors.allyun.com
        htty://mirrors.sohu.com
        htty://mirrors.163.com
    (2)项目的官方站点
   (3)第三方组织:
          (a)EPEL:
          (b)搜索引擎
                htty://pkgs.org

                htty://rpmfind.net

                htty://rpm.pbone.net
    (4)自己动手,丰衣足食

     建议:检测其合法性
         来源合法性:
         程序包的完整性;

centos系统上rpm命令管理程序包:

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

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

安装:卸载时用的是name包名

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

      GENERAL OPTIONS:通用选项
             -v: verbose,详细信息
             -vv:更详细的输出

安装时真正用的是:rpm -ivh PACKAGE_FILE,例如:

月20日程序包管理"

  [install-options]:
            -h:hash marks输出进度条;每个#表示2%的进度;
            --test:测试安装,检测并报告依赖关系及冲突消息等;
            --nodeps:忽略依赖关系;不建议,即使装上也没法用;
            --replacepkgs:重新安装,例如先把/etc/zshrc里的文件改掉,但我不知道修改哪里且无法复原,我就需要重新安装一下包来恢复。
                        但是,这里的修改系统会认为是认为故意的,所有不会恢复。这时候要删除整个/etc/zshrc,再重新安装包

月20日程序包管理"

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

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

升级:用的是file,包的路径

    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)不要对内核做升级操作;linux支持多内核版本并存,因此,可以直接安装新版本内核;
              (2)如果某原程序包的配置文件安装后被修改过,升级时,新版本的程序提供的同一个配置文件不会覆盖原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供;

卸载:卸载时用的是name包名,不需要路径

        rpm{-e|--erase}[--allmatches][--nodeps][--noscripts][--test] PACKAGE_NAME...

         --allmatches:卸载所有匹配指定名称的程序包的各版本;

         --nodeps:忽略依赖关系
         --test:测试卸载,dry run模式

查询(非常重要):查询时用的是name包名,不需要路径

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

        [select-options]
           PACKAGE_NAME:查询指定的程序包是否已经安装,及其版本;

月20日程序包管理"

           -a,--all:查询所有已经安装过的包,这里可以用正则表达式

月20日程序包管理"

           -f FILE(路径) :查询指定的文件由哪个程序包安装生成;非常有用

月20日程序包管理"

           -p,--package PACKAGE_FILE:用于实现对未安装的程序包执行查询操作;


           --whatprovides CAPABILITY:查询指定CAPABILITY由哪个程序包提供;
           --whatequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖;

        [query-options]
           --changelog:查询rpm包的changlog;
           -l,--list:程序安装生成的所有文件列表;

月20日程序包管理"

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

月20日程序包管理"

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

月20日程序包管理"

           -d,--docfiles:查询指定的程序包提供的文档;

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

月20日程序包管理"

           -R,--requires:查询指定的程序包的依赖关系

月20日程序包管理"

           --scripts:查看程序包自带的脚本片段

月20日程序包管理"

     用法:
          -qi PACKAGE(查询information),-qf FILE(指定文件由哪个包安装生成),-qc PACKAGE(配置文件),-ql PACKAGE(程序包安装生成的文件列表),-qd PACKAGE(程序包安装生成的文档)
          -qpi PACKAGE_FILE,-qpl PACKAGE_FILE,-qpc PACKAGE_FILE.....查询未安装的程序包的相关信息

校验:

     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数据指纹信息,文件的di5码发送改变
    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  capabilities改了

     可以指明检测哪些信息,也可以指明不检查哪些信息

包来源合法性验证和完整性验证:

 来源合法性验证:印签,数字签名
 完整性验证:
 制作者制作一个rpm包,第一步要先使用单向加密算法去提取出包的特征码来,特征码是定长的。
 第二部,制作者会用自己的私钥去加密这段特征码,然后附加在文件后面。
 使用者拿到这个包后,第一步验证来源合法性,拿到制作者的公钥,解密这段特征码。
 同样的用单向加密算法对包做计算,算出特征码,只要数据没改变,和以前的特征码一定是一样的。二者一样,包的完整性就得到了验证。
 如何获得合法的公钥,通过第三方加密机构获得,要通过可靠手段来拿到

 获取并导入信任的包制作者的密钥:
   对于centos发行版来说:rpm --import/etc/pki/rpm-gpg/RPM-GPG-KEY-Centos-7

月20日程序包管理"

月20日程序包管理"

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

数据库重建:
rpm管理器数据库路径:/var/lib/rpm/  
   查询操作:通过此处的数据库进行;

 获取帮助:
   centos 6:man rpm
   centos 7:man rpmdb

   rpm{--initdb|--rebuildbd}[--dbpath DIRECTORY][--root DIRECTORY]
      --initdb:初始化数据库,当前无任何数据库可实施化创建一个新的;当前有时不执行任何操作;
      如果实现不存在数据库,则新建之;否则,不执行任何操作

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

      无论当前存在与否,直接重新创建数据库

回顾

linux程序包管理的实现、rpm包管理器

  rpm命令实现程序管理
     安装:-ivh,--nodeps,--replacepkgs
     卸载:-e,--nodeps
     升级:-Uvh,-Fvh,--nodeps,--oldpackage
     查询:-q,-qa,-qf,-qi,-qd,-qc,--scripts,-q --changlog(查询更新日志),-q --provides,-q --provides,-q --requires
     校验:-V

     导入GPG密钥:--import,-K,--nodigest,--nosignature
     数据库重建:--initdb,--rebuilddb

linux程序包管理(2)

  Centos:yum,dnf

  ftp://172.16.0.1/pub/

yum是用来解决依赖关系的,自动解决依赖关系,完成包的安装

yum是cs架构的工具,工作前提要求本地客户端可达的网络上,首先,这可以是一个文件服务器,可以提供很大的存储空间,在这个空间上放置所有对我们有用的rpm包。这个目录文件共享的方式输出到外部主机,让主机能够访问。可以有linux主机,可以支持yum工具的使用,当用户需要安装程序包的时候,可以不用rpm命令,而使用yum,接到命令后会根据本地所指向的提供服务的访问地址(URL),互联网提供共享服务的服务器有很多。

yum需要一个配置文件指明要访问网络中的哪一个服务器。yum在接收到安装程序包的指定后,会尝试通过文件中 的配置指定去找远程的服务器。服务器会提供一个程序包仓库,会有一个元数据信息,指明仓库中存放的包名,版本等。yum安装程序包时去找仓库的时候,yum会首先请求服务器把元数据文件发过来,先放置在本地的缓存区域中(cache),yum就开始分区这个cache,看有没有用户想要的程序包的包名,如果有就开始尝试读取这个包。每一个包和程序包之间可能会存在依赖关系,还会去尝试根据元数据文件取分析依赖关系。接下来去查询本地以安装的程序包,分析完后把剩余的尚未安装的包给列出来,和我们要安装的程序包给列出来,最后把自己扮演为文件客户端的角色,去尝试连线对应的文件服务器,开始去下载对应的程序包文件。

下载完先缓存在本地,在本地执行类似于rpm的安装操作,安装时会自动先安装被依赖的程序包,安装完成开始返回告诉客户端安装完成,安装完会把缓存中的文件删除。安装完成后会自动删除程序包,但元数据文件不会删除。因为下次再安装程序包时,直接分享本地的元数据就可以了。如果远程服务器中的包,依赖关系之类的发送改变,元数据文件也会发生改变。

yum每次都会远程到服务器去请求元数据。在仓库上,元数据文件不止一个,服务器中还有一个特殊文件,这个文件记录了没一个元数据文件的校验码,本地缓存的文件也有校验码,每一次yum到服务器客户端请求元数据时会先请求校验码,先拿到校验码和本地对比是不是发生改变,只有文件没变校验码一定不变。检测完一样,本地缓存继续有效,否则还是请求重新下载元数据文件。可以大大节约网络带宽,还能保证本地缓存文件是最新版本的。

查询本地程序包,发现分析本地元数据文件时,但远程服务器连不上。这是看自己是否要用未知的文件。

yum不是rpm的取代者,只是rpm的前端管理工具,yum是依赖rpm才能存在的。yum解决安装问题,rpm在后台完成查询等各种管理操作,对后期应用很有用。

本地进行yum操作,需要自行去配置一台服务器主机,配置成文件服务器。一般yum所支持的文件服务器有两种:1、ftp 2、http。把这些文件创建出元数据文件。有一个命令去生成,元数据文件是通过分析每一个程序包的元数据,再从中抽取出来给罗列在元数据文件中实现的。工具creatrepo

creatrepo用来创建高级程序包时比较困难

YUM:yellow dog,Yellowdog Update Modifier

yum repository:yum repo
     存储了众多rpm包,以及包的相关的元数据文件(放置于特定的目录下:repodata):

     安装过程也会用到依赖关系分析,用到仓库,默认仓储都是本地光盘当仓库来使用,操作系统的安装镜像光盘,本身就是一个仓库。repodata目录所在的位置就是仓库应该指向的路径,并不是rpm包所在的目录是仓库,而是repodata这个目录所在的位置应该是仓库所指向的路径。

     文件服务器:
        ftp://
        http://
        nfs://
        file:///   本地仓库,把镜像光盘当仓库

yum客户端所指定的文件

月20日程序包管理"

配置文件: /etc/yum.conf:为所有仓库提供公共配置(主配置文件通常只提供各yum仓库指向的公共配置) /etc/yum.repos.d/*.repo:为仓库的指向提供配置(可以配置一个或多个仓库指向)

主配置文件

月20日程序包管理"

定义yum的特性

仓库的定义:
[reposotoryID]
name-Some name for this repository
baseur1-ur1://path/to/repository/
enabled={1|0}默认为1,仓库是否可以用
gpgcheck={1|0}:安装前是否坚持完整性或来源合法性
gpgkey=URL:密钥文件
enablegroups={1|0}是否支持在此仓库上使用组
failovermethod={roundrobin|prority}故障转移方法,默认为roundrobin意为随机挑选
cost=1000 :开销数字,默认为1000

仓库id

月20日程序包管理"

每一个中括号当中定义了一个配置段,可能只对某一段生效

教室的yum

月20日程序包管理"

月20日程序包管理"

月20日程序包管理"

月20日程序包管理" repodata上一级目录,就是目前这一级

配置yum仓库

月20日程序包管理"

月20日程序包管理"

配置好以后查看yum仓库

月20日程序包管理"

这样就可以使用了

yum命令的用法:

yum [options] [command] [package...]


command is one of:
        * install package1 [package2] [...]
        * update [package1] [package2] [...]
        * update-to [package1] [package2] [...]
        * update-minimal [package1] [package2] [...]
        * check-update
        * upgrade [package1] [package2] [...]
        * upgrade-to [package1] [package2] [...]
        * distribution-synchronization [package1] [package2] [...]
        * remove | erase package1 [package2] [...]
        * autoremove [package1] [...]
        * list [...]
        * info [...]
        * provides | whatprovides feature1 [feature2] [...]
        * clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
        * makecache [fast]
        * groups [...]
        * search string1 [string2] [...]
        * shell [filename]
        * resolvedep dep1 [dep2] [...](maintained for legacy reasons only - use repoquery or yum provides)
        * localinstall rpmfile1 [rpmfile2] [...](maintained for legacy reasons only - use install)
        * localupdate rpmfile1 [rpmfile2] [...](maintained for legacy reasons only - use update)
        * reinstall package1 [package2] [...]
        * downgrade package1 [package2] [...]
        * deplist package1 [package2] [...]
        * repolist [all|enabled|disabled]
        * repoinfo [all|enabled|disabled]
        * repository-packages <enabled-repoid> <install|remove|remove-or-rein‐stall|remove-or-distribution-synchronization> [package2] [...]
        * version [ all | installed | available | group-* | nogroups*  |  grou‐plist | groupinfo ]
        *    history   [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
        * load-transaction [txfile]
        * updateinfo [summary | list | info | remove-pkgs-ts |  exclude-updates| exclude-all | check-running-kernel]
        * fssnapshot [summary | list | have-space | create | delete]
        * fs [filters | refilter | refilter-cleanup | du]
        * check
        * help [command]


常用:
显示仓库列表:
  repolist [all|enabled|disabled]

显示程序包:
  list
      # yum list [all | glob_exp1] [glob_exp2] [..]
      # yum list {available|installed|updates}[glob_exp1][..]

安装程序包:
   install package [package2] [...]

   reinstall package1 [package2] [..] (重新安装)

升级程序包:
  update package1 [package2] [...]

  downgrade package1 [package2] [...] (降级)

检测可用升级:
  check-update

卸载程序包:
  remove | erase package1 [package2] [..]

查看程序包information
  info [..]

查看指定的特性(可以是某文件)是由哪个程序包提供:
  provides | whatprovides features [features] [..]

清理本地缓存:
  clean [ pakages|metdata|expire-cache|rpmdb|plugins|all]

构建缓存:
  makecache

搜索:
  search string1 [string2] [..]

  以指定的关键字搜索程序包名及summary信息;

查看指定包所依赖的capabilities:
   deplist package1 [package2] [...]

查看yum事务历史:
  history   [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]

安装及升级本地程序包:
   * localinstall rpmfile1 [rpmfile2] [...](maintained for legacy reasons only - use install)
   * localupdate rpmfile1 [rpmfile2] [...](maintained for legacy reasons only - use update)

包组管理的相关命令:
  groupinstall group1 [group2] [..]
  groupupdate group1 [group2] [..]
  grouplist [hidden] [groupwildcard] [..]
  groupremove group1 [group2] [..]
  groupinfo group1 [..]

原创文章,作者:15152188070,如若转载,请注明出处:http://www.178linux.com/38248

(0)
上一篇 2016-08-21 20:46
下一篇 2016-08-21 20:46

相关推荐

  • N25-第三周博客作业

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 [root@node1 ~]# who | cut -d" " -f1 | uniq (unknown) root 2、取出最后登录到当前系统的用户的相关信息…

    Linux干货 2016-12-17
  • shell中if条件字符串、数字比对,[[ ]]和[ ]区别

    今天学习shell, if条件流程控制,但发现if[ ]]和if[ ]什么时候用不是清楚,正好看到一篇文章,非常好,转载,留个备份。 参考: http://www.51testing.com/?uid-7701-action-viewspace-itemid-13731 http://blog.csdn.net/sunboy_2050/article/det…

    Linux干货 2016-08-12
  • 三问:linux操作系统安全加固

    三问:linux操作系统安全加固 1.为什么要进行安全加固?     安全加固的重要性不言而喻。我这里把操作系统同马斯洛需求层次做了个类比,如有不恰当之处,还请指教。同人一样,操作系统也有自己的生理需求,对于人来说生理需求无非吃喝拉撒等,而对于操作系统来说它的生理需求又是什么了?我个人认为应该是底层硬件的配置,内核的驱…

    Linux干货 2017-03-30
  • N22-第5周博客作业

    1、显示当前系统上root、fedora或user1用户的默认shell; grep -E "^(root|fedora|user1)\>" /etc/passwd | cut -d: -f7 2、找出/etc/rc.d/init.d/functions文件中某单…

    Linux干货 2016-12-05
  • 磁盘管理

    设备文件 I/O Ports: I/O 设备地址 一切皆文件: open(), read(), write(), close() 设备类型: 块设备:block ,存取单位“块”,磁盘 [root@localhost ~]# ll /dev/ brw-rw—-. 1 root disk 253, 0 Apr 29 03:53 dm-0 块设备 brw-r…

    2017-04-28
  • 啊 逗比呀!

    提示符,nano编辑,rz | sz命令,Sublime

    2017-11-19