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