程序包管理之 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平台
VERSION: major.minor.release (程序包的release)   ARCH :release.arch (rpm包的release)
   
release:release.OS
 常见的arch: 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  存在数据库不会重建,不存在时,重建

猜你喜欢

转载自www.cnblogs.com/liuzhiyun/p/11369408.html
今日推荐