rpm与yum

0.目录

1.程序包管理器

1.1 为何使用包管理器

一个可使用的程序一般包括:

  • 二进制程序
    已编译过,可运行。
  • 配置文件
    用于定义程序运行时的特性等。
  • 库文件
    这里不是指系统库文件,而是一个程序所提供的能共享给其他程序使用的库文件。
  • 帮助文档

这些文件如果都由用户手动管理,最简单地比如:安装时分别将这些文件放在指定目录,卸载时从各目录将这些文件一一删除……显然会非常繁琐。

所以要把一个程序的所有文件,组织成一个或几个包1,使用包管理器进行安装、查询、升级、卸载等操作,用户不必关心细节2

1.2 程序包管理器分类

包管理器在几个linux分支上不同:

  • debian的被称为dpt,包名以“.deb”结尾。
  • redhat的被称为rpm(redhat package manager),包名以“.rpm”结尾。
  • Suse使用的也是rpm,只是各文件安装路径不同于redhat。

2.rpm

把程序源码编译成二进制,并和其配置文件、库文件、帮助文档等文件,及记录该程序安装时需依赖哪些其他程序,通过一定机制组织为rpm包3。rpm包很多有依赖关系,即一个包在安装时很可能需先安装其他包。

2.1 rpm包名规则

进入光盘的Packages目录下可看到光盘自带的各rpm包,以bash安装包名为例:

[root@local Packages]# ls | grep bash
bash-4.1.2-40.el6.x86_64.rpm
各字段意义
bash程序名
4.1.2对应源代码的主版本号.次版本号.发行号
40rpm包的发行号。rpm打包方式改变,应变更rpm包的发行号,这和程序源码的发行号无关
el6.x86_64适合的硬件平台。如为noarch,表示与硬件平台无关。

又如程序httpd的包:

[root@local Packages]# ls | grep httpd
httpd-2.2.15-53.el6.centos.x86_64.rpm
httpd-devel-2.2.15-53.el6.centos.x86_64.rpm
httpd-manual-2.2.15-53.el6.centos.noarch.rpm
httpd-tools-2.2.15-53.el6.centos.x86_64.rpm

为第53次制作的,适用于centos的rpm包(发行号偶尔也会包含程序适用于的操作系统)。

也可看出,一个程序不一定只有一个rpm包。因一个程序可能包含多种功能,如果全都做成一个包,则不论需要与否,都会全部安装。
所以需分开,上面4个rpm包中,第一个是httpd程序主要内容做成的包(可启动服务);下面3个包,根据功能的不同,分别在程序名后加上各自功能。比如devel表示供开发使用的包等。

2.2 rpm包管理器组成

更贴切地说,是rpm管理器通过什么来管理各rpm包:

  • 各rpm包都有自己的首部(header)信息
    其中记录了程序包依赖哪些其他包、含哪些文件,安装、卸载时需运行哪些脚本、说明信息等。
  • rpm数据库
    该数据库路径为目录/var/lib/rpm
    其中存储了当前系统上每一个rpm包的名称和版本、包和包之间有怎样的依赖关系、各包的功能说明、每个程序包安装生成了哪些文件(路径)等等

2.3 rpm指令

管理rpm包使用指令“rpm”即可,各功能均依赖rpm数据库/var/lib/rpm

不同功能(也可称为模式)对应不同选项4,不过各模式也有一些通用选项:

常用通用选项意义
-v表示输出细节(verbose)信息。-vv、-vvv表示输出更详细的信息
–quiet静默。除非报错,否则不输出任何信息至屏幕

2.3.1 安装

命令格式:rpm {-i|--install} [install-options] PACKAGE_FILE ...

常用install-options意义
-h安装时,输出“#”号用来展示安装进度
–test“干跑”一遍,不真正安装,这只是为了检测安装指定软件时是否会引起冲突等

选项“-ivh”常连用。

比如,仍切换至光盘的Package目录,安装zsh:

[root@local Packages]# cat /etc/shells | grep zsh
[root@local Packages]# rpm -ivh zsh-4.3.11-4.el6.centos.2.x86_64.rpm 
Preparing...                ########################################### [100%]
   1:zsh                    ########################################### [100%]
[root@local Packages]# cat /etc/shells | grep zsh
/bin/zsh

2.3.2 升级

命令格式:

rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
# -U或--update表示安装&升级。如果老版本的包未安装,则会安装再升级

rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
# -F或--freshen表示仅升级。如果老版本的包未安装,则不做操作
常用install-options意义
–oldpackage降级至旧版本。如果升级后发现不兼容,则使用此选项回滚至升级前
-h同上,“#”显示进度
–test同上,干跑一遍。看是否有冲突,不真正升级

注意:如果老版本程序的配置文件被修改过,那么升级到新版本后,新版本的配置文件不会(也不应该,因为老版本程序的配置文件会被认为是用户有意修改的)覆盖该配置文件,而是把新版本的配置文件重命名(在名字后加上rpmnew)后提供。

2.3.3 卸载

卸载选项意义
-e或–erase卸载
–allmatches指定程序的各版本均卸载
–test同上,干跑

2.3.4 查询

2.3.4.1 格式及参数

命令格式:rpm {-q|--query} [select-options] [query-options]

常用select-options意义
包名此时命令格式就变为rpm {-q|--query} Package [query-options]5,表示对单个包进行查询(其是否安装即版本)
-a,–all查询对当前系统上的所有已安装的包
-f,–file参数是文件。表示查询指定文件是由哪个程序包生成的
-g,–group参数是包组名。表示查询指定包组
-p,–package参数是一个未安装的程序包。表示对一个未安装的程序包进行查询(不加此选项则只能查询已安装的程序包),且仍可结合query-options进行查询
–whatprovides参数是capability6。查询指定的capability是被哪个包提供的
–whatrequires参数是capability。查询指定的capability被哪些包依赖

分割线————-

常用query-options意义
-i,–info查询程序包相关说明信息
-l,–list查询程序包安装后生成哪些文件
-c查询程序包提供的配置(configuration)文件
-d查询程序包提供的文档(document),主要是帮助文档
–provides查询程序包能提供哪些capability;正好与select-options中的–whatprovides“相反”
-R,–requires查询程序包依赖的capability;正好与select-options中的–whatrequires“相反”
–scripts查询程序包包含的脚本片段7
–changelog查询程序包各版本经历过哪些演进(注意是程序包的演进,而非对应的源码)

可看出,select-options指定的是查什么程序包;query-options指定的是查程序包的什么。

2.3.4.2 使用举例

依次使用上述列出的选项,从query-options开始。
查询当前系统上已安装的httpd的rpm包名及版本(这里的select-options就取httpd):

[root@local ~]# rpm -q httpd
httpd-2.2.15-53.el6.centos.x86_64

查询httpd的安装包简要信息:

[root@local ~]# rpm -qi httpd
Name        : httpd                        Relocations: (not relocatable)
Version     : 2.2.15                            Vendor: CentOS
Release     : 53.el6.centos                 Build Date: Thu 12 May 2016 03:29:17 AM CST
Install Date: Tue 08 Nov 2016 09:28:00 PM CST      Build Host: worker1.bsys.centos.org
Group       : System Environment/Daemons    Source RPM: httpd-2.2.15-53.el6.centos.src.rpm
Size        : 3133738                          License: ASL 2.0
Signature   : RSA/SHA1, Thu 12 May 2016 06:52:29 PM CST, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
URL         : http://httpd.apache.org/
Summary     : Apache HTTP Server
Description :
The Apache HTTP Server is a powerful, efficient, and extensible
web server.

查询httpd的安装包安装后生成的所有文件(含配置、说明文件)、或仅查询配置文件、说明文档(限于篇幅,都仅显示数量):

[root@local ~]# rpm -ql httpd | wc -l          # 生成的所有文件
357
[root@local ~]# rpm -qc httpd | wc -l          # 生成的配置文件
27
[root@local ~]# rpm -qd httpd | wc -l          # 生成的说明文档
11

查询httpd提供的所有capability。可看到有配置文件、库文件、web服务等等:

[root@local ~]# rpm -q --provides httpd
config(httpd) = 2.2.15-53.el6.centos
httpd-mmn = 20051115
httpd-suexec = 2.2.15-53.el6.centos
mod_actions.so()(64bit)  
mod_alias.so()(64bit)  
mod_asis.so()(64bit)  
mod_auth_basic.so()(64bit)  
mod_auth_digest.so()(64bit)  
mod_authn_alias.so()(64bit)  
mod_authn_anon.so()(64bit)  
mod_authn_dbd.so()(64bit)  
mod_authn_dbm.so()(64bit)  
mod_authn_default.so()(64bit)  
mod_authn_file.so()(64bit)  
mod_authnz_ldap.so()(64bit)  
mod_authz_dbm.so()(64bit)  
mod_authz_default.so()(64bit)  
mod_authz_groupfile.so()(64bit)  
mod_authz_host.so()(64bit)  
mod_authz_owner.so()(64bit)  
mod_authz_user.so()(64bit)  
mod_autoindex.so()(64bit)  
mod_cache.so()(64bit)  
mod_cern_meta.so()(64bit)  
mod_cgi.so()(64bit)  
mod_cgid.so()(64bit)  
mod_dav = 2.2.15-53.el6.centos
mod_dav.so()(64bit)  
mod_dav_fs.so()(64bit)  
mod_dbd.so()(64bit)  
mod_deflate.so()(64bit)  
mod_dir.so()(64bit)  
mod_disk_cache.so()(64bit)  
mod_dumpio.so()(64bit)  
mod_env.so()(64bit)  
mod_expires.so()(64bit)  
mod_ext_filter.so()(64bit)  
mod_filter.so()(64bit)  
mod_headers.so()(64bit)  
mod_ident.so()(64bit)  
mod_include.so()(64bit)  
mod_info.so()(64bit)  
mod_ldap.so()(64bit)  
mod_log_config.so()(64bit)  
mod_log_forensic.so()(64bit)  
mod_logio.so()(64bit)  
mod_mime.so()(64bit)  
mod_mime_magic.so()(64bit)  
mod_negotiation.so()(64bit)  
mod_proxy.so()(64bit)  
mod_proxy_ajp.so()(64bit)  
mod_proxy_balancer.so()(64bit)  
mod_proxy_connect.so()(64bit)  
mod_proxy_ftp.so()(64bit)  
mod_proxy_http.so()(64bit)  
mod_proxy_scgi.so()(64bit)  
mod_reqtimeout.so()(64bit)  
mod_rewrite.so()(64bit)  
mod_setenvif.so()(64bit)  
mod_speling.so()(64bit)  
mod_status.so()(64bit)  
mod_substitute.so()(64bit)  
mod_suexec.so()(64bit)  
mod_unique_id.so()(64bit)  
mod_userdir.so()(64bit)  
mod_usertrack.so()(64bit)  
mod_version.so()(64bit)  
mod_vhost_alias.so()(64bit)  
webserver                               # web服务  
httpd = 2.2.15-53.el6.centos
httpd(x86-64) = 2.2.15-53.el6.centos

查询httpd程序包依赖哪些capability:

[root@local ~]# rpm -qR httpd | wc -l
38

查询系统上已安装的所有包:

[root@local ~]# rpm -qa | wc -l
1126

查询指定文件由哪个程序包提供:

[root@local ~]# rpm -qf /etc/httpd/conf/httpd.conf 
httpd-2.2.15-53.el6.centos.x86_64

查询指定的capability由哪个包提供:

[root@local ~]# rpm -q --whatprovides webserver
httpd-2.2.15-53.el6.centos.x86_64
# webserver由哪个包提供

[root@local ~]# rpm -q --whatprovides /etc/httpd/conf/httpd.conf 
httpd-2.2.15-53.el6.centos.x86_64
# 因为capability可以是文件,所以这里查询的就是就是文件/etc/httpd/conf/httpd.conf由哪个包提供。相当于命令“rpm -qf”

查询指定的capability被哪些包依赖:

[root@local ~]# rpm -q --whatrequires /bin/bash | wc -l
67

查询某未安装的程序包的信息:

[root@local Packages]# rpm -q mysql-5.1.73-7.el6.x86_64.rpm 
package mysql-5.1.73-7.el6.x86_64.rpm is not installed
[root@local Packages]# rpm -qp mysql-5.1.73-7.el6.x86_64.rpm 
mysql-5.1.73-7.el6.x86_64
# 可结合各query-options

2.3.5 校验

如何知道指定程序包生成的文件是否被修改过,发生了什么变化?使用校验功能即可。

格式:rpm {-V|--verify} [select-options] [verify-options]

其中select-options同上述查询的,用于指定要校验的包(只是把“-q”换成了“-V”)。

verify-options用于指定不校验的内容,比如“–nouser”表示校验时忽略属主的改变等。默认是对所有内容进行校验。

比如修改httpd的配置文件,并校验生成该文件的程序包所生成的文件中,哪些已被改变(此例中显然是其配置文件):

[root@local ~]# echo hello >> /etc/httpd/conf/httpd.conf   # 修改,然后校验 
[root@local ~]# rpm -Vf /etc/httpd/conf/httpd.conf
S.5....T.  c /etc/httpd/conf/httpd.conf

[root@local ~]# mv /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bak                           # 重命名,然后校验
[root@local ~]# rpm -V httpd
missing   c /etc/httpd/conf/httpd.conf

[root@local ~]# rpm -Va            # 查看当前系统上所有被更改过的由rpm包安装生成的文件

如不输出任何信息,则表示指定程序包生成的文件均没有被改变;如改变则会按特定规则输出。
文件左边的字符用于表示哪个文件发生变化:

字符意义
c配置文件(configuration file)
d数据、文档文件(documentation file)
g鬼文件(ghost file),某文件不被指定程序包包含,很少出现这个
l许可证文件(license file)
r说明文件(readme file)

分割线———

前面的8位字符表示发生了何种变化:

字符意义
S大小(Size)改变
M模式(Mode)改变。指的是文件类型和文件权限
5MD5码改变
D主或次设备(Device)号改变
L读取路径改变
U属主改变
G属组改变
T修改时间改变
P功能(caPability8)改变

如果对应位置表示的内容没有改变,则使用“.”号。

2.3.6 验证程序包的来源合法性和内容完整性

使用数字签名9验证程序包的来源合法性与内容完整性。

互联网上的rpm包基本都有数字签名。公钥存储在系统光盘镜像上的RPM-GPG-KEY开头的文件内,实际上在安装时,此公钥又被安装在/etc/pki/目录下。不同的版本可能位置上有区别,可使用locate或find查找。

找到公钥的文件路径就可导入了:

[root@local media]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

如不导入公钥,则无法验证rpm包合法性与完整性。但只要安装rpm包,系统默认会自动去验证,所以这时会出现警告。

如果想在安装前手动验证下某程序包合法性与完整性,使用选项-K即可(也是要先导入公钥才能验证):

[root@local Packages]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
[root@local Packages]# rpm -K mysql-5.1.73-7.el6.x86_64.rpm 
mysql-5.1.73-7.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
# 验证成功,来源合法、内容完整

2.3.7 初始创建、重建数据库

如果数据库/var/lib/rpm不存在,则可初始化创建;如已存在,则初始化无任何动作,不会覆盖已有的。
如果损坏,则可重建,且就算没损坏也会重建,覆盖已有的。数据库的重建是依据当前系统上已安装的rpm包的首部(header)信息

初始化:

[root@local ~]# rm -rf /var/lib/rpm
[root@local ~]# rpm --initdb
[root@local ~]# ls /var/lib/rpm/
Packages  __db.001  __db.002  __db.003  __db.004

重建:

[root@local ~]# rpm --rebuilddb
[root@local ~]# ls /var/lib/rpm/
Packages

3.yum

3.1 为何使用yum

单个rpm包仅用于完成较单一的功能,很可能依赖其他包提供的功能。因此rpm包之间常有复杂的依赖关系(甚至循环依赖)。

如果使用rpm指令程序包,并逐个安装其依赖的其他程序包,会非常繁琐。

yum作为rpm的前端管理工具,就是为了解决rpm包之间的依赖关系。比如安装rpm包时,会自动先安装其所依赖的包。

3.2 机制

yum采用的是客户端/服务器端机制,yum仓库作为服务器端。仓库地址可以是网上的URL、FTP服务器、或本地文件路径,需在yum配置文件中指定。
把各rpm包放入yum服务器,并通过各rpm包所含的各自的依赖关系信息,制作出依赖关系列表。

这样安装一个rpm包的过程就变为:
安装软件过程

下载的依赖关系列表,会缓存至本地/var/cache/yum目录,这样就不需要每次都下载依赖关系列表,只需通过二者的校验码(如md5)比对本地缓存中的依赖关系列表与yum服务器上的是否相同。只有yum服务器上的列表出现更新才会重新下载,这样可减少带宽占用。

使用yum安装完成软件包后,软件包会被删除。

3.3 创建yum仓库

使用URL、FTP服务器、本地路径作为yum源,原理相同,只是前两者需先创建http、FTP服务器。
以下根据上述机制描述,创建一个本地的yum源(即仓库地址是本地文件路径):

1、把apache相关的一些软件包放在/root/test_yum目录下:

[root@localhost ~]# cd test_yum/
[root@localhost test_yum]# ls
ant-apache-bcel-1.7.1-15.el6.x86_64.rpm   ant-apache-regexp-1.7.1-15.el6.x86_64.rpm
ant-apache-bsf-1.7.1-15.el6.x86_64.rpm    ant-apache-resolver-1.7.1-15.el6.x86_64.rpm
ant-apache-log4j-1.7.1-15.el6.x86_64.rpm  apache-jasper-5.5.28-3.el6.noarch.rpm
ant-apache-oro-1.7.1-15.el6.x86_64.rpm    apache-tomcat-apis-0.1-1.el6.noarch.rpm

2、使用命令createrepo创建目录repodata,此目录下就是yum仓库中包含的软件列表、各软件间的依赖关系列表等元数据信息10

[root@localhost test_yum]# createrepo ./
Spawning worker 0 with 8 pkgs
Workers Finished
Gathering worker results
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete

[root@localhost test_yum]# ls
ant-apache-bcel-1.7.1-15.el6.x86_64.rpm    ant-apache-resolver-1.7.1-15.el6.x86_64.rpm
ant-apache-bsf-1.7.1-15.el6.x86_64.rpm     apache-jasper-5.5.28-3.el6.noarch.rpm
ant-apache-log4j-1.7.1-15.el6.x86_64.rpm   apache-tomcat-apis-0.1-1.el6.noarch.rpm
ant-apache-oro-1.7.1-15.el6.x86_64.rpm     repodata
ant-apache-regexp-1.7.1-15.el6.x86_64.rpm

这样创建的repodata目录,会与各程序包在同一路径下。也可使用选项“–basedir”指定repodata目录创建在哪个路径。比如系统光盘上就是把repodata目录创建在与Packages同级的目录了:

[root@localhost ~]# ls /media
CentOS_BuildTag  images                    repodata                       RPM-GPG-KEY-CentOS-Testing-6
EFI              isolinux                  RPM-GPG-KEY-CentOS-6           TRANS.TBL
EULA             Packages                  RPM-GPG-KEY-CentOS-Debug-6
GPL              RELEASE-NOTES-en-US.html  RPM-GPG-KEY-CentOS-Security-6

3.目录repodata所在的路径,就可(也只能是这个路径)作为yum源的路径了。repodata目录下包含依赖关系列表等元数据信息:

[root@localhost test_yum]# ls repodata/
1fa4d3fb19a7a878191b36d911958fd638da732eef57a8ea61cf58c0f0733a75-primary.sqlite.bz2
58ff43ad2e4db0b5a7c5374641635d1540b2536f56df900b2b45f4469db6743d-other.sqlite.bz2
77d18002ead86750d28c1791ac13d2fb6dff4e7da9fe102d47200293375baf4c-other.xml.gz
7d8a39efa548c97ef3a06a9e09eefc8de87a8e6c47e706407e058283a4589c1b-filelists.sqlite.bz2
ce547a2019ffd59b97228311bf62037b3d5d143d12f5e9adab1a5ef6d986a039-filelists.xml.gz
e9b85bfe09cec4b241c6e3a87bd9617441b5178a3ae3c9c86937764ad120da02-primary.xml.gz
repomd.xml                              # 这就是存储校验码的文件,用于检测repodata是否更新

3.4 yum配置文件

主配置文件/etc/yum.conf是所有yum仓库公共的配置,一般不需修改。
各yum仓库各自特有的配置(其中包括仓库指向)则是定义在/etc/yum.repos.d/目录下以“.repo”结尾的各文件11

3.4.1 .repo的文件格式

第一行是仓库ID,使用一个字符串并用中括号括起来,用于唯一标识yum仓库。
之后各行可定义其他配置:

变量意义
name仓库名
baseurl指定yum源。如yum源内的软件相同,则可同时指定多个;不同的话就写成两个yum仓库
enabled取值1或0。1表示启用此仓库,0表示不启用。默认是启用的。
gpgcheck取值1或0。基于此仓库安装程序包时,是否检查合法性和完整性。1检查;0不检查
gpgkey指明使用此仓库安装程序包时,用于验证合法性和完整性所需公钥的路径(或url)。类似rpm –import

上述这些定义完成后,一般就可正常使用了。还有俩其他值可能也会用到:

变量意义
failovermethod取值{roundrobin|priority}。当仓库的yum源指定了多个,roundrobin表示每次随机使用其中一个;priority表示顺序使用。默认是roundrobin
cost指定仓库的开销大小,默认值是1000。系统优先选择开销小的仓库使用。

比如,系统光盘挂载到了/media目录,那么以此为yum源的仓库可如此编辑:

[test]
name=test
baseurl=file:///media
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
enabled=1

下文示例均使用此仓库。

3.5 yum命令使用

命令格式:

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

其中常用的通用选项(options):

选项意义
-y安装程序包等过程中需用户输入“y”表示确认时,此选项表示自动确认
-q,–quiet安装等过程中,不输出信息至屏幕
–nogpgcheck表示安装或升级时不检查来源合法性与数据完整性,即便仓库配置文件中已定义了gpgcheck=1

下面说明下常用的各command:

  • repolist { all | enabled | disabled }
    用于列出当前系统的yum仓库列表,默认仅显示启用的(enabled)。

    [root@localhost Packages]# yum repolist 
    Failed to set locale, defaulting to C
    Loaded plugins: fastestmirror, refresh-packagekit, security
    Loading mirror speeds from cached hostfile
    repo id                                           repo name                                      status
    test                                              test                                           6696
    repolist: 6696
  • list
    用于列出yum仓库中的程序包。可指定列出所有的(all)、可安装的(available)、可升级的(updates)、或已安装的(installed)等等。同时也可使用globbing通配符查询指定的程序包。
    比如列出当前系统上yum仓库,所包含的可安装的、包名含“bash”的程序包:

    [root@localhost ~]# yum list available *bash*
    Loaded plugins: fastestmirror, refresh-packagekit, security
    Loading mirror speeds from cached hostfile
    Available Packages
    bash-doc.x86_64                                      4.1.2-40.el6                                  test
    pcp-pmda-bash.x86_64                                 3.10.9-6.el6                                  test
  • install,reinstall
    install用于安装程序包。
    默认安装最新版本,如需安装老版本,可在包名后加上版本号。
    使用yum安装程序包,完成后会删除程序包。
    reinstall表示重装程序包,覆盖原程序包。

  • update,check-update,downgrade
    用于升级、查询可用的升级、降级程序包。

  • remove或erase
    用于卸载程序包。
    依赖于要卸载的程序包的其他程序包,也会被自动卸载。

  • info
    输出程序包简要信息,类似“rpm -qi”。

  • provides或whatprovides
    查看指定的文件是由哪个程序包提供。类似“rpm -qf”选项。

  • clean
    用于手动清理yum缓存,即目录/var/cache/yum中的内容。
    可仅清理用于生成依赖关系的headers信息,也可以仅清理软件包名(packages)等(具体可通过man查看),因为这些信息在软件安装完成后不会自动被删除。
    全清理则使用all(比如当配置文件中的baseurl变化时可使用全清,因为原先的信息就没用了)。

  • deplist
    列出指定程序包的依赖关系,查看其依赖于哪些CAPABILITIES,以及这些程序由哪些包提供。

[root@localhost ~]# yum deplist bash
Loaded plugins: fastestmirror, refresh-packagekit, security
Finding dependencies: 
Determining fastest mirrors
test                                                                            | 4.0 kB     00:00 ... 
test/primary_db                                                                 | 4.7 MB     00:00 ... 
package: bash.x86_64 4.1.2-40.el6
  dependency: libc.so.6(GLIBC_2.4)(64bit)        # 依赖的capability
   provider: glibc.x86_64 2.12-1.192.el6         # 提供它的程序包
  dependency: libdl.so.2()(64bit)
   provider: glibc.x86_64 2.12-1.192.el6
  dependency: libtinfo.so.5()(64bit)
   provider: ncurses-libs.x86_64 5.7-4.20090207.el6
  dependency: rtld(GNU_HASH)
   provider: glibc.i686 2.12-1.192.el6
   provider: glibc.x86_64 2.12-1.192.el6
  dependency: libdl.so.2(GLIBC_2.2.5)(64bit)
   provider: glibc.x86_64 2.12-1.192.el6
  dependency: ncurses-libs
   provider: ncurses-libs.x86_64 5.7-4.20090207.el6
   provider: ncurses-libs.i686 5.7-4.20090207.el6
  • search
    用于在不确定(就是记不清)包名的情况下,通过字符串查询程序包。
    这并不与list完全相同,因为使用search默认会从包名、说明信息开始查找,如没有找到则会从描述(description)信息、或url查找等。

  • history
    查看事务历史。
    每次安装、升级、卸载都是一次yum事务(即有改动发生,查询不算是事务)。

    [root@localhost ~]# yum history
    Failed to set locale, defaulting to C
    Loaded plugins: fastestmirror, refresh-packagekit, security
    
    ID     | Login user               | Date and time    | Action(s)      | Altered
    -------------------------------------------------------------------------------
    
         2 | root <root>              | 2017-04-07 01:35 | Install        |    3   
         1 | System <unset>           | 2017-04-07 08:24 | Install        |  933   
    history list
  • 包组相关command
    与包组相关的command,功能同上,只是添加了“group”:

    命令意义
    grouplist显示yum仓库中的包组
    groupinstall安装包组中的程序包(包组中的所有包并不是都必须安装)
    groupupdate更新升级
    groupremove卸载
    groupinfo查看包组信息。其中列出了安装该包组时强制(mandatory)安装的包、可选(optional)安装的包等

    比如,查询包组“Java Platform”信息:

    [root@localhost ~]# yum groupinfo "Java Platform"
    Failed to set locale, defaulting to C
    Loaded plugins: fastestmirror, refresh-packagekit, security
    Setting up Group Process
    Loading mirror speeds from cached hostfile
    
    Group: Java Platform
     Description: Java support for the CentOS Linux Server and Desktop Platforms.
     Mandatory Packages:
       java-1.6.0-openjdk
       java-1.7.0-openjdk
     Optional Packages:
       icedtea-web
       java-1.8.0-openjdk

3.6 常见问题

笔者在实验中遇到的某些问题:

问题报错原因
执行install时,提示“nothing to do”yum仓库的数据库中没有相关包
执行install时,提示“No more mirrors to try”yum仓库的数据库中,记录有指定的包,但实际没有

对于第2点,笔者在使用centos6.8版本的光盘镜像安装“python-jinja2”包时遇到这种情况。使用“yum clean all”也没有起作用。后来发现可能是光盘本身的问题(应该是光盘的数据库中记录有该包,但实际没有)。
切换至光盘的Packages目录,果然搜索不到该包。所以使用了其他yum源来安装

(完)


  1. 有的程序功能较多,不一定全部要安装使用。所以各功能可做成独立的包,这个程序就包含多个包了。如下所述的httpd程序就包含多个包。
  2. 比如对于安装来说,包管理器会自动将二进制程序、库文件、配置文件等放在对应目录下。
  3. 具体什么机制,制作一个rpm包就明白了。
  4. 因为有了yum,rpm指令最常用功能是查询和校验。
  5. 当然query-options可写在包名前面。显然,如果对单个包进行查询,则其他select-options就不会同时使用了。
  6. capability可理解为“能力”,比如一个程序包能够提供的功能、配置文件、服务等都可视为它的“能力”
  7. 完整的脚本片段分为四个:安装前、安装后、卸载前、卸载后。不过并非所有程序都包含完整的脚本片段。
    这里对此仅做如上简要说明。制作一个rpm包时,会对脚本片段有更清楚认识。
  8. 这里的capability应该是文件的功能,而不是程序包的capability。否则只要有文件改变,这一位就得算上,因为程序包的capability包含其所生成的所有文件。
  9. 简单过程如下:
    1、先用单向加密算法(如MD5)把程序包内容M加密成密文A,并附在其后为M+A;
    2、再用非对称加密算法(如RSA)的私钥加密M+A为密文B。
    3、对方拿到密文B后,使用非对称加密算法的公钥解开,能够解开说明来源是合法的(没有被冒充);
    解开后用相同的单向加密算法加密密文M为C,比对C和A如果一致,说明内容是完整的(没有被篡改)。
  10. yum仓库中的依赖关系列表,就是由此命令创建而来。
  11. 实际上所有仓库的配置可写在同一个*.repo文件中,分开不同文件只是便于管理。
    在自行定义前,系统已经给出了一些yum仓库指向,如无需使用可先重命名它们,只要文件名不以“.repo”结尾就不会被认为是yum仓库配置文件
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值