• Linux 程序包管理-RPM


    程序简介:
      POSIX(Portable Openratin System)跨平台系统:不同操作系统平台的标准C库(glibc)都是遵循POSIX规范的,这样基于标准库开发程序的源代码可以夸平台编译(API兼容),源代码可以在Linux编译也可以在windows下编译;因为标准库都基于POSIX规范,提供的调用接口一致

      API兼容:开发库兼容,因此源代码可跨平台
      ABI兼容:编译后的程序可以跨平台运行
      同一个源代码程序同时在Windows与Linux上编译完成后,各自可以在对应系统运行,但程序不能夸平台运行,这就是ABI不兼容;现在有一种方法可以达到兼容,就是库级别的虚拟化技术Linux(WINE)、Windows(Cywin)
     库:库为函数(function)是可执行程序,本身不能作为程序执行入口,但可以被调用;是编译好的二进制格式

      编译程序的过程:预编译、编译、汇编、链接
      预编译:预编译又称为预处理,头文件的包含、宏定义的扩展、条件编译的选择等
      编译:把源代码翻译成中间代码,即汇编代码
      汇编:把作为中间结果的汇编代码翻译成机器代码,即目标代码
      连接:链接是处理可重定位文件,把它们的各种符号引用和符号定义转换为可执行文件中的合适信息(一般是虚拟内存地址)的过程
        静态链接:将库包含在程序中;程序开发阶段程序员用ld(gcc实际上在后台调用了ld)静态链接器手动链接的过程
       动态链接:程序运行期间系统调用动态链接器(ld-linux.so)自动链接的过程;windows下为dll(dynamic link library)、linux下为so(shared object)

      查看二进制程序所依赖的库文件:
      ldd /PATH/TO/BINARY_FILE

      管理及查看本机装载的库文件:
      ldconfig -p 显示本机已经缓存的所有可用库文件名及文件路径映射关系;    
      ldconfig默认搜寻/lilb、/lib64、/usr/lib64、/usr/lib以及配置文件/etc/ld.so.conf、 /etc/ld.so.conf.d/*.conf内所定义目录下的库文件,搜索出可共享的动态链接库,库文件的格式为:lib***.so.**,进而创建出动态装入程序(ld.so)所需的连接和缓存文件。缓存文件默认为/etc/ld.so.cache,该文件保存已排好序的动态链接库名字列表。
      ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令刷新缓存。

      软件包的组成部分:
      二进制程序:/bin,/sbin,/usr/sbin,/usr/local.bin,/usr/local/sbin
      库文件:/lib,/lib64,/usr/lib,/usr/lib64,/usr/local/lib,/usr/local/lib64(开发时调用API,运行时调用ABI)
      配置文件:/etc或者无须额外配置就没有配置文件
      帮助文件:man文件、info文件、README、INSTALL、ChangeLog(/usr/share/{man|doc})

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

     程序包管理器对程序进行管理所需要信息:
      数据库:程序包名称及版本、安装生成的各文件路径及校验码信息、依赖关系、功能说明(各软件包公共)
      程序组成清单:文件清单、安装卸载时运行的脚本(各软件包独有)

    程序包管理方式:
      使用包管理器:
      RedHat:rpm(包格式.rpm)
      Debian:dpkg(包格式.deb)
      SUSE:rpm(与RedHat不同,二者rpm包不通用)
      使用前端工具:
      RedHat:yum
      Fedora22+:dnf
      SUSE:zypper
      Debian:apt-get

    RPM包命名方式:
      一个程序有多个RPM包的原因:例如一个源码程序有10个功能;大多数用户只用其6个功能,余下的4个呢?把一个大的程序打包制作成多个包,6个功能作为主包,其它4个功能可以做成分包

      name-version-release.rpm
      name-version-releaseNumber.OS.arch.rpm
      ftp-0.17-54.el6.x86_64.rpm
      软件包命名格式:软件名-软件版本-发行信息
      name:软件包的名字(如果有分段表示主程序的分包)
      version:软件的版本号,版本号的格式通常为"主版本号.次版本号.修正号"(如:2.2.3)
      release:rpm包的发行信息又包括发布版本号、OS平台、硬件平台
        releaseNumber:发布版本号,表示这个RPM包是第几次编译生成的
        OS:el6:redhat enterprise linux 6
        arch:X86_64、i386,i586,i686、ppc(Power PC)、noarch(与平台无关)

      注意:软件版本号指的是软件自身版本号,发布版本号是指发行商在将软件制作为RPM包发布时的发布版本号

      包来源合法性验证:
      源码程序:通过md5或sha1校验码验证;
      rpm包:发行商提供的包是否合法可信的
        验证包完整性:校验码
        验证来源合法:公钥加密算法

    获取RPM包的途径:
      1、发行商的光盘或站点服务器
      CentOS镜像:
        http://mirrors.163.com
        http://mirrors.aliyun.com
      2、第三方组织:
      Fedora-EPEL
        https://fedoraproject.org/wiki/EPEL/zh-cn
        http://repoforge.org
      搜索引擎站点:
        http://rpmfind.net
        http://rpm.pbone.net
        http://pkgs.org
        https://sourceforge.net
      3、项目的官方站点
      4、自己制作

    CentOS系统上RPM命令管理程序包:
      安装:
      rpm {-i|--install} [install-options] PACKAGE_FILE ...
      -i  安装程序
      -v  显示安装详细过程
      -vv 显示更详细的调试信息
      -h  以#显示程序包管理执行进度,每个#表示2%的进度

      rpm -ivh PACKAGE_FILE ...
      [install-options]
      --test   测试安装,但不真正执行安装过程;dry run模式
      --prefix 指定安装路径
      --nodeps 忽略依赖关系
      --replacefiles 安装程序要创建的文件已存在直接覆盖
      --replacepkgs 某个包已安装直接重新安装
      --nosignature 不检查来源合法性
      --nodigest 不检查包完整性
      --noscipts 不执行程序包脚本片断
      --nopre   不执行安装前脚本
      --nopost  不执行安装后脚本
      --nopreun  不执行卸载前脚本
      --nopostun 不执行卸载后脚本
      --force   强行安装

      升级:
      rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
      rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
      upgrade  安装有旧版程序包则"升级";如果没有安装旧版程序包则"安装"
      freeshen 安装有旧版程序包则"升级";如果没有安装旧版程序包则不执行升级操作

      rpm -Uvh PACKAGE_FILE ...
      rpm -Fvh PACKAGE_FILE ...
      [install-options]
      --oldpackage 降级
      --force     强行升级

      注意:

      1、不要对内核做升级操作;Linux支持多内核版本可以并存,直接安装新版本内核
      2、如果原程序包的配置文件安装后被修改过,升级新版本后提供的配置文件并不会直接覆盖老版本的配置文件,新版本配置文件重命名(FileName.rpmnew)后保留

      查询:
      rpm {-q|--query} [select-options] [query-options] PACKAGE_Name
      [select-options]选择查询的包
      -q 仅查询后面接的软件名称是否有安装
      -a 所有系统当中所有安装包
      -f 查询指定的文件由哪个程序包安装生成
      -p /PATH/TO/PACKAGE_FILE  针对尚未安装的程序包文件做查询操作
      --whatprovides CAPABILITY 查询指定的CAPABILITY(文件或功能)由哪个包所提供
      --whatrequires CAPABILITY 查询指定的CAPABILITY(文件或功能)被哪个包所依赖

      [query-options]选择查询那些信息
      --changelog 查询rpm包的修改日志(不是程序包的修改日志)
      -c 查询程序的配置文件
      -d 查询程序的文档(与man有关的文件)
      -i 查询程序包的信息(information)
      -l 查看指定的程序包安装后生成的所有文件
      --scripts 查询程序包自带的脚本片断
      -R 查询指定的程序包所依赖的CAPABILITY;
      --provides 列出指定程序包所提供的CAPABILITY;

      用法:
      rpm -qi PACKAGE_Name  查询已安装程序包描述信息  
      rpm -qc PACKAGE_Name  查询已安装程序包的配置文件
      rpm -ql PACKAGE_Name  查询已安装程序包生成的所有文件
      rpm -qd PACKAGE_Name  查询已安装程序包的文档
      rpm -qf FILE_Name     查询指定的文件由哪个程序包安装生成
      rpm -qpi PACKAGE_FILE  查询未安装的程序包描述信息
      rpm -qpl PACKAGE_FILE  查询未安装的程序包在被安装后会生成的文件
      rpm -qa  查询当前系统安装的所有RPM包
    演示:
    [root@centos7 ~]# rpm -q tree
    tree-1.6.0-10.el7.x86_64

    [root@centos7 ~]# rpm -ql tree
    /usr/bin/tree
    /usr/share/doc/tree-1.6.0
    /usr/share/doc/tree-1.6.0/LICENSE
    /usr/share/doc/tree-1.6.0/README
    /usr/share/man/man1/tree.1.gz

    [root@centos7 ~]# rpm -qf /etc/fstab
    setup-2.8.71-6.el7.noarch

    [root@centos7 ~]# rpm -qc bash
    /etc/skel/.bash_logout
    /etc/skel/.bash_profile
    /etc/skel/.bashrc

    [root@centos7 ~]# rpm -qi bash
    Name : bash
    Version : 4.2.46
    Release : 19.el7
    Architecture: x86_64
    Install Date: 2016年11月06日 星期日 18时31分30秒
    Group : System Environment/Shells
    Size : 3663618
    License : GPLv3+
    Signature : RSA/SHA256, 2015年11月25日 星期三 22时14分53秒, Key ID 24c6a8a7f4a80eb5
    Source RPM : bash-4.2.46-19.el7.src.rpm
    Build Date : 2015年11月20日 星期五 13时04分53秒
    Build Host : worker1.bsys.centos.org
    Relocations : (not relocatable)
    Packager : CentOS BuildSystem <http://bugs.centos.org>
    Vendor : CentOS
    URL : http://www.gnu.org/software/bash
    Summary : The GNU Bourne Again shell
    Description :
    The GNU Bourne Again shell (Bash) is a shell or command language
    interpreter that is compatible with the Bourne shell (sh). Bash
    incorporates useful features from the Korn shell (ksh) and the C shell
    (csh). Most sh scripts can be run by bash without modification.

    [root@centos7 ~]# rpm -qc httpd
    /etc/httpd/conf.d/autoindex.conf
    /etc/httpd/conf.d/userdir.conf
    /etc/httpd/conf.d/welcome.conf
    /etc/httpd/conf.modules.d/00-base.conf
    /etc/httpd/conf.modules.d/00-dav.conf
    /etc/httpd/conf.modules.d/00-lua.conf
    /etc/httpd/conf.modules.d/00-mpm.conf
    /etc/httpd/conf.modules.d/00-proxy.conf
    /etc/httpd/conf.modules.d/00-systemd.conf
    /etc/httpd/conf.modules.d/01-cgi.conf
    /etc/httpd/conf/httpd.conf
    /etc/httpd/conf/magic
    /etc/logrotate.d/httpd
    /etc/sysconfig/htcacheclean
    /etc/sysconfig/httpd

    [root@centos7 ~]# rpm -qd httpd
    /usr/share/doc/httpd-2.4.6/ABOUT_APACHE
    /usr/share/doc/httpd-2.4.6/CHANGES
    /usr/share/doc/httpd-2.4.6/LICENSE
    /usr/share/doc/httpd-2.4.6/NOTICE
    /usr/share/doc/httpd-2.4.6/README
    /usr/share/doc/httpd-2.4.6/VERSIONING
    /usr/share/doc/httpd-2.4.6/httpd-dav.conf
    /usr/share/doc/httpd-2.4.6/httpd-default.conf
    /usr/share/doc/httpd-2.4.6/httpd-info.conf
    /usr/share/doc/httpd-2.4.6/httpd-languages.conf
    /usr/share/doc/httpd-2.4.6/httpd-manual.conf
    /usr/share/doc/httpd-2.4.6/httpd-mpm.conf
    /usr/share/doc/httpd-2.4.6/httpd-multilang-errordoc.conf
    /usr/share/doc/httpd-2.4.6/httpd-vhosts.conf
    /usr/share/doc/httpd-2.4.6/proxy-html.conf
    /usr/share/man/man8/apachectl.8.gz
    /usr/share/man/man8/fcgistarter.8.gz
    /usr/share/man/man8/htcacheclean.8.gz
    /usr/share/man/man8/httpd.8.gz
    /usr/share/man/man8/rotatelogs.8.gz
    /usr/share/man/man8/suexec.8.gz

      卸载:
      rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME
      rpm -evh PACKAGE_NAME

      选项:
      --allmatches 卸载所有匹配名称的程序包各版本
      --nodeps    忽略依赖关系
      --test      测试卸载,dry run 模式
      注意:卸载和查询是包的名,因为包已经存在了;而安装和升级,包是不存在的,所以是包的文件路径

      校验:检查程序包安装后生成的文件是否被修改过
      rpm {-V|--verify} [select-options] [verify-options] PACKAGE_Name
      rpm -V PACKAGE_Name
      -Va 列出目前系统上面所有可能被修改的文件
      -Vp 后面跟RPM包文件名,列出该软件内可能被修改过的文件
      -Vf 列出某个文件是否被修改过
      检查出来的结果对应标志位解释(标志位存在就表示相关信息已经发生改变)
      S file Size differs 文件大小是否改变
      M Mode differs (includes permissions and file type) 文件的类型或文件权限属性是否被改变
      5 digest (formerly MD5 sum) differs  MD5检验和是否不同
      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 功能是否改变

      获取的RPM包来源合法性验证及完整性验证:
      GNU计划的GPG(GNU Privacy Guard),防止软件被修改
      公钥文件一般放在/etc/pki/rpm-gpg/目录下面,不同发行版可能路径有所不同;发布版本的光盘中也用对应的公钥文件
      完整性验证:SHA256(包提供方会提供相应的校验码)
      来源合法性验证:RSA
        对称加密:加密、解密使用同一密钥;
        非对称加密:密钥是成对儿的,
        public key:公钥,公开所有人
        secret key:私钥, 不能公开
      制作RPM包者完成后,通过SHA256算法得出校验码附加在RPM包中,在通过私钥加密整个RPM包,发布程序包时提供对应的公钥文件;获得RPM包和公钥后解密RPM包得到相应SHA256的校验码,并验证校验码是否一致;这样既验证了来源合法信和完整性

      导入所需要公钥:系统发布都有一个密钥(公钥)
        rpm --import /PATH/FROM/GPG-PUBKEY-FILE
      检查RPM安装包的完成性和来源合法性
        rpm -K PACKAGE_FILE
      CentOS 7发行版光盘提供的密钥文件:RPM-GPG-KEY-CentOS-7
      删除导入的公钥(导入公钥类似于安装了个RPM包,通过-e卸载就可以)
        rpm -q gpg-pubkey  查询当前系统导入的所有秘钥
        rpm -e --allmatches gpg-pubkey-16ca1a56-4a100959

      数据库重建:
      RPM的查询就是去读取相关数据库信息
        /var/lib/rpm/  存储RPM管理工具相关状态信息数据库文件夹
      rpm {--initdb|--rebuilddb}
        --initdb  初始化数据库(如果不存在数据库则新建,否则不执行任何操作)
        --rebuilddb 重建数据库(无论当前数据库是否存在,直接重新创建数据库)

      获取帮助
        CentOS6 man rpm
        CentOS7 man rpmdb

  • 相关阅读:
    Linux学习65 实战使用awk高级功能统计网络请求连接状态
    Linux学习64 awk使用与实战
    Linux学习63 shell脚本高级编程-信号捕捉实战
    Linux学习62 shell脚本高级编程-数组和字符串处理
    Linux学习61 企业军工级别安全策略-SELinux简介
    Linux学习60 centos7新特性-systemd及systemctl实战
    Linux学习59 shell脚本高级用法-函数编程与应用实战
    【HBase】HBase与MapReduce的集成案例
    【HBase】底层原理
    【HBase】Java实现过滤器查询
  • 原文地址:https://www.cnblogs.com/Link-Luck/p/9857252.html
Copyright © 2020-2023  润新知