> Linux教程 > Linux学习 >

RPM包功能全解

一、程序包管理概述

    1.程序包语言

       (1)系统级开发:一般直接调用硬件

  C/C++:httpd, vsftpd, nginx

  Go语言

       (2)应用级开发:Java/Python/perl/ruby/PHP:

java: Hadoop,  Hbase, (基于jvm虚拟机)

Python:OpenStack, (基于pvm虚拟机)

perl: (perl解释器)

ruby: (ruby解释器)

php: (php解释器)

    2.程序语言格式

       (1)C/C++程序格式:

  源代码:文本格式的程序代码;

编译开发环境:编译器、头文件、开发库

 二进制格式:文本格式的程序代码 --> 编译器 --> 二进制格式(二进制程序、库文件、配置文件、帮助文件)

       (2)java/python程序格式:

 源代码:编译成能够在其虚拟机(jvm/pvm)运行的格式;

开发环境:编译器、开发库

 二进制

    3.项目构建工具:

c/c++: make

java: maven

    4.程序包管理器:要完成安装、升级、卸载、查询、校验(校验为Linux所有)功能

       (1)功能

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

       (2)组成方式

              1)程序包的组成清单(每个程序包都单独实现):文件清单、 安装或卸载时运行的脚本

              2)数据库(公共):/var/lib/rpm/

                   程序包的名称和版本、依赖关系、 功能说明、安装生成的各文件的文件路径及校验码信息...

       (3)不同系列Linux所用程序包管理器:

debian:dpt, dpkg, ".deb"

redhat:redhat package manager, rpm, ".rpm"; rpm is package manager;

S.u.S.E:rpm, ".rpm",

Gentoo:ports

ArchLinux:

    5.包的命名格式

         (1)源代码:name-VERSION.tar.*z

VERSION:major.minor.release 主版本号.次版本号.发行号

         (2)RPM包:name-VERSION-release.arch.rpm

 VERSION:major.minor.release

 release.arch:rpm包的发行号,arch 平台号

    6.RHEL制作RPM包时会拆包:主包和支包,方便安装所需要组件而非全部

主包:name-VERSION-release.arch.rpm

支包:name-function-VERSION-release.arch.rpm

     function(功能):devel, utils, libs, ...

    7.程序包管理器前端工具:自动解决依赖关系;

    yum:rhel系列系统上rpm包管理器的前端工具;

    apt-get (apt-cache):deb包管理器的前端工具;

    zypper:suse的rpm管理器前端工具;

   dnf:Fedora 22+系统上rpm包管理器的前端工具,yum的升级版;

    8.获取程序包的途径:

(1)系统发行版的光盘或官方的文件服务器(或镜像站点):

http://mirrors.aliyun.com、http://mirrors.sohu.com、http://mirrors.163.com

(2)各个项目自己的官方站点

(3)第三方组织:

      1) EPEL等可靠地开源社区组织

      2) 搜索引擎:http://pkgs.org、 http://rpmfind.NET 、http://rpm.pbone.Net

(4)自动编译二进制代码、制作

 

 

 

 

二、RPM方式管理(CentOS 7.1为例讲解)

rpm命令:rpm  [OPTIONS]  [PACKAGE_FILE]

安装:-i, --install

升级:-U, --update, -F, --freshen

卸载:-e, --erase

查询:-q, --query

校验:-V, --verify

数据库维护:--builddb, --initdb

   前提:挂载官方镜像CentOS-7-x86_64-Everything-1503-01.iso,RPM包位置Packages目录

wKiom1Z6O7Sj7XW1AAOoRO6eNDU517.jpg

     Last login: Mon Dec 21 06:57:01 2015 from 172.16.250.39

      [root@localhost ~]# mkdir /media/cdrom       #创建挂载点目录

mkdir: 无法创建目录"/media/cdrom": 文件已存在

      [root@localhost ~]# mount /dev/cdrom  /media/cdrom    #挂载光盘

mount: /dev/sr0 写保护,将以只读方式挂载

     [root@localhost ~]#    

 

    1.安装:

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

  rpm  -ivh  PACKAGE_FILE ...

    GENERAL OPTIONS(通用选项):

 -v:verbose,详细信息

-vv:更详细的输出

     [install-options]:

 -h:hash marks输出进度条;每个#表示2%的进度;

--test:测试安装,检查并报告依赖关系及冲突消息等;

--nodeps:忽略依赖关系;不建议;

--replacepkgs:重新安装

--nosignature:不检查包签名信息,不检查来源合法性;

--nodigest:不检查包完整性信息;

     注意:rpm可以自带脚本;

四类:--noscripts

preinstall:安装过程开始之前运行的脚本,%pre , --nopre

postinstall:安装过程完成之后运行的脚本,%post , --nopost

preuninstall:卸载过程真正开始执行之前运行的脚本,%preun, --nopreun

postuninstall:卸载过程完成之后运行的脚本,%postun , --nopostun

       (2)实例演示

                1)[root@localhost Packages]#rpm  -ivh  zsh-5.0.2-7.el7.x86_64.rpm   #安装zsh程序,显示过程

wKiom1Z6O7uRAejeAAEsIPdmFDQ622.jpg

                2)[root@localhost Packages]# rpm -ivh --test zsh-5.0.2-7.el7.x86_64.rpm

[root@localhost Packages]# rpm -ql  zsh

测试安装zsh,并不会真正的安装。查看zsh程序安装所生成的所有文件列表显示无程序

wKiom1Z6O8jA1lJtAAEdRWtp5X8357.jpg

                3)[root@localhost Packages]# rpm -ivh --nosignature zsh-5.0.2-7.el7.x86_64.rpm

安装时不检验签名信息,此处则不再显示警告信息,NOKEY

wKioL1Z6O-XjrRtSAADlBPb6_wA807.jpg

                5)[root@localhost Packages]# rpm -ivh --nodigest zsh-5.0.2-7.el7.x86_64.rpm

安装时不检查安装包的完整性,直接强制安装

一般除非在十分确定自己做什么和相信此程序视乎才会使用

                6)[root@localhost Packages]# rpm -ivh --test  php-mysqlnd-5.4.16-23.el7_0.3.x86_64.rpm

         [root@localhost Packages]# rpm -ivh --nodeps  php-mysqlnd-5.4.16-23.el7_0.3.x86_64.rpm

  #测试安装 php-mysqlnd,需要安装php-pdo(x86-64),直接安装会报错,安装不了

  #--nodeps 参数会忽略安装包之间的依赖关系,但时安装后很大可能不能正常使用,痴肥依赖关系实际上用不到,如.doc的帮助文档等

wKioL1Z6PXHR22KAAAJeAdHHO9E850.jpg

  

    2.升级:

       (1)rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...

 rpm {-F|--freshen} [install-options] PACKAGE_FILE ...

     -U:升级或安装  -Uvh;    rpm  -Uvh PACKAGE_FILE ...

      -F:纯粹升级,必须存在老版本,不支持安装操作 -Fvh     rpm  -Fvh PACKAGE_FILE ...

--oldpackage:降级;

--force:强制升级;

         注意:

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

     2) 如果某原程序包的配置文件安装后曾被修改过,升级时,新版本的程序提供的同一个配置文件 不会覆盖原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供;

        (2)实例演示

                1)[root@localhost Packages]# rpm -e zsh   

          [root@localhost Packages]# rpm -F zsh-5.0.2-7.el7.x86_64.rpm

          [root@localhost Packages]# rpm -U  zsh-5.0.2-7.el7.x86_64.rpm

  #卸载zsh程序包

  #用 -F参数升级安装zsh程序细胞,查询结果显示无法安装

 # -C 参数则在当不存在原有安装包的时候能够安装该程序

wKioL1Z6PXrRfGPAAAIoC_ZLcG4454.jpg

                2)将zsh-4.3.10版本升级到zsh-5.0.2版本

wKioL1Z6PYuAhvTRAAJ-WS58YfA937.jpg

       [root@localhost /]# rpm -q zsh          #查看当前系统上的zsh程序

           未安装软件包 zsh         #显示当前系统上未安装zsh相关程序

       [root@localhost /]# rpm -ivh zsh-4.3.10-9.el6.x86_64.rpm           #安装4.3.10版本

           警告:zsh-4.3.10-9.el6.x86_64.rpm: 头V3 RSA/SHA1 Signature, 密钥 ID c105b9de: NOKEY

          准备中...                          ################################# [100%]

          正在升级/安装...

                 1:zsh-4.3.10-9.el6                 ################################# [100%]

       [root@localhost /]# rpm -q zsh              #显示当前zsh版本信息

           zsh-4.3.10-9.el6.x86_64

       [root@localhost /]# cd /media/cdrom/Packages/               #移动到光盘镜像5.0版本位置

       [root@localhost Packages]# rpm -F zsh-5.0.2-7.el7.x86_64.rpm           #升级安装更高版本

          警告:zsh-5.0.2-7.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY

       [root@localhost Packages]# rpm -q zsh          #显示当前zsh版本信息

             zsh-5.0.2-7.el7.x86_64

   

    3.卸载:

       (1)rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME ...

    --allmatches:卸载所有匹配指定名称的程序包的各版本;

    --nodeps:忽略依赖关系

    --test:测试卸载,dry run模式

       (2)实例演示

                1)[root@localhost Packages]#rpm  -e   --test   zsh    #测试卸载zsh

        [root@localhost Packages]#rpm -ql  zsh    #查看zsh程序安装所生成的所有文件列表

结论:--test不会真的卸载程序

wKiom1Z6PYGx-_fAAADax9vyAxo318.jpg

                2)[root@localhost Packages] rpm  -e  zsh

 #卸载程序

wKiom1Z6PYSADyLwAAB3H36W2uM287.jpg

 

    4.查询:

       (1)rpm {-q|--query} [select-options] [query-options]

   [select-options]

PACKAGE_NAME:查询指定的程序包是否已经安装,及其版本;

-a, --all:查询所有已经安装过的包;

-f  FILE:查询指定的文件由哪个程序包安装生成;

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

--whatprovides CAPABILITY:查询指定的CAPABILITY由哪个程序包提供;

--whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖;

   [query-options]

--changelog:查询rpm包的changlog;

-l, --list:程序安装生成的所有文件列表;

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

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

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

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

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

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

       用法总结:

   -qi  PACKAGE, -qf FILE, -qc PACKAGE, -ql PACKAGE, -qd PACKAGE

   -qpi  PACKAGE_FILE, -qpl PACKAGE_FILE, -qpc PACKAGE_FILE, ...d

       (2)实例演示

                1)[root@localhost Packages]# rpm -ql  php-mysqlnd

#查询程序安装所以生成的所有文件列表

wKioL1Z6PenzGuSHAAEp55JfFXI611.jpg

                2)[root@localhost Packages]# rpm -qi zsh  

 #显示程序的相关信息

wKiom1Z6PdnD7k-TAAOjfdBEbmg086.jpg

    显示内容注解:

[root@localhost Packages]# rpm -qi zsh   

Name        : zsh           #安装包名称

Version     : 5.0.2        #版本号

Release     : 7.el7        #发行号

Architecture: x86_64       #所编译的安装平台64位架构平台

Install Date: 2015年12月22日 星期二 09时30分50秒       #安装日期

Group       : System Environment/Shells        #属在组:系统环境的shell中的一种

Size        : 5834441        #程序大小

License     : MIT             #许可证:麻省理工大学

Signature   : RSA/SHA256, 2014年07月04日 星期五 13时54分12秒, Key ID 24c6a8a7f4a80eb5   #签名

Source RPM  : zsh-5.0.2-7.el7.src.rpm         #安装源码RPM包

Build Date  : 2014年06月10日 星期二 10时47分02秒        #RPM包创建时间

Build Host  : worker1.bsys.centos.org       #创建的主人

Relocations : (not relocatable)       #重新安置

Packager    : CentOS BuildSystem <http://bugs.centos.org>        #制作人

Vendor      : CentOS        #卖主

URL         : http://zsh.sourceforge.net/        # 文件所在URL

Summary     : Powerful interactive shell       # 简介:强大的交互式shell

Description :       #详细描述

The zsh shell is a command interpreter usable as an interactive login

shell and as a shell script command processor.  Zsh resembles the ksh

shell (the Korn shell), but includes many enhancements.  Zsh supports

command line editing, built-in spelling correction, programmable

command completion, shell functions (with autoloading), a history

mechanism, and more.

     3)[root@localhost Packages]# rpm -qd zsh     #查看包所提供文档位置

wKioL1Z6Pe7jiPzdAASCiyTtUzU776.jpg

                4)[root@localhost Packages]# rpm -qc  zsh     #显示zsh相关的配置文件的位置

wKioL1Z6PfOzeuBVAACOYADTTQg122.jpg

                5)[root@localhost Packages]# rpm -q --changelog  zsh    #查询zsh的改变日志

# 从近到远显示出该程序每次改版更新的相关信息

wKiom1Z6PeXSYOUdAAMRaA-Go9c686.jpg

                6)[root@localhost Packages]# rpm -q --provides  zsh    #显示程序包所提供的功能

wKioL1Z6PfnTydONAACNsPM7s-M648.jpg

                7)[root@localhost Packages]# rpm -qR  zsh      #显示安装包所要依赖的库及其他相关

wKiom1Z6PeiBo11vAANNOmLxlRA801.jpg

                8)[root@localhost Packages]# rpm -q  --scripts  zsh      #显示程序包自带的运行脚本片段

  此处有四类脚本中的三类:

#postinstall scriptlet (using /bin/sh):安装完成会后执行脚本

#preuninstall scriptlet (using /bin/sh):卸载开始之前执行脚本

#postuninstall scriptlet (using /bin/sh):卸载完成之后执行脚本

wKioL1Z6Pf3z9ctDAAOZbdUEA-c258.jpg

                9)[root@localhost Packages]# rpm -q --whatprovides   zsh

#显示zsh功能是被哪个程序包所提供

wKioL1Z6PgKA1ADmAABtAaDEpk0456.jpg

                10)[root@localhost Packages]# rpm -q --whatrequires   zsh  

 #查询功能被哪个所依赖,此处zsh未被系统上安装的包做依赖

wKioL1Z6PgKDM2XzAABqc3p0ZjE961.jpg

      

 

    5.校验:

       (1)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          #MD5校验码是否改变

   D Device major/minor number mismatch         #设备的主次版本号是否错配

   L readLink(2) path mismatch       # readlink路径是否错配

               U User ownership differs              #用户本身关系

   G Group ownership differs          # 用户组本身关系

   T mTime differs                             # 修改时间modify time

    P caPabilities differ

       (2)实例演示

               测试安装的程序的校验信息

       [root@localhost Packages]# rpm  -ivh  --nodeps php-5.4.16-23.el7_0.3.x86_64.rpm

       [root@localhost Packages]# rpm  -V php

# 忽略依赖关系安装php程序,此处为了测试使用

#测试程序的校验信息

wKiom1Z6PfLwTjnlAAL6s_ftmN4057.jpg

       

 

    6.包来源合法性验正和完整性验证:

       (1) 检验方式

    数字签名:用私钥加密对应程序的特征码

       (2) 获取并导入信任的包制作者的密钥:

   1)对于CentOS发行版来说:rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

wKiom1Z6PfKyDnEAAADU2kOBWzc817.jpg

   2)对于官方光盘内秘钥导入:[root@localhost cdrom]# rpm --import RPM-GPG-KEY-CentOS-7

           此处的RPM-GPG-KEY-CentOS-7为光盘内适配当前系统的光盘所自带的验证秘钥,不同系统不同

当秘钥导入到系统之后,再次安装后会自动执行验证,此时不会警告NOKEY

wKiom1Z6PfTTVDZIAAO0DqiXUYE256.jpg

        (3)验证:

   1) 安装此组织签名的程序时,会自动执行验证;

    2) 手动验正:rpm   -K    PACKAGE_FILE  

在导入秘钥的CentOS7.1上验证 

wKioL1Z6Pgei6OFDAACR2geLb3M024.jpg

在未导入秘钥的CentOS 6.7 系统上验证

wKiom1Z6PfWy_0SOAADQZ3-2FSM657.jpg

 

 

  7.数据库重建:

       (1)rpm管理器数据库路径:/var/lib/rpm/

      查询操作:通过此处的数据库进行;

       (2)获取帮助:CentOS命令查询位置不同

      CentOS 6:man rpm

      CentOS 7:man rpmdb

       (3)rpm {--initdb|--rebuilddb} [--dbpath DIRECTORY] [--root DIRECTORY]

  --initdb:初始化数据库,当前无任何数据库可实始化创建一个新的;当前有时不执行任何操作;

  --rebuilddb:重新构建,通过读取当前系统上所有已经安装过的程序包进行重新创建;

[--dbpath DIRECTORY]  :指明建立位置

       (4)实例演示

                1)在指定目录下/rpmdb下初始化一个rpm的数据库

  注意:此时的库是没用的,所以大小和原来的库不同

wKioL1Z6PgqSgpfkAANh-NnzAJo323.jpg

                2)查看/var/lib/rpm

wKioL1Z6PgzRT7BWAANlu-gZ_h8028.jpg




(责任编辑:IT)