一、程序包管理器简述


在计算机中,程序员编写的程序源代码是文本格式的,为了让计算机能识别这些代码,需要通过编辑器将其转换成二进制格式。

一个完整的编译好的程序应该包括二进制程序文件、库文件、配置文件和帮助文件。在Linux上,为了能让程序能正常运行,则需要将上述四个文件放在相应的目录上并做好链接。如

二进制程序文件:/bin,/sbin,/usr/bin,/usr/sbin,/usr/local/bin,/usr/local/sbin

库文件:/lib,/lib64,/usr/lib,/usr/lib64,/usr/local/lib,/usr/local/lib64

配置文件:/etc,/usr/local/local,/etc/ProgramName

帮助文件:/usr/share/man,/usr/share/doc,/usr/local/share/man,/usr/local/share/doc

根据不同的需求,我们需要对程序进行安装、升级、卸载、查询、校验等各种操作,则需要对上述文件进行修改,这样大大增加了程序管理的难度,为了解决这个问题,程序包管理器就出现了。

程序包管理器可以把应用程序编译好的各组成文件打包成一个或有限几个的“包”文件,从而更方便地实现程序包的安装、升级、卸载和查询等管理操作。

程序包管理器也是一个应用程序,它包含了每个程序包的组成清单(文件清单和安装卸载时的脚本)和公共数据库(程序包名称版本,依赖关系,功能说明及安装生成的各文件的文件路径及校验码信系)。

在CentOS上,我们常用的程序包管理器有rpm和yum。


二、rpm


1、rpm介绍

rpm全名Red Hat Package Manager,常见于Reahat系Liunx系统,用来对应该程序进行安装、升级、卸载、查询、校验以及数据库维护等操作。


2、rpm命名

rpm包的命名格式一般为name-VERSION-release.OS.arch.rpm,其中VERSION为major.minor.release。

name:包名

major:主要版本号,一般在重大更新时变更

minor:次要版本号

release-release:修订的版本号,前一个为程序释放版本号,后一个为程序bug或功能修复版本号

OS:适用的Linux发行版

arch:适用的平台架构

zsh-5.0.2-14.1.noarch.x86_64.rpm

如上,zsh表示包名,5.0.2-14表示程序包的版本号,noarch表示全平台可用,x86_64表示64位平台架构可用。


3、rpm命令

rpm命令的一般用法为:rpm [option] [package_file],根据option的不同,可分为安装、升级、卸载、查询、校验和数据库维护等各种功能。


a)安装:

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

常用选项:rpm -ivh PACKAGE_FILE ...


[install-options]:

-v:详细的信息

-vv:更详细的信息

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

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

--nodeps:忽略依赖关系(不建议使用,可能会导致程序安装好后无法运行)

--replacepkgs:重新安装

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

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

[root@centos7 Packages]# rpm -ivh --test 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
准备中...                          ################################# [100%]


b)升级:

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

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

常用格式:

rpm -Uvh PACKAGE_FILE ..

rpm -Fvh PACKAGE_FILE ..


[install-options]:

-U:升级或安装

-F:只升级

--oldpackage:降级

--force:强制升级

[root@centos7 Packages]# rpm -Uvh 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
准备中...                          ################################# [100%]
正在升级/安装...
   1:zsh-5.0.2-7.el7                  ################################# [100%]


注意:(1)不要对内核做升级操作;Linux支持多内核版本并存,因此,直接安装新版本内核。

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


c)卸载:

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

常用格式:

rpm -evh PACKAGE_NAME ..(卸载时填的是应用程序的名字,而不是包全名)


[install-options]:

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

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

--test:测试卸载

[root@centos7 Packages]# rpm -evh zsh
准备中...                          ################################# [100%]
正在清理/删除...
   1:zsh-5.0.2-7.el7                  ################################# [100%]


d)查询:

rpm {-q|--query}[select-options][query-options] 

常用格式:

rpm -qi PACKAGE,

rpm -qf FILE

rpm -qc PACKAGE

rpm -ql PACKAGE

rpm -qd PACKAGE

rpm -qpi PACKAGE_FILE

rpm -qpl PACKAGE_FILE

rpm -qpc PACKAGE_FILE


[select-options]

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

[root@centos7 Packages]# rpm -q openssh
openssh-6.6.1p1-11.el7.x86_64

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

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

[root@centos7 Packages]# rpm -qf /etc/passwd
setup-2.8.71-5.el7.noarch

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

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

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


[query-options]

--changelog:查询rpm包的changelog

-l,--list:程序包安装生成的所有文件列表(可与p连用实现对未安装程序包的查询)

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

-i,--info:程序包相关的信息,版本号、大小、所属的包组等(可与p连用实现对未安装程序包的查询)

[root@centos7 Packages]# rpm -qi bash
Name        : bash
Version     : 4.2.46
Release     : 12.el7
Architecture: x86_64
Install Date: 2015年12月10日 星期四 23时44分52秒
Group       : System Environment/Shells
Size        : 3663626
...

-c,--configfiles:查询指定的程序包提供的配置文件(可与p连用实现对未安装程序包的查询)

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

-d,--docfiles:查询指定的程序包提供的文档(可与p连用实现对未安装程序包的查询)

[root@centos7 Packages]# rpm -qd vim-minimal
/usr/share/man/man1/ex.1.gz
/usr/share/man/man1/rvi.1.gz
/usr/share/man/man1/rview.1.gz
/usr/share/man/man1/vi.1.gz
/usr/share/man/man1/view.1.gz
/usr/share/man/man1/vim.1.gz
/usr/share/man/man5/virc.5.gz

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

[root@centos7 Packages]# rpm -q --provides vim-minimal
/bin/vi
config(vim-minimal) = 2:7.4.160-1.el7
vi = 7.4.160-1.el7
vim-minimal = 2:7.4.160-1.el7
vim-minimal(x86-64) = 2:7.4.160-1.el7

-R,--requires:查询指定的程序包的依赖关系(可与p连用实现对未安装程序包的查询)

[root@centos7 Packages]# rpm -qR bash
/bin/sh
config(bash) = 4.2.46-12.el7
libc.so.6()(64bit)
libc.so.6(GLIBC_2.11)(64bit)
libc.so.6(GLIBC_2.14)(64bit)
libc.so.6(GLIBC_2.15)(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
libc.so.6(GLIBC_2.3)(64bit)
...

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


e)校验:

rpm {-V|--verify} [select-options] [verify-options]

常用格式:

rpm -V package_name


[verify-options]:

--nodeps:不校验依赖关系

--nodigest:读取时不校验包或标题摘要

--nofiles:不校验包的任何属性

--noscripts:不校验脚本信息

--nosignature:不校验签名信息

[root@centos7 Packages]# vim /etc/skel/.bashrc
[root@centos7 Packages]# rpm -V bash-4.2.46-12.el7.x86_64
S.5....T.  c /etc/skel/.bashrc

结果输出:

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:ca值改变



在生产中我们需要对包来源合法性和完整性进行验证:

来源合法性验证:获取并导入信任的包制作者的密钥   

        rpm --import /path/to/keyfile(/etc/pki/rpm-gpg/keyfile)

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

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

      (2)手动验证:rpm -K PACKAGE_FILE 


为了获取安全的程序包,建议通过以下途径:

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

(2)项目的官方站点

(3)第三方组织:EPEL、http://pkgs.org或http://rpmfind.nethttp://rpm.pbone.net

(4)自己编译


f)数据库重建

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

rpm {--initdb|--rebuilddb} [--dbpath DIRECTORY]

常用格式:

rpm --initdb --dbpath DIRECTORY


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

--rebuilddb:重建数据库,如果rpm数据库损坏可通过此命令重新修复

[root@centos7 Packages]# rpm --rebuilddb --dbpath /var/lib/rpm


三、yum


1、yum介绍

在rpm包的介绍中,我们也感受到了依赖关系的麻烦之处,为了解决依赖关系的问题,CentOS上又推出了更好用的程序包管理器yum。

yum全称为Yellow Dog Updater Modified,是一款在RedHat系Linux系统上的前端程序包管理器。它基于rpm包管理器,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。



2、yum仓库配置

yum 的理念是使用一个中心仓库(repository)管理一部分甚至一个分配的应用程序相互关系,根据计算出来的软件依赖关系进行相关的升级、安装、删除等等操作,较好的解决了rpm所存在的依赖关系问题。所以在使用yum前,我们必须进行yum仓库的配置。

CentOS程序包管理工具浅析_rpm


yum客户端配置文件路径为:

/etc/yum.conf:为所有仓库提供公共配置

/etc/yum.repos.d/*.repo:为仓库的指向提供配置

[root@centos7 yum.repos.d]# vim test.repo

[base]
name=test_base_repo
baseurl=file:///mnt
gpgcheck=0
enabled=1

仓库的文件格式:

[repositoryID]

name=Some name for this repository

baseurl=url://path/to/repository(同一种镜像不同路径也可)

    文件服务器:ftp://

          http://

          nfs://

          file:///

enable={0|1} 是否启用该yum源

gpgcheck={0|1} 是否校验包完整性

gpgkey=URL 校验的密钥文件路径

enablegroups={0|1} 是否支持包的组管理

failovermethod={roundrobin|priority} 主yum源故障时,次要yum源的选择方式

        roundrobin:随机  priority:优先级

cost=#   默认为1000



3、yum命令的用法:

yum [options] [command] [package ...]


显示仓库列表:yum repolist

[root@centos7 yum.repos.d]# yum repolist
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
源标识                                                  源名称                                                   状态
!base                                                   test_base_repo                                           8,652
epel/7/x86_64                                           Fedora EPEL                                              8,508
repolist: 17,160



显示程序包:yum list


安装程序包:yum install [package1] [package2] [...]

[root@centos7 yum.repos.d]# yum install zsh
已加载插件:fastestmirror, langpacks
base                                                                                           | 3.6 kB  00:00:00     
Loading mirror speeds from cached hostfile
正在解决依赖关系
--> 正在检查事务
---> 软件包 zsh.x86_64.0.5.0.2-7.el7 将被 安装
--> 解决依赖关系完成

依赖关系解决

======================================================================================================================
 Package                 架构                       版本                               源                        大小
======================================================================================================================
正在安装:
 zsh                     x86_64                     5.0.2-7.el7                        base                     2.4 M

事务概要
======================================================================================================================
安装  1 软件包

总下载量:2.4 M
安装大小:5.6 M
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  正在安装    : zsh-5.0.2-7.el7.x86_64                                                                            1/1 
  验证中      : zsh-5.0.2-7.el7.x86_64                                                                            1/1 

已安装:
  zsh.x86_64 0:5.0.2-7.el7                                                                                            

完毕!


重新安装:yum reinstall package1 [package2] [...]


升级程序包:yum update [package1] [package2] [...]


卸载程序包:yum remove | erase package1 [package] [...]

[root@centos7 yum.repos.d]# yum remove zsh
已加载插件:fastestmirror, langpacks
正在解决依赖关系
--> 正在检查事务
---> 软件包 zsh.x86_64.0.5.0.2-7.el7 将被 删除
--> 解决依赖关系完成

依赖关系解决

======================================================================================================================
 Package                 架构                       版本                              源                         大小
======================================================================================================================
正在删除:
 zsh                     x86_64                     5.0.2-7.el7                       @base                     5.6 M

事务概要
======================================================================================================================
移除  1 软件包

安装大小:5.6 M
是否继续?[y/N]:y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  正在删除    : zsh-5.0.2-7.el7.x86_64                                                                            1/1 
  验证中      : zsh-5.0.2-7.el7.x86_64                                                                            1/1 

删除:
  zsh.x86_64 0:5.0.2-7.el7                                                                                            

完毕!


查看程序包:yum info [...]

[root@centos7 yum.repos.d]# yum info zsh
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
已安装的软件包
名称    :zsh
架构    :x86_64
版本    :5.0.2
发布    :7.el7
大小    :5.6 M
源    :installed
来自源:base
简介    : Powerful interactive shell
网址    :http://zsh.sourceforge.net/
协议    : MIT
描述    : 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.


查看指定特性(可以是某文件)由哪个程序包所提供:yum provides | whatprovides feature1 [feature2] [...]


清理本地缓存:yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all] 


构建缓存:yum makecache [fast]


搜索:yum search string1 [string2] [...]

[root@centos7 yum.repos.d]# yum search zsh
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
================================================== N/S matched: zsh ==================================================
autojump-zsh.noarch : Autojump for zsh
herbstluftwm-zsh.noarch : herbstluftwm zsh completion support
zsh-html.x86_64 : Zsh shell manual in html format
zsh.x86_64 : Powerful interactive shell
zsh-lovers.noarch : A collection of tips, tricks and examples for the Z shell


查看指定包所依赖的capabilities:yum deplist package1 [package2] [...]


查看yum事务历史:yum history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]

[root@centos7 yum.repos.d]# yum history 
已加载插件:fastestmirror, langpacks
ID     | 登录用户                 | 日期和时间       | 操作           | 变更数 
-------------------------------------------------------------------------------
    12 | root <root>              | 2015-12-27 00:33 | Erase          |    1   
    11 | root <root>              | 2015-12-27 00:31 | Install        |    1   
    10 | root <root>              | 2015-12-25 18:02 | Install        |    1   
     9 | root <root>              | 2015-12-25 17:52 | Install        |    2   
     8 | root <root>              | 2015-12-25 17:07 | Install        |    2   
     7 | root <root>              | 2015-12-25 16:21 | Install        |    4   
     6 | root <root>              | 2015-12-25 16:04 | Install        |    1   
     5 | root <root>              | 2015-12-25 15:56 | Install        |    3   
     4 | root <root>              | 2015-12-25 15:46 | Install        |    2   
     3 | root <root>              | 2015-12-25 15:03 | Install        |    1   
     2 | root <root>              | 2015-12-20 20:34 | Install        |    6   
     1 | 系统 <空>                | 2015-12-10 23:43 | Install        | 1137   
history list


包组管理命令:yum groupinstall group1 [group2] [...]

yum groupupdate group1 [group2] [...]

yum grouplist [hidden] [groupwildcard] [...]

yum groupremove group1 [group2] [...]

yum groupinfo group1 [...]

[root@centos7 yum.repos.d]# yum grouplist
已加载插件:fastestmirror, langpacks
没有安装组信息文件
Maybe run: yum groups mark convert (see man yum)
Loading mirror speeds from cached hostfile
Available environment groups:
   最小安装
   基础设施服务器
   计算节点
   文件及打印服务器
   MATE 桌面环境
   基本网页服务器
   虚拟化主机
   带 GUI 的服务器
   ......



yum的命令行选项

--nogpgcheck:禁止进行gpg check

-y:自动回答为“yes”

-q:静默模式

--disablerepo=repoidglob:临时禁止此处指定的repo

--enablerepo=repoidglob:临时启用此处指定的repo

--noplugins:禁用所有插件

[root@centos7 yum.repos.d]# yum -y -q install zsh
[root@centos7 yum.repos.d]#



四、总结

rpm包更适用于本地程序包的管理,但它有着依赖关系的问题。在能连上互联网时,我们更倾向于使用yum来管理程序包,但是前提要配好一个安全的yum仓库。


参考:www.magedu.com

http://kgdbfmwfn.blog.51cto.com/5062471/1690005

https://en.wikipedia.org/wiki/Yum

http://www.centoscn.com/CentOS/help/2014/1128/4200.html