zoukankan      html  css  js  c++  java
  • 十六、程序包管理之 rpm

    c语言程序的构建过程

    1.程序源代码 --> 预处理 --> 编译 --> 汇编 --> 链接--> 可执行程序

    • 开放源码:就是程序码,文本格式的源代码,写给人类看的程序语言,但机器并不认识,所以无法执行;
    • 编译器:将程序码转译成为机器看的懂得语言,就类似翻译者的角色,生成二进制文件;
    • 链接:在Linux上使用ld工具,将o文件和所需的库文件链接起来组成一个可正常工作的可执行程序。链接了库文件之后就可以发起一些系统调用。
      • 静态编译:.a
        • 把程序对应的依赖库复制一份到包
        • libxxx.a
        • 嵌入程序包
        • 升级难,需重新编译
        • 占用较多空间,迁移容易
      • 动态编译:.so
        • 只把依赖加做一个动态链接
        • libxxx.so
        • “连接指向”
        • 占用较少空间,升级方便
        • 指针指向,软链接
    • 可执行文件:经过编译器变成二进制程序后,机器看的懂所以可以执行的文件。

    2.二进制程序的组成部分:二进制文件、库文件、配置文件、帮助文件

    查看二进制程序所依赖的库文件:

      ·ldd /PATH/TO/BINARY_FILE

    3.包命名规则:

    源代码:name-VERSION.tar.gz | bz2 | xz;
    VERSION: major.minor.release
        主版本号.次版本号.发行号 rpm包:name-VERSION-ARCH.rpm   
    例:bash-4.2.46-19.el7.x86_64.rpm
        bash :软件名称
        4.2.46:软件版本号,主版本.次版本.发行号
        19  :软件编译的次数
        e17 : OS平台

        二进制格式: testapp-1.2.3-1.操作系统平台.cpu平台.rpm 

        源码格式: testapp-1.2.3-1.操作系统平台.src.rpm

        源码: testapp-1.2.3.tar.压缩格式(gzip,bzip2,xz,zip)

    VERSION: major.minor.release  (程序包的release)
     
    ARCH :release.arch            (rpm包的release)
       
    release:release.OS

    操作系统平台: centos: el6,el7
    常见的arch(CPU平台): x86: i386, i486, i586, i686 x86_64: x64, x86_64, amd64 powerpc: ppc 跟平台无关:noarch

    一般,源码都是打包压缩过的文件,其通常以“.gz”、“.bz2”、“.xz”结尾,源码包中包含了源码,还包含了一些有助于制作二进制rpm的文件;rpm包一般以“rpm”结尾,都是已经编译完成的,安装rpm包的过程实际上就是将包中的文件复制到Linux上,有可能还会在复制文件的前后执行一些命令,如创建一个必要的用户,删除非必要文件等。

    4.包管理器:

    • debian:deb文件, dpkg包管理器
    • redhat: rpm文件, rpm包管理器
    • rpm: Redhat Package Manager
      • RPM Package Manager

    5.包的分类与拆包
      Application-VERSION-ARCH.rpm: 主包
      Application-devel-VERSION-ARCH.rpm 开发子包
      Application-utils-VERSION-ARHC.rpm 其它子包或支包
      Application-libs-VERSION-ARHC.rpm 其它子包

    注意:包之间可能存在依赖关系,甚至循环关系;

    解决依赖包管理工具:
      yum:rpm包管理器的前端工具
      apt-get:deb包管理器前端工具
      zypper: suse上的rpm前端管理工具
      dnf: Fedora 18+ rpm包管理器前端管理工具

    6.获取程序包的途径:

    (1) 系统发版的光盘或官方的服务器;
    CentOS镜像:
      https://www.centos.org/download/
      http://mirrors.aliyun.com
      http://mirrors.sohu.com
      http://mirrors.163.com

    (2) 项目官方站点

    (3) 第三方组织:
      Fedora-EPEL:
      Extra Packages for Enterprise Linux
      Rpmforge:RHEL推荐,包很全
      搜索引擎:
      http://pkgs.org
      http://rpmfind.net
      http://rpm.pbone.net
      https://sourceforge.net/

    注意:第三方包要检查其合法性、完整性!!

    7.库文件
    一些查看命令:

    ldd   /PATH/TO/BINARY_FILE    # 查看二进制程序所依赖的库文件
    ldconfig -p   # 显示本机已经缓存的所有可用库文件名及文件路径映射关系

    8.程序的配置文件和缓存文件:
    配置文件:
      /etc/ld.so.conf 全部放到一个文件中,或
      /etc/ld.so.conf.d/*.conf 此文件目录下.cong结尾的文件,方便一个程序写一个配置文件 

    缓存文件:
      /etc/ld.so.cache


    一、程序包管理器:

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

    包文件组成 (每个包独有)
      RPM包内的文件
      RPM的元数据,如名称,版本,依赖性,描述等
      安装或卸载时运行的脚本

    数据库(公共):/var/lib/rpm
      程序包名称及版本
      依赖关系
      功能说明
    包安装后生成的各文件路径及校验码信息

    ll  /var/lib/rpm/
    total 75612   
    -rw-r--r--. 1 root root  5521408 Oct 23 18:48 Basenames
    -rw-r--r--. 1 root root    12288 Oct 23 18:47 Conflictname
    -rw-r--r--. 1 root root    73728 Dec  4 11:57 __db.001
    -rw-r--r--. 1 root root   229376 Dec  4 11:57 __db.002
    -rw-r--r--. 1 root root  1318912 Dec  4 11:57 __db.003
    -rw-r--r--. 1 root root   753664 Dec  4 11:57 __db.004
    # 这个rpm包数据库文件夹中包含着现有已经安装的包的各种信息,包括安装版本,安装时间、升级时间、卸载时间等等非常重要,最好备份

    二、rpm命令使用

    在CentOS系统上用rpm管理程序包,

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

    2.1、安装:

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

        -v  : verbose

        -vv:更详细

        -h :以#显示程序包管理执行进度,每个#表示2%的进度

      

    rpm -ivh  PACKAGE_FILE ...   # 安装某程序包
    
    [install-options]
        --test: 测试安装,但不真正执行安装,即dry run模式
        --nodeps:忽略依赖关系
        --replacepkgs | replacefiles  重新安装
          # 对于已经安装过的包,如果不经过卸载,只是删除其一些文件,就会导致这个程序无法使用,

          我们再重新安装这个程序包时,会显示此包已经安装,是因为在/var/lib/rpm这个文件中有该程序的安装记录。
          所以这种情况下要想重新安装这个程序包就需要rpm -ivh --replacepkgs 这个选项!
    --nosignature: 不检查来源合法性 --nodigest:不检查包完整性 --noscripts:不执行程序包脚本
    %pre: 安装前脚本; --nopre %post: 安装后脚本; --nopost %preun: 卸载前脚本; --nopreun %postun: 卸载后脚本; --nopostun

    注意:

    我们在rpm安装时截图中红框位置显示nokey是因为我们没有导入RPM-GPG-KEY-CentOS-7这个检查工具来检查其合法性,

    导入后即可显示
    rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 

    rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 (centos6)

    导入公钥即可检查,这样在安装来源合法的程序包时就不在显示nokey。

    2.2、升级

    rpm {-U|--upgrade}  [install-options]  PACKAGE_FILE...
      upgrade  # 安装有旧版程序包,则“升级”;如果不存在旧版程序包,则“安装”
    rpm {-F|--freshen}  [install-options]  PACKAGE_FILE...
      freshen  # 安装有旧版程序包,则“升级”;如果不存在旧版程序包,则不执行升级操作
    rpm -Uvh PACKAGE_FILE ...
    rpm -Fvh PACKAGE_FILE ...
    
    --oldpackage:降级
    --force: 强制安装

    注意:

    (1) 不要对内核做升级操作;Linux支持多内核版本并存,因此,直接安装新版本内核;

    (2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留。

    (3) 程序包版本升级了,但是旧配置文件和新配置文件一模一样,此时新版本根本不会装进来;只保留旧版本和你修改过版本格式

    2.3、查询 

    rpm {-q|--query} [select-options] [query-options]
    [select-options]
        -a: 所有包    (常用)
        -f: 查看指定的文件由哪个程序包安装生成 (常用)
        -p rpmfile:针对尚未安装的程序包文件做查询操作 (常用)
        --whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供
        --whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖
    
    [query-options]
        --changelog:查询rpm包的changelog
        -c: 查询程序的配置文件
        -d: 查询程序的文档
        -i: information (常用)
        -l: 查看指定的程序包安装后生成的所有文件 (常用)
       

    --scripts:程序包自带的脚本 --provides: 列出指定程序包所提供的CAPABILITY -R: 查询指定的程序包所依赖的CAPABILITY rpm2cpio 包文件|cpio –itv 预览包内文件 rpm2cpio 包文件|cpio –id “*.conf” 释放包内文件

      

    2.4、卸载

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

    注意:由于我们在安装程序包是会同时安装许多依赖文件,而这种卸载方法只是卸载程序本身,并不同时将依赖文件卸载,所以要想完整卸载的话需要用yum

    yum history  # 查看历史记录,找到是第几部的操作
    yum  history undo #    # 表示对历史操作中的第#想进行反操作

    2.5、校验程序包

       rpm -V [selection-option] [verify-options] [PACKAGE_FILE...]
    
       校验的内容
    
                    S:大小改变
    
                    5:md5
    
                    T: modify timestamp
    
                    D:device,主次设备号不匹配
    
                    L:link路径
    
                    U:user
    
                    G:group

    导入所需要公钥
    rpm -K|checksig rpmfile 检查包的完整性和签名
    rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    CentOS 7发行版光盘提供:RPM-GPG-KEY-CentOS-7
    rpm -qa “gpg-pubkey*”

    在程序包安装前对包的来源合法性及完整性验正

           完整性验正: md5,sha1,sha128,sha256,sha384,sh512 

           来源合法性: RSA

              对来源合法性和完整性验正: GPG

     加密类型:

        对称加密:加解密同一密钥

        非对称加密 加解密不同密钥,pk(public key) sk(secre key)

        1、用一个密钥加密,只能用与之匹配的另一个密钥解密

         2、私钥不能公开,公钥公开

     对将要安装的程序包的校验

       1、程序包提供的公钥导入至系统: rpm -import RPM-GPG-KEY-CentOS-7    

       2、程序包安装时,不再出现错误信息

    数据库维护

      位置;/var/lib 程序的状态信息

      当数据库损坏时,重建数据库

       --rebuildb 直接重建

       --initdb  存在数据库不会重建,不存在时,重建

  • 相关阅读:
    Java 7如何操纵文件属性
    MS Server中varchar与nvarchar的区别
    【Unity3D】【NGUI】UICamera
    2007LA 3902 网络(树+贪心)
    读取图片的几种方式
    AssetsLibrary 实现访问相册,选取多张照片显示
    UIImagePickerController的用法
    画板的实现
    最近的状态
    富文本的使用-----实现图文混排 文字的检索 (正则表达式)
  • 原文地址:https://www.cnblogs.com/liuzhiyun/p/11369408.html
Copyright © 2011-2022 走看看