“Linux包管理:rpm与yum”的版本间差异

来自Wikioe
跳到导航 跳到搜索
无编辑摘要
 
(未显示同一用户的26个中间版本)
第1行: 第1行:
[[category:Linux]]
[[category:Linux]]


== rpm ==
== RPM ==
RPM 即“RedHat Package Manager”,由RedHat公司开发并被广大Linux发行版所应用(如:Fedora,CentOS,SuSE等)。<br/>
RPM 即“RedHat Package Manager”,由RedHat公司开发并被广大Linux发行版所应用(如:Fedora,CentOS,SuSE等)。<br/>
特点:
特点:
第15行: 第15行:


=== 原理 ===
=== 原理 ===
[[File:RPM安装原理图.png|600px]]


=== 包命名规则 ===
=== 包命名规则 ===
“软件名称-版本号-发布次数.适合linux系统.硬件平台.rpm”<br/>
[[File:RPM包命名规则.png|400px]]
* rpm 操作未安装的软件包使用的是包全名,如“ftp-0.17-74.fc27.i686.rpm”;
* rpm 操作已安装的软件使用的是包名,如“ftp”;


=== 安装路径 ===
=== 安装路径 ===
RPM包文件默认安装位置
{| class="wikitable"
! 路径 !! 说明
|-
| /etc/ || 配置文件默认安装目录
|-
| /usr/bin/ || 可执行的命令安装目录
|-
| /usr/lib/ || 所依赖的函数库文件保存位置
|-
| /usr/share/doc/ || 软件帮助文档,使用手册保存位置
|-
| /usr/share/man/ || 软件手册,man page档案保存位置
|}
* rpm的数据库路径为/var/lib/rpm


== yum ==
== yum ==
yum 即 “Yellow dog Updater, Modified”,基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包。<br/>
YUM 即 “Yellow dog Updater, Modified”,基于 RPM 包管理的前端工具,YUM 可以看作是CS架构的软件,能够从指定的服务器自动下载 RPM 包并且安装,并自动处理依赖性关系,一次安装所有依赖的软体包。<br/>
yum 可以看作是CS架构的软件,YUM的存在很好的解决了RPM的属性依赖问题。提供了查找、安装、删除某一个、一组甚至全部软件包的命令。
* YUM的存在很好的解决了RPM的属性依赖问题。提供了查找、安装、删除某一个、一组甚至全部软件包的命令。
* YUM通过依赖rpm软件包管理器, 实现了rpm软件包管理器在功能上的扩展, 因此YUM是不能脱离rpm而独立运行的。
* YUM 通过依赖rpm软件包管理器, 实现了rpm软件包管理器在功能上的扩展, 因此YUM是不能脱离rpm而独立运行的。


特点:
特点:
第33行: 第54行:


=== 原理 ===
=== 原理 ===
[[File:YUM安装原理图.png|500px]]


=== 配置文件 ===
Server端:
==== 容器查询 ====
# 对程序包进行分类后存储到不同repository容器中;
==== 配置文件修改 ====
# 再通过收集到的大量的rpm数据库文件,获得程序包之间的依赖关系数据,并在本地的repodata目录生成对应说明文件(.xml),以供Client端取用;
#: 说明文件:存放依赖关系和所需文件在本地的存放位置
Cilent端:
# 通过yum命令安装软件时发现缺少某些依赖性程序包,Client会根据本地的配置文件(/etc/yum.repos.d/*.repo)找到指定的Server端;
# 从Server端repo目录下获取说明文件(.xml)后存储在本地/var/cache/yum中方便以后读取, 通过xxx.xml文件查找到需要安装的依赖性程序包在Server端的存放位置;
# 再进入Server端yum库中的指定repository容器中获取所需程序包, 下载完成后在本地实现安装。
 
 
* YUM是一个在线软件管理工具,所以使用YUM进行的操作大都是需要在联网的条件下才能正常使用。
 
=== 配置 ===
yum 的配置文件分为两部分:main 和 repository
# main 部分定义了全局配置选项,整个yum 配置文件应该只有一个main。常位于/etc/yum.conf 中。
# repository 部分定义了每个源/服务器的具体配置,可以有一到多个。常位于/etc/yum.repo.d 目录下的各文件中。
 
* yum.conf 文件一般位于/etc目录下,一般其中只包含main部分的配置选项。
* /etc/yum.repos.d/xxx.repoyum 中配置合适的站点镜像,以保证yum源的正常使用。
 
==== main ====
yum.conf 文件一般位于/etc目录下,一般其中只包含main部分的配置选项。<br/>
 
<syntaxhighlight lang="properties">
[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=5
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release
 
 
#  This is the default, if you make this bigger yum won't see if the metadata
# is newer on the remote and so you'll "gain" the bandwidth of not having to
# download the new metadata and "pay" for it by yum not having correct
# information.
#  It is esp. important, to have correct metadata, for distributions like
# Fedora which don't keep old packages around. If you don't like this checking
# interupting your command line usage, it's much better to have something
# manually check the metadata once an hour (yum-updatesd will do this).
# metadata_expire=90m
 
# PUT YOUR REPOS HERE OR IN separate files named file.repo
# in /etc/yum.repos.d
exclude=httpd nginx php mysql mairadb python-psutil python2-psutil
</syntaxhighlight>
{| class="wikitable"
! 配置 !! 说明
|-
| cachedir
| yum 缓存的目录,yum在此存储下载的rpm包和数据库,默认设置为/var/cache/yum
|-
| keepcache
| 安装完成后是否保留软件包,0为不保留(默认为0),1为保留
|-
| debuglevel
| Debug信息输出等级,范围为0-10,缺省为2
|-
| logfile
| yum日志文件位置。用户可以到日志文件去查询过去所做的更新
|-
| pkgpolicy
| 包的策略:如果设置了多个repository时,若同一软件在不同的repository中同时存在,yum应该安装哪一个
# newest:安装最新的那个版本
# last:将服务器id 以字母表排序,并选择最后的那个服务器上的软件安装
一般用newest
|-
| distroverpkg
| 指定一个软件包,yum会根据这个包判断你的发行版本,默认是redhat-release
|-
| tolerant
| 是否容忍命令行发生与软件包有关的错误
# 0:默认,显示错误信息
# 1:不出现错误信息
|-
| exactarch
| 有1和0两个选项,设置为1(默认),则yum只会安装和系统架构匹配的软件包
|-
| retries
| 网络连接发生错误后的重试次数,如果设为0,则会无限重试。默认值为6.
|-
| obsoletes
| 这是一个update的参数,简单的说就是相当于upgrade,允许更新陈旧的RPM包
|-
| plugins
| 是否启用插件,默认1为允许,0表示不允许
我们一般会用yum-fastestmirror这个插件
|-
| bugtracker_url
|
|-
| metadata_expire
|
|-
| installonly_limit
|
|-
| exclude
|
|-
| gpgcheck
| 是否是否进行gpg(GNU Private Guard) 校验,以确定rpm 包的来源是有效和安全的。0(默认,否)1(是)
|}
 
==== repository ====
所有repository 服务器设置都应该遵循如下格式:
<syntaxhighlight lang="properties">
[serverid]
name=Some name for this server
baseurl=url://path/to/repository/
</syntaxhighlight>
{| class="wikitable"
! 配置 !! 说明
|-
| [serverid]
| 是用于区别各个不同的repository,必须有一个独一无二的名称;
|-
| name
| 对repository 的描述,支持像$releasever $basearch这样的变量;
|-
| baseurl
| 服务器设置中最重要的部分,只有设置正确,才能从上面获取软件。
# baseurl后可以跟多个url,但baseurl只能有一个,格式:
#: <syntaxhighlight lang="properties">
baseurl=url://server1/path/to/repository/
     url://server2/path/to/repository/
     url://server3/path/to/repository/
</syntaxhighlight>
# 其中url 支持的协议有 http:// ftp:// file:// 三种
# url 指向的目录必须是这个repository header 目录的上一级,它也支持$releasever、$basearch这样的变量。
|-
| enable
| 启动这个容器,默认值也为1。关闭这个容器可以设置enable=0。
|-
| mirrorlist
| 列出这个容器可以使用的镜像站点,如果不想使用可以批注掉这一行。
|-
| failovermethod
| 有多个url可供选择时,yum选择的次序(roundrobin:随机选择;priority:默认,按url配置依次选择)
|-
| gpgcheck
| 指定是否需要查阅RPM文件内的数字证书。
|-
| gpgkey
| 数字证书的公钥文件所在位置,使用默认值即可。
|}
* 其中gpgcheck,exclude 的含义和[main] 部分相同,但只对此服务器起作用。
 
 
查看yum配置文件,如“vi /etc/yum.repos.d/CenOS-Base.repo”:<br/>
[[File:yum配置文件.png|600px]]<br/>
 
==== 容器 ====
容器就是指Server端存放程序包的repository,包括centosplus、extras、fasttrack、os、updates等容器。最重要的一个目录就是那个“repodata”,该目录是分析RPM软件后所产生的软件依赖数据放置处。【???没看到】<br/>
 
查询yum使用的容器有哪些:
<syntaxhighlight lang="bash">
yum repolist all
</syntaxhighlight>
[[File:yum使用的容器.png|600px]]
* 只有当最右边的status为enabled该容器才算激活
* /etc/yum.repos.d/ 里面会有多个配置文件(.repo),yum会从里面逐个查找,所以文件里的容器名称不能有重复。


== RPM 命令 ==
== RPM 命令 ==
rpm命令:
<syntaxhighlight lang="bash">
rpm [options] [PACKAGE_FILE]
</syntaxhighlight>
[options]:
# 安装:-i,--install
# 升级:-U,--update,-F,--freshen
# 卸载:-e,--erase
# 查询:-q,--query
# 校验:-V,--verify
# 数据库维护:--builddb,--initdb
{| class="wikitable"
! 命令 !! 说明
|-
! colspan="2"| 安装
|-
| <syntaxhighlight lang="bash">
rpm {-i|--install} [options] PACKAGE_FILE
</syntaxhighlight>
| 安装、升级首先要到网上下载对应的rpm包
* 如果想安装多个用空格间隔然后接上要安装的rpm包即可,同时也支持通过网址的资源来安装
[options]:
# -v:显示指令执行过程;
# -h,-hash:显示指令的进度;
# --test:不安装,只是检查与报告该软件潜在的依赖冲突;
# --nodeps:忽略依赖关系安装;
# --replacepkgs:重新安装,通常用于在程序出错后重新安装程序;
# --nosignature:不检查包签名信息,即不检查来源的合法性;
# --nodigest:不检查包的完整性;
|-
! colspan="2"| 升级
|-
| <syntaxhighlight lang="bash">
rpm {-U|--upgrade} [options] PACKAGE_FILE
rpm {-F|--freshen} [options] PACKAGE_FILE
</syntaxhighlight>
|
* upgrade:更新软件,若系统中没有该软件则进行安装
* freshen:更新系统已安装的某个软件
[options]:
# --oldpackage:降级安装;
|-
! colspan="2"| 卸载
|-
| <syntaxhighlight lang="bash">
rpm {-e|--erase} [options] PACKAGE_NAME
</syntaxhighlight>
| erase options:
# --nodeps:忽略依赖关系卸载;
# --allmatches:卸载所有匹配指定名称的程序包;
# --test:测试卸载,不是真实的卸载;
|-
! colspan="2"| 查询
|-
| <syntaxhighlight lang="bash">
rpm {-q|--query} [select-options] [query-options]
</syntaxhighlight>
| rpm命令的查询动作是通过查询/var/lib/rpm的数据库来进行显示。
[select-options]:
# PACKAGE_NAME:查询是否已安装指定的RPM包;
# -a,--all:查询所有已经安装的RPM包;
# -f FILE:查询指定的文件由哪个程序包安装生成;
# -p,--package PACKAGE_FILE:对未安装的程序包执行查询操作;
# --whatprovides CAPABILITY:查询指定的功能由哪些程序包提供;
# --whatrequires CAPABILITY:查询需要安装指定功能才能正常运行的程序包;
[query-options]:
# --changelog:查询rpm包的修改日志;
# -l,--list:查询程序安装所产生的所有文件列表;
# -i,--info:查询程序包相关的信息,如版本号,大小,所属包组等;
# -c,--configfiles:查询知道你个的程序提供的配置文件;
# -d,--docfiles:查询指定的程序包所提供的帮助文件;
# --provides:列出指定的程序包所提供的所有功能;
# -R,--requires:查询指定的程序包的依赖关系;
# --scripts:查询程序包自带的脚本信息;
|-
! colspan="2"| 校验
|-
| <syntaxhighlight lang="bash">
rpm {-V|--verify} [select-options] [verify-options]
</syntaxhighlight>
| rpm包的检验后的输出类似如下:
<syntaxhighlight lang="bash">SM5DLUGT c /etc/profile.d/vim.sh</syntaxhighlight>
其中“SM5DLUGT”:
# S:对应文件大小不一致
# M:对应的文件类型或权限不一致;
# 5:文件对应的MD5值不一致;
# D:设备的major/minor码不匹配;
# L:文件符号链接不一致;
# U:表示文件的所有者不一致。
# G:表示文件的所属组不一致。
# T:表示文件的修改时间不一致;
其中“c”表示文件类型:
# c:配置文件(config file);
# d:普通文档(documentation);
# g:“鬼”文件(ghost file),即该文件不应该被这个RPM包所包含;
# l:授权文件(license file);
# r:描述文件(read me);
|-
! colspan="2"| 维护(重建)
|-
| <syntaxhighlight lang="bash">
rpm {--initdb|--rebuilddb}
</syntaxhighlight>
| 重建rpm的数据库(/var/lib/rpm)
# --initdb:初始化数据库,
#: 当rpm不存在任何数据库时,可初始化创建一个新的数据库;
#: 当存在一个数据库时,不执行任何操作;
# --rebuilddb:重新构建,通过读取当前系统上的所有已安装过的程序包进行数据库的重建;
|}
=== 示例 ===
<syntaxhighlight lang="bash">
# 安装RPM包
rpm -ivh zsh-5.0.2-28.el7.x86_64.rpm
# 升级RPM包
rpm -Uvh zsh-5.0.2-28.el7.x86_64.rpm
# 卸载RPM包
rpm -e vim-enhanced-7.4.160-2.el7.x86_64
# 查询RPM包
rpm -q zsh
# 查询程序包安装完后生成的所有配置文件
rpm -qc zsh
</syntaxhighlight>
=== rpm包的验证 ===
【???】<br/>
RPM程序包的验证有两种,一种是包来源的合法性验证,另一种是包的完整性验证。<br/>
这两种验证分别依赖于制作者的数字签名和程序特征码完成。数字签名是包的制作者使用单向加密提取原始数据的特征码,而后使用自己的私钥加密这段特性码,附加原始数据后面。<br/>
验证过程:
* 前提:必须有可靠机制获取到包制作者的公钥;
# 使用制作者的公钥解密加密的特征码,能解密则意味着来源合法。
# 对文件进行相应的完整性校验工具MD5|SHA-1 等得到特征码对比制作者提供的加密特征码,一致则认为包完整。
对于centos发行版来说,通过下面命令可以获取并导入信任的包制作者的密钥:
<syntaxhighlight lang="bash">
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
</syntaxhighlight>


== YUM 命令 ==
== YUM 命令 ==
yum的命令格式:
<syntaxhighlight lang="bash">
yum [options] [command] [package ...]
</syntaxhighlight>
# command:
#: <syntaxhighlight lang="properties">
check #检测 rpmdb 是否有问题
check-update #检查可更新的包
clean #清除缓存的数据
deplist #显示包的依赖关系
distribution-synchronization #将已安装的包同步到最新的可用版本
downgrade #降级一个包
erase #删除包
groupinfo #显示包组的详细信息
groupinstall #安装指定的包组
grouplist #显示可用包组信息
groupremove #从系统删除已安装的包组
help #显示帮助信息
history #显示或使用交互历史
info #显示包或包组的详细信息
install #安装包
list #显示可安装或可更新的包
makecache #生成元数据缓存
provides #搜索特定包文件名
reinstall #重新安装包
repolist #显示已配置的资源库
resolvedep #指事实上依赖
search #搜索包
shell #进入yum的shell提示符
update #更新系统中的包
upgrade #升级系统中的包
version #显示机器可用源的版本
</syntaxhighlight>
# options:
#: <syntaxhighlight lang="properties">
-h, --help #显示帮助信息
-t, --tolerant #容错
-C, --cacheonly #完全从系统缓存中运行,不更新缓存
-c [config file], --config=[config file] #本地配置文件
-R [minutes], --randomwait=[minutes] #命令最大等待时间
-d [debug level], --debuglevel=[debug level] #设置调试级别
-e [error level], --errorlevel=[error level] #设置错误等级
-q, --quiet #静默执行,不显示命令的过程
-v, --verbose #详细模式
-y, --assumeyes #对所有交互提问都回答 yes
</syntaxhighlight>
=== 常用命令 ===
参考[[YUM COMMAND CHEAT SHEET]]
{| class="wikitable"
! 操作 !! 命令
|-
| 安装/升级
|
安装:
# yum install xxx:
# yum groupinstall xxx:
# yum grouplist:查看可安装的包组
升级
# yum update:升级整个系统的rpm管理的软件
# yum update xxx:
# yum groupupdate xxx:
# yum check-update:列出所有可更新的软件清单
|-
| 移除
|
# yum remove xxx:
# yum groupremove xxx:
# yum deplist xxx:查看程序xxx依赖情况
|-
| 查询
| 相关参数:
# search:搜寻软件名称或者是描述有关键字的软件;
# list:列出目前yum所管理的所有软件,的名称与版本;
# info:列出目前yum所管理的所有软件,的具体信息;
# provides:搜索哪个包给出了该关键字;
示例:
# yum search git:搜寻git相关的软件有哪些
找出 git 这个软件的功能为何
# yum info xxx:显示安装包xxx的具体信息
# yum list:列出所有可安裝的软件清单
# yum list all:列出所有已安装和可安装的软件
# yum list available:...可安装
# yum list installed:...已安装
# yum list xxx:显示指定程序包xxx的安装情况
# yum list updates:列出所有可升级的软件
# yum provides passwd:找出哪个包有passwd关键字
|-
| 清除缓存
| yum 会把下载的软件包和header存储在cache(/var/cache/yum)中,而不会自动删除。
# yum clean packages:清除缓存目录下的软件包
# yum clean headers:清除缓存目录下的headers
# yum clean oldheaders:清除缓存目录下旧的headers
# yum clean, yum clean all:清除缓存目录下的软件包、旧的headers
#: = yum clean packages; yum clean oldheaders
|}
=== '''yum update''' 与 '''yum upgrade''' ===
在 CentOS 系统中,yum upgrade 与 yum update 都会将系统包更新到最新版本。(它们都对软件进行升级,也都对内核进行升级)
但二者还是略微有些差异。
参考 man yum 的帮助信息:
: <syntaxhighlight lang="bash" highlight="">
update If run without any packages, update will update every currently installed package.  If one or more packages or package globs are specified, Yum will only
              update  the listed packages.  While updating packages, yum will ensure that all dependencies are satisfied. (See Specifying package names for more infor‐
              mation) If the packages or globs specified match to packages which are not currently installed then update will not  install  them.  update  operates  on
              groups, files, provides and filelists just like the "install" command.
              If the main obsoletes configure option is true (default) or the --obsoletes flag is present yum will include package obsoletes in its calculations - this
              makes it better for distro-version changes, for example: upgrading from somelinux 8.0 to somelinux 9.
              Note that "update" works on installed packages first, and only if there are no matches does it look  for  available  packages.  The  difference  is  most
              noticeable  when you do "update foo-1-2" which will act exactly as "update foo" if foo-1-2 is installed. You can use the "update-to" if you'd prefer that
              nothing happen in the above case.
upgrade        Is the same as the update command with the --obsoletes flag set. See update for more details.
</syntaxhighlight>
* “'''--obsoletes'''”:定义了更新时处理软件包的取代关系(是否允许更新陈旧的RPM包);
*: 即,启用它会删除旧版本的package;
* 但,在 /etc/yum.conf 文件中可以看到,默认的配置中 --obsoletes 选项为 true (开启):
*: <syntaxhighlight lang="xml" highlight="">
[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=5
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release
</syntaxhighlight>
所以,唯一的区别是:<big>'''“yum update”不删除旧包,而“yum upgrade”删除旧包'''</big>,在默认情况下(obsoletes=1)二者没有区别。
* 在生产环境中最好使用“yum update”,防止因旧软件包依赖而出现问题。
== 示例 ==
以安装 RabbitMQ 为例(实际 RabbitMQ 需要先安装 Erlang):
# 离线安装(本地 rpm 包):
#: <syntaxhighlight lang="bash" highlight="">
# 下载rpm包(或上传rpm包)
wget https://www.rabbitmq.com/releases/rabbitmq-server/v3.6.10/rabbitmq-server-3.6.10-1.el7.noarch.rpm
# 导入GPG密钥(不一定需要)
rpm –import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc
# 安装本地包
rpm -Uvh rabbitmq-server-3.6.10-1.el7.noarch.rpm
# 安装本地包
yum install -y rabbitmq-server-3.6.15-1.el7.noarch.rpm
</syntaxhighlight>
# 在线安装(服务器 rpm 包):
#: <syntaxhighlight lang="bash" highlight="">
# rpm
rpm -Uvh https://www.rabbitmq.com/releases/rabbitmq-server/v3.6.10/rabbitmq-server-3.6.10-1.el7.noarch.rpm
# yum
yum install -y https://www.rabbitmq.com/releases/rabbitmq-server/v3.6.10/rabbitmq-server-3.6.10-1.el7.noarch.rpm
</syntaxhighlight>
P.S.:
* '''wget''' 默认下载到当前目录,如果要指定下载的位置,使用“'''-P'''”参数,如:<syntaxhighlight lang="bash" inline>wget -P /root/download 网址</syntaxhighlight>

2021年11月29日 (一) 05:55的最新版本


RPM

RPM 即“RedHat Package Manager”,由RedHat公司开发并被广大Linux发行版所应用(如:Fedora,CentOS,SuSE等)。
特点:

  • 需要安装的软件已经编译过,打包成RPM机制的安装包(.rpm),并通过里头默认的数据库记录这个软件安装时需要的依赖软件;
  • 安装时,RPM会根据安装包里面的依赖关系,查询系统中是否满足相应的条件,如果满足则安装,否则会报错。
  • 安装后,RPM会把该软件的信息写入到主机RPM的数据库中,以便将来的查询、验证、升级和卸载等操作。

缺点:

  • 软件包安装的环境必须与打包时的环境一致或相当
  • 必须安装了软件的依赖软件
  • 卸载时,最底层的软件不能先移除,否则可能造成整个系统不能用

为了解决RPM属性依赖的问题,可以使用YUM进行操作。

原理

RPM安装原理图.png

包命名规则

“软件名称-版本号-发布次数.适合linux系统.硬件平台.rpm”
RPM包命名规则.png

  • rpm 操作未安装的软件包使用的是包全名,如“ftp-0.17-74.fc27.i686.rpm”;
  • rpm 操作已安装的软件使用的是包名,如“ftp”;

安装路径

RPM包文件默认安装位置

路径 说明
/etc/ 配置文件默认安装目录
/usr/bin/ 可执行的命令安装目录
/usr/lib/ 所依赖的函数库文件保存位置
/usr/share/doc/ 软件帮助文档,使用手册保存位置
/usr/share/man/ 软件手册,man page档案保存位置
  • rpm的数据库路径为/var/lib/rpm

yum

YUM 即 “Yellow dog Updater, Modified”,基于 RPM 包管理的前端工具,YUM 可以看作是CS架构的软件,能够从指定的服务器自动下载 RPM 包并且安装,并自动处理依赖性关系,一次安装所有依赖的软体包。

  • YUM的存在很好的解决了RPM的属性依赖问题。提供了查找、安装、删除某一个、一组甚至全部软件包的命令。
  • YUM 通过依赖rpm软件包管理器, 实现了rpm软件包管理器在功能上的扩展, 因此YUM是不能脱离rpm而独立运行的。

特点:

  • 可以同时配置多个资源库(Repository)
  • 简洁的配置文件(/etc/yum.conf)
  • 自动解决增加或删除rpm包时遇到的依赖性问题
  • 使用方便
  • 保持与RPM数据库的一致性

原理

YUM安装原理图.png

Server端:

  1. 对程序包进行分类后存储到不同repository容器中;
  2. 再通过收集到的大量的rpm数据库文件,获得程序包之间的依赖关系数据,并在本地的repodata目录生成对应说明文件(.xml),以供Client端取用;
    说明文件:存放依赖关系和所需文件在本地的存放位置

Cilent端:

  1. 通过yum命令安装软件时发现缺少某些依赖性程序包,Client会根据本地的配置文件(/etc/yum.repos.d/*.repo)找到指定的Server端;
  2. 从Server端repo目录下获取说明文件(.xml)后存储在本地/var/cache/yum中方便以后读取, 通过xxx.xml文件查找到需要安装的依赖性程序包在Server端的存放位置;
  3. 再进入Server端yum库中的指定repository容器中获取所需程序包, 下载完成后在本地实现安装。


  • YUM是一个在线软件管理工具,所以使用YUM进行的操作大都是需要在联网的条件下才能正常使用。

配置

yum 的配置文件分为两部分:main 和 repository

  1. main 部分定义了全局配置选项,整个yum 配置文件应该只有一个main。常位于/etc/yum.conf 中。
  2. repository 部分定义了每个源/服务器的具体配置,可以有一到多个。常位于/etc/yum.repo.d 目录下的各文件中。
  • yum.conf 文件一般位于/etc目录下,一般其中只包含main部分的配置选项。
  • /etc/yum.repos.d/xxx.repoyum 中配置合适的站点镜像,以保证yum源的正常使用。

main

yum.conf 文件一般位于/etc目录下,一般其中只包含main部分的配置选项。

[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=5
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release


#  This is the default, if you make this bigger yum won't see if the metadata
# is newer on the remote and so you'll "gain" the bandwidth of not having to
# download the new metadata and "pay" for it by yum not having correct
# information.
#  It is esp. important, to have correct metadata, for distributions like
# Fedora which don't keep old packages around. If you don't like this checking
# interupting your command line usage, it's much better to have something
# manually check the metadata once an hour (yum-updatesd will do this).
# metadata_expire=90m

# PUT YOUR REPOS HERE OR IN separate files named file.repo
# in /etc/yum.repos.d
exclude=httpd nginx php mysql mairadb python-psutil python2-psutil
配置 说明
cachedir yum 缓存的目录,yum在此存储下载的rpm包和数据库,默认设置为/var/cache/yum
keepcache 安装完成后是否保留软件包,0为不保留(默认为0),1为保留
debuglevel Debug信息输出等级,范围为0-10,缺省为2
logfile yum日志文件位置。用户可以到日志文件去查询过去所做的更新
pkgpolicy 包的策略:如果设置了多个repository时,若同一软件在不同的repository中同时存在,yum应该安装哪一个
  1. newest:安装最新的那个版本
  2. last:将服务器id 以字母表排序,并选择最后的那个服务器上的软件安装

一般用newest

distroverpkg 指定一个软件包,yum会根据这个包判断你的发行版本,默认是redhat-release
tolerant 是否容忍命令行发生与软件包有关的错误
  1. 0:默认,显示错误信息
  2. 1:不出现错误信息
exactarch 有1和0两个选项,设置为1(默认),则yum只会安装和系统架构匹配的软件包
retries 网络连接发生错误后的重试次数,如果设为0,则会无限重试。默认值为6.
obsoletes 这是一个update的参数,简单的说就是相当于upgrade,允许更新陈旧的RPM包
plugins 是否启用插件,默认1为允许,0表示不允许

我们一般会用yum-fastestmirror这个插件

bugtracker_url
metadata_expire
installonly_limit
exclude
gpgcheck 是否是否进行gpg(GNU Private Guard) 校验,以确定rpm 包的来源是有效和安全的。0(默认,否)1(是)

repository

所有repository 服务器设置都应该遵循如下格式:

[serverid]
name=Some name for this server
baseurl=url://path/to/repository/
配置 说明
[serverid] 是用于区别各个不同的repository,必须有一个独一无二的名称;
name 对repository 的描述,支持像$releasever $basearch这样的变量;
baseurl 服务器设置中最重要的部分,只有设置正确,才能从上面获取软件。
  1. baseurl后可以跟多个url,但baseurl只能有一个,格式:
    baseurl=url://server1/path/to/repository/
         url://server2/path/to/repository/
         url://server3/path/to/repository/
    
  2. 其中url 支持的协议有 http:// ftp:// file:// 三种
  3. url 指向的目录必须是这个repository header 目录的上一级,它也支持$releasever、$basearch这样的变量。
enable 启动这个容器,默认值也为1。关闭这个容器可以设置enable=0。
mirrorlist 列出这个容器可以使用的镜像站点,如果不想使用可以批注掉这一行。
failovermethod 有多个url可供选择时,yum选择的次序(roundrobin:随机选择;priority:默认,按url配置依次选择)
gpgcheck 指定是否需要查阅RPM文件内的数字证书。
gpgkey 数字证书的公钥文件所在位置,使用默认值即可。
  • 其中gpgcheck,exclude 的含义和[main] 部分相同,但只对此服务器起作用。


查看yum配置文件,如“vi /etc/yum.repos.d/CenOS-Base.repo”:
Yum配置文件.png

容器

容器就是指Server端存放程序包的repository,包括centosplus、extras、fasttrack、os、updates等容器。最重要的一个目录就是那个“repodata”,该目录是分析RPM软件后所产生的软件依赖数据放置处。【???没看到】

查询yum使用的容器有哪些:

yum repolist all

Yum使用的容器.png

  • 只有当最右边的status为enabled该容器才算激活
  • /etc/yum.repos.d/ 里面会有多个配置文件(.repo),yum会从里面逐个查找,所以文件里的容器名称不能有重复。

RPM 命令

rpm命令:

rpm [options] [PACKAGE_FILE]

[options]:

  1. 安装:-i,--install
  2. 升级:-U,--update,-F,--freshen
  3. 卸载:-e,--erase
  4. 查询:-q,--query
  5. 校验:-V,--verify
  6. 数据库维护:--builddb,--initdb
命令 说明
安装
rpm {-i|--install} [options] PACKAGE_FILE
安装、升级首先要到网上下载对应的rpm包
  • 如果想安装多个用空格间隔然后接上要安装的rpm包即可,同时也支持通过网址的资源来安装

[options]:

  1. -v:显示指令执行过程;
  2. -h,-hash:显示指令的进度;
  3. --test:不安装,只是检查与报告该软件潜在的依赖冲突;
  4. --nodeps:忽略依赖关系安装;
  5. --replacepkgs:重新安装,通常用于在程序出错后重新安装程序;
  6. --nosignature:不检查包签名信息,即不检查来源的合法性;
  7. --nodigest:不检查包的完整性;
升级
rpm {-U|--upgrade} [options] PACKAGE_FILE
rpm {-F|--freshen} [options] PACKAGE_FILE
  • upgrade:更新软件,若系统中没有该软件则进行安装
  • freshen:更新系统已安装的某个软件

[options]:

  1. --oldpackage:降级安装;
卸载
rpm {-e|--erase} [options] PACKAGE_NAME
erase options:
  1. --nodeps:忽略依赖关系卸载;
  2. --allmatches:卸载所有匹配指定名称的程序包;
  3. --test:测试卸载,不是真实的卸载;
查询
rpm {-q|--query} [select-options] [query-options]
rpm命令的查询动作是通过查询/var/lib/rpm的数据库来进行显示。

[select-options]:

  1. PACKAGE_NAME:查询是否已安装指定的RPM包;
  2. -a,--all:查询所有已经安装的RPM包;
  3. -f FILE:查询指定的文件由哪个程序包安装生成;
  4. -p,--package PACKAGE_FILE:对未安装的程序包执行查询操作;
  5. --whatprovides CAPABILITY:查询指定的功能由哪些程序包提供;
  6. --whatrequires CAPABILITY:查询需要安装指定功能才能正常运行的程序包;

[query-options]:

  1. --changelog:查询rpm包的修改日志;
  2. -l,--list:查询程序安装所产生的所有文件列表;
  3. -i,--info:查询程序包相关的信息,如版本号,大小,所属包组等;
  4. -c,--configfiles:查询知道你个的程序提供的配置文件;
  5. -d,--docfiles:查询指定的程序包所提供的帮助文件;
  6. --provides:列出指定的程序包所提供的所有功能;
  7. -R,--requires:查询指定的程序包的依赖关系;
  8. --scripts:查询程序包自带的脚本信息;
校验
rpm {-V|--verify} [select-options] [verify-options]
rpm包的检验后的输出类似如下:
SM5DLUGT c /etc/profile.d/vim.sh

其中“SM5DLUGT”:

  1. S:对应文件大小不一致
  2. M:对应的文件类型或权限不一致;
  3. 5:文件对应的MD5值不一致;
  4. D:设备的major/minor码不匹配;
  5. L:文件符号链接不一致;
  6. U:表示文件的所有者不一致。
  7. G:表示文件的所属组不一致。
  8. T:表示文件的修改时间不一致;

其中“c”表示文件类型:

  1. c:配置文件(config file);
  2. d:普通文档(documentation);
  3. g:“鬼”文件(ghost file),即该文件不应该被这个RPM包所包含;
  4. l:授权文件(license file);
  5. r:描述文件(read me);
维护(重建)
rpm {--initdb|--rebuilddb}
重建rpm的数据库(/var/lib/rpm)
  1. --initdb:初始化数据库,
    当rpm不存在任何数据库时,可初始化创建一个新的数据库;
    当存在一个数据库时,不执行任何操作;
  2. --rebuilddb:重新构建,通过读取当前系统上的所有已安装过的程序包进行数据库的重建;

示例

# 安装RPM包
rpm -ivh zsh-5.0.2-28.el7.x86_64.rpm 
# 升级RPM包
rpm -Uvh zsh-5.0.2-28.el7.x86_64.rpm 
# 卸载RPM包
rpm -e vim-enhanced-7.4.160-2.el7.x86_64
# 查询RPM包
rpm -q zsh
# 查询程序包安装完后生成的所有配置文件
rpm -qc zsh

rpm包的验证

【???】
RPM程序包的验证有两种,一种是包来源的合法性验证,另一种是包的完整性验证。
这两种验证分别依赖于制作者的数字签名和程序特征码完成。数字签名是包的制作者使用单向加密提取原始数据的特征码,而后使用自己的私钥加密这段特性码,附加原始数据后面。
验证过程:

  • 前提:必须有可靠机制获取到包制作者的公钥;
  1. 使用制作者的公钥解密加密的特征码,能解密则意味着来源合法。
  2. 对文件进行相应的完整性校验工具MD5|SHA-1 等得到特征码对比制作者提供的加密特征码,一致则认为包完整。

对于centos发行版来说,通过下面命令可以获取并导入信任的包制作者的密钥:

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

YUM 命令

yum的命令格式:

yum [options] [command] [package ...]
  1. command:
    check											#检测 rpmdb 是否有问题
    check-update									#检查可更新的包
    clean											#清除缓存的数据
    deplist											#显示包的依赖关系
    distribution-synchronization					#将已安装的包同步到最新的可用版本
    downgrade										#降级一个包
    erase											#删除包
    groupinfo										#显示包组的详细信息
    groupinstall									#安装指定的包组
    grouplist										#显示可用包组信息
    groupremove										#从系统删除已安装的包组
    help											#显示帮助信息
    history											#显示或使用交互历史
    info											#显示包或包组的详细信息
    install											#安装包
    list											#显示可安装或可更新的包
    makecache										#生成元数据缓存
    provides										#搜索特定包文件名
    reinstall										#重新安装包
    repolist										#显示已配置的资源库
    resolvedep										#指事实上依赖
    search											#搜索包
    shell											#进入yum的shell提示符
    update											#更新系统中的包
    upgrade											#升级系统中的包
    version											#显示机器可用源的版本
    
  2. options:
    -h, --help										#显示帮助信息
    -t, --tolerant									#容错
    -C, --cacheonly									#完全从系统缓存中运行,不更新缓存
    -c [config file], --config=[config file]		#本地配置文件
    -R [minutes], --randomwait=[minutes]			#命令最大等待时间
    -d [debug level], --debuglevel=[debug level]	#设置调试级别
    -e [error level], --errorlevel=[error level]	#设置错误等级
    -q, --quiet										#静默执行,不显示命令的过程
    -v, --verbose									#详细模式
    -y, --assumeyes									#对所有交互提问都回答 yes
    

常用命令

参考YUM COMMAND CHEAT SHEET

操作 命令
安装/升级

安装:

  1. yum install xxx:
  2. yum groupinstall xxx:
  3. yum grouplist:查看可安装的包组

升级

  1. yum update:升级整个系统的rpm管理的软件
  2. yum update xxx:
  3. yum groupupdate xxx:
  4. yum check-update:列出所有可更新的软件清单
移除
  1. yum remove xxx:
  2. yum groupremove xxx:
  3. yum deplist xxx:查看程序xxx依赖情况
查询 相关参数:
  1. search:搜寻软件名称或者是描述有关键字的软件;
  2. list:列出目前yum所管理的所有软件,的名称与版本;
  3. info:列出目前yum所管理的所有软件,的具体信息;
  4. provides:搜索哪个包给出了该关键字;

示例:

  1. yum search git:搜寻git相关的软件有哪些

找出 git 这个软件的功能为何

  1. yum info xxx:显示安装包xxx的具体信息
  2. yum list:列出所有可安裝的软件清单
  3. yum list all:列出所有已安装和可安装的软件
  4. yum list available:...可安装
  5. yum list installed:...已安装
  6. yum list xxx:显示指定程序包xxx的安装情况
  7. yum list updates:列出所有可升级的软件
  8. yum provides passwd:找出哪个包有passwd关键字
清除缓存 yum 会把下载的软件包和header存储在cache(/var/cache/yum)中,而不会自动删除。
  1. yum clean packages:清除缓存目录下的软件包
  2. yum clean headers:清除缓存目录下的headers
  3. yum clean oldheaders:清除缓存目录下旧的headers
  4. yum clean, yum clean all:清除缓存目录下的软件包、旧的headers
    = yum clean packages; yum clean oldheaders

yum updateyum upgrade

在 CentOS 系统中,yum upgrade 与 yum update 都会将系统包更新到最新版本。(它们都对软件进行升级,也都对内核进行升级)

但二者还是略微有些差异。

参考 man yum 的帮助信息:

update If run without any packages, update will update every currently installed package.  If one or more packages or package globs are specified, Yum will only
              update  the listed packages.  While updating packages, yum will ensure that all dependencies are satisfied. (See Specifying package names for more infor‐
              mation) If the packages or globs specified match to packages which are not currently installed then update will not  install  them.  update  operates  on
              groups, files, provides and filelists just like the "install" command.
 
              If the main obsoletes configure option is true (default) or the --obsoletes flag is present yum will include package obsoletes in its calculations - this
              makes it better for distro-version changes, for example: upgrading from somelinux 8.0 to somelinux 9.
 
              Note that "update" works on installed packages first, and only if there are no matches does it look  for  available  packages.  The  difference  is  most
              noticeable  when you do "update foo-1-2" which will act exactly as "update foo" if foo-1-2 is installed. You can use the "update-to" if you'd prefer that
              nothing happen in the above case.
 
 upgrade         Is the same as the update command with the --obsoletes flag set. See update for more details.
  • --obsoletes”:定义了更新时处理软件包的取代关系(是否允许更新陈旧的RPM包);
    即,启用它会删除旧版本的package;
  • 但,在 /etc/yum.conf 文件中可以看到,默认的配置中 --obsoletes 选项为 true (开启):
    [main]
    cachedir=/var/cache/yum/$basearch/$releasever
    keepcache=0
    debuglevel=2
    logfile=/var/log/yum.log
    exactarch=1
    obsoletes=1
    gpgcheck=1
    plugins=1
    installonly_limit=5
    bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum
    distroverpkg=centos-release
    


所以,唯一的区别是:“yum update”不删除旧包,而“yum upgrade”删除旧包,在默认情况下(obsoletes=1)二者没有区别。

  • 在生产环境中最好使用“yum update”,防止因旧软件包依赖而出现问题。

示例

以安装 RabbitMQ 为例(实际 RabbitMQ 需要先安装 Erlang):

  1. 离线安装(本地 rpm 包):
    # 下载rpm包(或上传rpm包)
    wget https://www.rabbitmq.com/releases/rabbitmq-server/v3.6.10/rabbitmq-server-3.6.10-1.el7.noarch.rpm
    
    
    # 导入GPG密钥(不一定需要)
    rpm –import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc
    # 安装本地包
    rpm -Uvh rabbitmq-server-3.6.10-1.el7.noarch.rpm
    
    
    # 安装本地包
    yum install -y rabbitmq-server-3.6.15-1.el7.noarch.rpm
    
  2. 在线安装(服务器 rpm 包):
    # rpm
    rpm -Uvh https://www.rabbitmq.com/releases/rabbitmq-server/v3.6.10/rabbitmq-server-3.6.10-1.el7.noarch.rpm
    
    
    # yum
    yum install -y https://www.rabbitmq.com/releases/rabbitmq-server/v3.6.10/rabbitmq-server-3.6.10-1.el7.noarch.rpm
    


P.S.:

  • wget 默认下载到当前目录,如果要指定下载的位置,使用“-P”参数,如:wget -P /root/download 网址