Linux 程序包管理-RPM

Posted luck-luck

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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包
演示:
[[email protected] ~]# rpm -q tree
tree-1.6.0-10.el7.x86_64

[[email protected] ~]# 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

[[email protected] ~]# rpm -qf /etc/fstab
setup-2.8.71-6.el7.noarch

[[email protected] ~]# rpm -qc bash
/etc/skel/.bash_logout
/etc/skel/.bash_profile
/etc/skel/.bashrc

[[email protected] ~]# 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.

[[email protected] ~]# 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

[[email protected] ~]# 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 程序包管理-RPM的主要内容,如果未能解决你的问题,请参考以下文章

linux程序包管理之rpm程序包管理器与yum前端工具

Linux程序包管理之rpm

Linux系统程序包管理工具 RPM

Linux系统程序包管理工具 RPM

Linux程序包管理

LINUX RPM包管理