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.comhttp://mirrors.sohu.comhttp://mirrors.163.com

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

(3)第三方组织:

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

      2) 搜索引擎http://pkgs.org http://rpmfind.net http://rpm.pbone.net

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

二、RPM包管理

rpm命令:rpm  [OPTIONS]  [PACKAGE_FILE]

安装:-i, --install

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

卸载:-e, --erase

查询:-q, --query

校验:-V, --verify

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

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-28.el7.x86_64.rpm   #安装zsh程序,显示过程

[root@localhost Packages]# rpm -ivh zsh-5.0.2-28.el7.x86_64.rpm
准备中...                          ################################# [100%]
正在升级/安装...
   1:zsh-5.0.2-28.el7                 ################################# [100%]

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)实例演示

                [root@localhost Packages]# rpm -Uvh zsh-5.0.2-28.el7.x86_64.rpm

[root@localhost Packages]# rpm -Uvh zsh-5.0.2-28.el7.x86_64.rpm
准备中...                          ################################# [100%]
	软件包 zsh-5.0.2-28.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不会真的卸载程序

[root@localhost Packages]# rpm -e --test zsh
[root@localhost Packages]# rpm -ql zsh
/bin/zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile

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

  #卸载程序

[root@localhost Packages]# rpm -e zsh
[root@localhost Packages]# rpm -ql zsh
未安装软件包 zsh
[root@localhost Packages]#

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  sed

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

[root@localhost Packages]# rpm -ql sed

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

 #显示程序的相关信息

[root@localhost Packages]# rpm -qi sed
Name        : sed
Version     : 4.2.2
Release     : 5.el7
Architecture: x86_64
Install Date: 2018年12月10日 星期一 05时28分49秒
Group       : Applications/Text
Size        : 601208
License     : GPLv3+
Signature   : RSA/SHA256, 2014年07月04日 星期五 12时58分02秒, Key ID 24c6a8a7f4a80eb5
Source RPM  : sed-4.2.2-5.el7.src.rpm
Build Date  : 2014年06月10日 星期二 09时01分55秒
Build Host  : worker1.bsys.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : http://sed.sourceforge.net/
Summary     : A GNU stream text editor
Description :
The sed (Stream EDitor) editor is a stream or batch (non-interactive)

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

[root@localhost Packages]# rpm -qd sed
/usr/share/doc/sed-4.2.2/AUTHORS
/usr/share/doc/sed-4.2.2/BUGS
/usr/share/doc/sed-4.2.2/COPYING
/usr/share/doc/sed-4.2.2/COPYING.DOC
/usr/share/doc/sed-4.2.2/NEWS
/usr/share/doc/sed-4.2.2/README
/usr/share/doc/sed-4.2.2/THANKS
/usr/share/doc/sed-4.2.2/sedfaq.txt.gz
/usr/share/info/sed.info.gz
/usr/share/man/man1/sed.1.gz

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

[root@localhost Packages]# rpm -qc zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc

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

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

[root@localhost Packages]# rpm -q --changelog zsh
\* 四 2月 16 2017 Kamil Dudka <[email protected]> - 5.0.2-28
- zero new space allocated in prompt buffer (#1408619)

* 一 11月 28 2016 Kamil Dudka <[email protected]> - 5.0.2-27
- fix parsing of parameter subscript expression with NOEXEC (#1398740)

* 一 10月 17 2016 Kamil Dudka <[email protected]> - 5.0.2-26
- fix crash while parsing the here-document syntax (#1374752)

* 四 7月 14 2016 Kamil Dudka <[email protected]> - 5.0.2-25
- improve use of new command substitution in completion (#1356388)

* 五 6月 10 2016 Kamil Dudka <[email protected]> - 5.0.2-24
- fix off-by-one error in completion utility cache code (#1344599)

 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-45.el7_0.3.x86_64.rpm

       [root@localhost Packages]# rpm  -V php

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

#测试程序的校验信息

[root@localhost Packages]# rpm -ivh --nodeps php-5.4.16-45.el7.x86_64.rpm
准备中...                          ################################# [100%]
正在升级/安装...
   1:php-5.4.16-45.el7                ################################# [100%]
[root@localhost Packages]# rpm -V php
未满足的依赖关系 php-5.4.16-45.el7.x86_64:
	php-common(x86-64) = 5.4.16-45.el7 被 (已安裝) php-5.4.16-45.el7.x86_64 需要
	php-cli(x86-64) = 5.4.16-45.el7 被 (已安裝) php-5.4.16-45.el7.x86_64 需要

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

       (1) 检验方式

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

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

[root@localhost rpm-gpg]# cd /etc/pki/rpm-gpg/
[root@localhost rpm-gpg]# rpm --import RPM-GPG-KEY-CentOS-7

       (3)验证

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

    2) 手动验正:rpm   -K    PACKAGE_FILE  

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

[root@localhost Packages]# rpm -K zsh-5.0.2-28.el7.x86_64.rpm
zsh-5.0.2-28.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 确定

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的数据库

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

[root@localhost Packages]# rpm -initdb --dbpath /rpmdb/
[root@localhost Packages]# ll /rpmdb/
总用量 440
-rw-r--r--. 1 root root   8192 12月 16 16:05 Basenames
-rw-r--r--. 1 root root   8192 12月 16 16:05 Conflictname
-rw-r--r--. 1 root root 311296 12月 16 16:05 __db.001
-rw-r--r--. 1 root root  90112 12月 16 16:05 __db.002
-rw-r--r--. 1 root root 107048 12月 16 16:05 __db.003
-rw-r--r--. 1 root root   8192 12月 16 16:05 Dirnames
-rw-r--r--. 1 root root   8192 12月 16 16:05 Group
-rw-r--r--. 1 root root   8192 12月 16 16:05 Installtid
-rw-r--r--. 1 root root   8192 12月 16 16:05 Name
-rw-r--r--. 1 root root   8192 12月 16 16:05 Obsoletename
-rw-r--r--. 1 root root  12288 12月 16 16:05 Packages
-rw-r--r--. 1 root root   8192 12月 16 16:05 Providename
-rw-r--r--. 1 root root   8192 12月 16 16:05 Requirename
-rw-r--r--. 1 root root   8192 12月 16 16:05 Sha1header
-rw-r--r--. 1 root root   8192 12月 16 16:05 Sigmd5
-rw-r--r--. 1 root root   8192 12月 16 16:05 Triggername

                2)查看/var/lib/rpm

[root@localhost Packages]# cd /var/lib/rpm
[root@localhost rpm]# ll
总用量 101428
-rw-r--r--. 1 root root  5173248 12月 16 15:55 Basenames
-rw-r--r--. 1 root root    16384 12月 13 21:25 Conflictname
-rw-r--r--. 1 root root   311296 12月 16 16:02 __db.001
-rw-r--r--. 1 root root    90112 12月 16 16:02 __db.002
-rw-r--r--. 1 root root  1318912 12月 16 16:02 __db.003
-rw-r--r--. 1 root root  1376256 12月 16 15:55 Dirnames
-rw-r--r--. 1 root root    32768 12月 16 15:55 Group
-rw-r--r--. 1 root root    24576 12月 16 15:55 Installtid
-rw-r--r--. 1 root root    81920 12月 16 15:55 Name
-rw-r--r--. 1 root root    36864 12月 16 15:55 Obsoletename
-rw-r--r--. 1 root root 92139520 12月 16 15:55 Packages
-rw-r--r--. 1 root root  2527232 12月 16 15:55 Providename
-rw-r--r--. 1 root root   614400 12月 16 15:55 Requirename
-rw-r--r--. 1 root root   147456 12月 16 15:55 Sha1header
-rw-r--r--. 1 root root    86016 12月 16 15:55 Sigmd5
-rw-r--r--. 1 root root     8192 12月 13 22:33 Triggername

参考博客:http://blog.51cto.com/xuding/1727510

猜你喜欢

转载自blog.51cto.com/12686444/2331114