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

8月20日程序包管理

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

8月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:查询指定的程序包是否已经安装,及其版本;

8月20日程序包管理

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

8月20日程序包管理

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

8月20日程序包管理

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


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

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

8月20日程序包管理

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

8月20日程序包管理

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

8月20日程序包管理

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

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

8月20日程序包管理

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

8月20日程序包管理

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

8月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

8月20日程序包管理

8月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客户端所指定的文件

8月20日程序包管理

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

主配置文件

8月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

8月20日程序包管理

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

教室的yum

8月20日程序包管理

8月20日程序包管理

8月20日程序包管理

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

配置yum仓库

8月20日程序包管理

8月20日程序包管理

配置好以后查看yum仓库

8月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)
1515218807015152188070
上一篇 2016-08-21
下一篇 2016-08-21

相关推荐

  • 正则表达与扩展正则表达

    说到正则表达式那就不得不说grep命令: 1.grep命令的作用:grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。2.格式 2.命令格式 :grep [options] 3.主要参数: gre…

    2017-08-07
  • shell脚本编程之if、case条件语句

    程序执行三种顺序     顺序执行          选择执行          循环执行       &nb…

    Linux干货 2016-08-18
  • 软件包管理利器之一&RPM

      概述:我们知道使用源代码进行软件编译可以具有定制化的设置,但对于Linux distribution的发行商来说,则有软件管理不易的问题,毕竟不是每个人对于操作系统都非常的熟悉,不是每个人都会进行源代码编译的,因此如果能够将软件现在相同的硬件与操作系统上编译好才发行的话,如果再加上简易的安装/删除/管理等机制,则对于软件管理会简单的多…

    Linux干货 2016-08-24
  • Linux的哲学思想

    Linux的哲学思想 一切皆文件 在linux中所有的一切,都是可以通过ls进行查询的到的,甚至可以说ll查看详细信息时表现形式为文件,所有的设备,所有的文件不论后缀,只是一个单纯文件通过vim可以编辑一切 单一目的的小程序,组合小程序完成复杂任务 在linux中,每一个命令都是对应一个功能,通过不同的参数来完成不同的要求,通过繁多的小的命令来完成大型的要求…

    Linux干货 2016-10-30
  • nginx在linux系统应用详解之一基础介绍和全局配置

    一、nginx简介       1、特点:           (1)nginx服务器既可以作为HTTP服务器,也可以作为反向代理服务器,还可以作为邮件服务器;           (2)能够快速响应静态页面的请求;  …

    2017-06-19
  • 磁盘管理

    磁盘,分区,文件系统

    Linux干货 2017-12-02