我们在之前的章节中讲到了 Linux 的程序包管理的基础与实现, 后面也讲述了 RPM 包的管理命令实现了管理包的功能, 主要用的是 rpm 命令, 那么 rpm 实现程序管理总结如下:
rpm 命令实现程序管理:
安装:-ivh, --nodeps, --replacepkgs
卸载:-e, --nodeps, --replacepkgs
升级:-Uvh, -Fvh, --nodeps, --oldpackage
查询:-q, -qa, -qf, -qi, -qd, -qc, -q, --scripts, -q --chagelog, -q --pvevides, -q --requires
校验:-V
导入 GPG 密钥:--import, -K, --nodigest, --nosignature
数据库重建:--initdb, --rebuiliddb
那么在接下来的章节中, 我们继续来将 Linux 程序包管理
在上一章中我们讲述过, 使用 rpm 包管理程序会有一些问题, 比如说安装包之间存在这依赖关系, 一旦安装时, 如果很复杂的话, 安装时需要很长时间才能完成, 因为我们必须要想办法手动解决依赖关系, 当然, 我们可以使用 --nodeps 来忽略安装包之间的依赖关系, 其导致的结果就是, 安装时没有问题, 但使用时会就有些问题, 所以说为了能够保证正常使用的前提下, 就必须要解决依赖关系而手动解决通常是一件很麻烦的事情, 那么我们就要采用高于. deb 或高于. rpm 包的底层管理工具, 它能实现前端自动解决依赖关系, 完成正常的安装, 解决用户的后顾之忧, 在这种场景下完成对应的 CentOS 系统当中有两个前端安装工具, 一种为 yum, 另一种是新版的 dnf
由于 CentOS 还没有官方支持的 dnf 工具, 该工具在 Fedora22 + 当中才刚开始引入, 不过在 CentOS 7 中使用 dnf 也并非不可能, yum 是一款 C/S 架构的程序包管理工具, 在本地客户端可达的网络服务器, 首先该服务器是一个文件服务器, 要提供文件存储并提供文件服务等功能, 提供了很大的存储空间去放置我们所能使用的各种 rpm 包, 而后整个目录通过文件共享的服务功能输出到外部主机能够进行访问, 而后任何一个 Linux 主机, 本身支持 rpm 包的基本功能, 同时在这个基础之上又能使用 yum 工具, 而 yum 的工作原理是当用户安装某个程序包时, 使用 yum 命令接收到由用户所安装到的包请求之后, 该命令就会尝试根据本地的配置文件提供的服务器路径访问地址 URL, 那么 yum 接收到所谓的安装包程序之后, 尝试着通过本地的配置文件指令的 URL 去找远程网络服务器主机
1.1 yum 工作原理
为了避免将网络远程服务器所提供的所有安装包下载到本地, 远程服务器和 yum 它们彼此之间互相工作的模式为: 这个服务器要提供一个叫做程序包的仓库(repository), 对于这个仓库要有元数据信息或者要有描述性的数据信息, 这个信息文件存放这文件包的名字版本以及包与包之间的依赖关系等, 都存放在该文件中, 所以当这个 yum 客户端试图通过远程网络服务器去获取某个安装包时, yum 客户端首先请求将元数据信息文件发送过来, 下载至本地之后放置在本地的一个缓存区域中, yum 客户端就开始分析本地元数据当中有没有用户去请求的安装包名, 如果有, 读取这个包, 尝试着分析该包的依赖关系, 而分析依赖关系也根据这个元数据文件, 因为这个元数据文件定义在网络上的服务仓库所有的安装包, 以及程序包之间的依赖关系, 所以 yum 客户端在本地通过该文件分析完成之后, 而后又查询本地所被依赖的安装包, 分析完成之后剩余未安装的包列举出来, 最后扮演文件服务器去在该网络主机中下载程序包, 下载完成之后先缓存在本地, 之后开始执行类似于 rpm 的安装操作而安装时首先会安装被依赖的安装包, 安装完成之后则返回客户端提示安装成功, 之后将缓存下来的安装包删除, 以节约空间但元数据文件不会删除, 等到下次安装时, 可直接读取该元数据文件
yum 客户端每一次都会去请求网络主机上的元数据, 以检测数据包等信息是否发生改变, 当然频繁请求也会占用带宽, 所以元数据可能不止一个, 有的存放包名, 有的存放版本等, 除此之外, 还有特殊文件, 这个特殊文件记录了每一个元数据文件的校验码, 所以在请求时, 先请求的是校验码, 缓存在本地进行对比, 如果校验码一样, 本地缓存有效, 否则请求元数据
对于应用场景来讲, yum 首先是客户端, 也是一个自我独立的管理组件, 这个组件需要请求远程网络服务主机上的仓库, 从仓库中下载元数据文件, 在本地能够完成 yum 的查询等操作, 当进行安装时, yum 需要请求网络服务器去下载该程序包文件进行安装, 这并不是传统的 C/S, 而是访问机制为 C/S 架构
为了能够进行快速访问, 全球有许多的镜像站, 我们可以找一个能够快速访问并且受信任的镜像站访问就可以了该配置文件能够指向一大推镜像服务器, 我们称之为镜像列表, 从镜像列表当中挑选出符合一个, 我们就能够进行访问
1.2 yum 缺点
yum 在设计上是有很大缺陷的, 其缺点为: 比如虽然能够解决依赖关系, 但在某个安装过程中如果半途中止时, 下一次重启安装时将无法解决, 因此 dnf 主要就是应该解决这个问题的但使用 dnf 时和 yum 是没有什么区别
1.3 yum 与 rpm
因此对于我们来讲, 首先对于本地 Linux 上要有 yum 客户端及工具还有 yum 命令, 第二步 yum 本身需要通过配置文件去找到该网络主机或者本地主机的远程仓库, 所以这个配置文件作为管理员需要指定, 那么第三步就是如果互联网带宽足够大的话, 可以使用互联网上某个机构提供的仓库, 尤其是镜像站点中的仓库, 毕竟有许多较为新版的安装包或许可以将远程服务器的镜像到本地
但其实 yum 并不是 rpm 命令的取代者, 它只是 rpm 的前端管理工具, 意味着 yum 需要依赖 rpm 的存在, 如果仅有 yum 是不可以的
如果在本地创建 yum 仓库的话, 我们甚至还得需要配置一台服务器主机, 一般来说 yum 支持的文件服务器共有两种, 一种是 ftp, 另一种是 http, 无论是哪一种, 都得需要通过 URL 来进行输出, 把程序包复制在存储空间之后, 还得需要创建一个元数据文件, 这个元数据我们可以使用命令来创建完成, 对于元数据文件并不是凭空而来, 而是分析每一个程序包自带的 rpm 数据抽取出来给罗列堆积在文件中实现的而创建元数据文件的命令为: createrepo
不过该命令可能创建高级仓库比较难, 因为高级仓库有可能要对程序包进行分组, 在安装时我们可以对这个一个组的程序包进行安装, 而且创建该组时使用. xml 格式的意味着我们必须精通 xml 的语法才可能编写, 好在我们必须选择
1.4 yum 的由来
其实 yum 是由 yellow dog 所研发的, 那么 yum 的全称为
Yellow Update Modifiter
,yum 要依赖于它的 yum 仓库, 全称为 yum repository, 简称为 yum repo, 那么我们将 yum 的特性总结如下:
- CentOS: yum, dnf
- URL: http://mirrors.aliyun.com
- YUM: Yellow Dog, Yellow Update Modifter
- yum repository: yum repo
存储了众多 rpm 包, 以及包相关的元数据文件(放置于特定的目录下: repodata);
需要注意一点的是: repodata 所在的路径, 就是仓库所指向的路径
一个仓库在访问时有多种路径, 一般都是由文件服务器来提供的, 我们在文件服务器上通过某种协议来对用户进行访问
文件服务器:
- ftp://
- http://
- nfs://
- file:///
1.5 yum 客户端
yum 本身就是一个独立程序包来可以进行安装, 也有自己的配置文件, 共有两段组成, 其配置文件路径在:
yum 客户端:
配置文件:
/etc/yum.conf: 为所有仓库提供公共配置;
/etc/yum.repos.d/*.repo: 为仓库的指向提供配置;
对于用户来说, 我们在 / etc/yum.repos.d / 目录下去配置 yum 源仓库配置文件, 名称必须得是. repo, 那么我们接下来看一下 yum 是如何使用仓库的
yum 仓库的配置格式为, 每一个中括号都代表着仓库的 ID, 且具有唯一性, 之后我们指明它的名字和 URL 等信息用来配置进行定义需要注意的是, 等号 = 左右是不能有分隔符的, 否则就会有语法错误
仓库指向的定义:
- [repositoryID]
- name=Some name for this repository
- baseurl=url://path/to/directory/
- enabled={1|0}
- gpgcheck={1|0}
- gpgkey=URL
- enablegroups={1|0}
- failovermethod={roundrobin|priority}
默认为: roundroin, 意为随机挑选;
cost=
默认为 1000;
具有了这些概念之后, 我们就可以开始配置 yum 指向, 而后开始使用仓库, 以及使用 yum 命令了
二 yum 命令的用法
2.1 安装包管理的相关命令
yum 有许多的子命令, 其命令用法格式为:
yum [options] [command] [package ...]
yum 刚才讲到过有许许多多的子命令, 每一个子命令都用于实现不同的管理功能, 在 man 手册中记录了许多的子功能, 我们总结出来并查看
- command is one of:
- * install package1 [package2] [...]
- * update [package1] [package2] [...]
- * update-to [package1] [package2] [...]
- * update-minimal [package1] [package2] [...]
- * check-update
- * upgrade [package1] [package2] [...]
- * upgrade [package1] [package2] [...]
- * upgrade-to [package1] [package2] [...]
- * distribution-synchronization [package1] [package2] [...]
- * remove | erase package1 [package2] [...]
- * autoremove [package1] [...]
- * list [...]
- * info [...]
- * provides | whatprovides feature1 [feature2] [...]
- * provides | whatprovides feature1 [feature2] [...]
- * clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
- * makecache [fast]
- * groups [...]
- * search string1 [string2] [...]
- * shell [filename]
- * resolvedep dep1 [dep2] [...]
- (maintained for legacy reasons only - use repoquery or yum provides)
- * localinstall rpmfile1 [rpmfile2] [...]
- (maintained for legacy reasons only - use install)
- * localupdate rpmfile1 [rpmfile2] [...]
- (maintained for legacy reasons only - use update)
- * reinstall package1 [package2] [...]
- * downgrade package1 [package2] [...]
- * deplist package1 [package2] [...]
- * repolist [all|enabled|disabled]
- * repoinfo [all|enabled|disabled]
- * repository-packages <enabled-repoid> <install|remove|remove-or-reinstall|remove-or-distribution-synchronization> [package2] [...]
- * version [ all | installed | available | group-* | nogroups* | grouplist | groupinfo ]
- * history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
- * load-transaction [txfile]
- * updateinfo [summary | list | info | remove-pkgs-ts | exclude-updates | exclude-all | check-running-kernel]
- * fssnapshot [summary | list | have-space | create | delete]
- * fs [filters | refilter | refilter-cleanup | du]
- * check
- * help [command]
以上可以看的出来子命令很多, 我们例举一些常用的子命令来总结一下该命令的用法, 其总结如下:
那么第一个就是显示如何显示仓库列表, 该子命令为 repolist, 可以显示所有启用和禁用的, 默认显示启用的
显示仓库列表:
repolist [all|enabled|disabled]
第二个简述的是如何显示程序包我们使用 list 子命令, 不仅可以显示所有, 还可以使用 glob 通配机制
显示程序包:
- list
- # yum list [all | glob_exp1] [glob_exp2] [...]
- # yum list {available|installed|updates} {glob_exp1} {...}
我们学会如何列出并显示程序包之后, 可以安装程序包, 当有多个版本时, 可以指明版本安装, 默认安装最新版, 该子命令为 install
安装程序包:
- install package1 [package2] [...]
- reinstall package1 [package2] [...]
接下来说的是升级某个程序包, 该子命令为 update
升级程序包:
- update [package1] [package2] [...]
- downgrade package1 [package2] [...] (降级)
那么还有一个叫做 ckeck-update, 该子命令为检查有哪些升级包可用
检查可用升级:
ckeck-update
如果在系统里面卸载一个程序包时, 需要注意的是, 卸载时, 如果依赖于该程序包的程序也会被卸载, 那么卸载使用 remove 子命令
卸载程序包:
remove | erase package1 [package2] [...]
我们如果想查看某一个程序包的简要信息, 显示类型和 rpm -qi 命令基本相同, 比如大小日期修改时间等, 我们可以用 info 子命令
查看程序包的 information:
info [...]
还有就是可以查看某个特性或查看某个命令是由那个安装包提供的, 该子命令为 provides, 相当于 rpm -qf
查看指定的特性 (可以是某文件) 是由那个程序包所提供:
provides | whatprovides feature1 [feature2] [...]
clean 子命令是清理缓存的子命令, 如果不想删除元数据文件就要使用该子命令, 还可以指定清理那种, 或者清理所有
clean [ packages | metdata | expire-cache | rpmdb | plugins | all ]
除了清理缓存, 我们还可以构建缓存, 该子命令为 makecache, 此操作可以不用做, 因为在安装时就会自动构建缓存
构建缓存:
makecache
根据关键字可以搜索相关的信息, 可以用 search 子命令, 后面跟上关键字即可
搜索:
search string1 string2 [...]
以指定的关键字搜索程序包及 summary 信息;
我们还可以查看指定所依赖的程序包提供的功能
查看指定包所依赖的 capabilites:
deplist package1 [package2] [...]
如果想查看过去安装或卸载过那种程序包, 或者叫做在过去产生了某个事务, 那么事务指的就是改变或者操作了某个具体的程序, 比如说, 在某一时刻成功安装或卸载了某个程序包
查看 yum 事务历史:
history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
接下来说的是 localinstall 和 localupdate 这两个子命令, 如果在 yum 仓库中没有某个程序包时, 我们从互联网上下载某个安装包的话, 使用 rpm -ivh 来进行安装, 但是所带来的问题是如果该程序包所依赖于其它的程序包时, 或者说那些被依赖的安装包在仓库中, 这时候 localinstall 子命令就表示使用 yum localinstall 来安装该 rpm 包时, 将该程序包中的被依赖的程序包在仓库中提取并安装进行解决到 CentOS 6 和 CentOS 7, 我们可以直接使用 install 子命令来进行安装本地的 rpm 包, 也建议这样操作
安装及升级本地程序包:
- localinstall rpmfile1 [rpmfile2] [...]
- (maintained for legacy reason only - use install)
- localupdate rpmfile1 [rpmfile2] [...]
- (maintained for legacy reason only - use update)
2.2 包组管理的相关命令
包组管理的相关命令有如下:
包组管理的相关命令:
- groupinstall group1 [group2] [...]
- geoupupdate group1 [group2] [...]
- grouplist [hidden] [groupwildcard] [...]
- groupremove group1 [group2] [...]
- groupinfo group1 [...]
我们如果想安装某个包组的, 可使用子命令 groupinstall 跟上某个包组就可以, 如果包组名有空格的话, 我们使用双引号来引起该包组名称
2.3 在 CentOS 7 中如何使用本地 yum 源
每一个光盘介质就是程序包的集合, 无论是在 CentOS 567 中, 都有相应的 repodata 文件, 所以可以直接将光盘当作本地 yum 源来使用, 使用 file 加上路径就可以了, 介质可以不用复制到本地某个目录当中, 首先将光驱打开, 将光盘放置在服务器中, 然后进行挂载, 挂载路径在 / media/cdrom 中, 如果没有该目录则先创建
- # mkdir -r /media/cdrom
- # mount -r /dev/sr0 /media/cdrom
之后我们进入 / etc/yum.reops.d / 目录下, 在该目录下有个 CentOS-Media.repo 文件, 我们使用 vim 来进行编辑该文件, 修改格式如下:
- # cd /etc/yum.repos.d/
- # vim CentOS-Media.repo
- [c7-media]
- name=CentOS-$releasever - Media
- baseurl=file:///media/cdrom/
- gpgcheck=1
- enabled=1
- gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
以上修改完成之后, 保存并退出, 之后我们使用 yum repolist 命令查看一下, 显示出软件包的数量出来则即为成功
- # yum repolist
- Loaded plugins: fastestmirror, langpacks
- c7-media | 3.6 kB 00:00:00
- (1/2): c7-media/group_gz | 156 kB 00:00:00
- (2/2): c7-media/primary_db | 5.7 MB 00:00:00
- Loading mirror speeds from cached hostfile
- repo id repo name status
- c7-media CentOS-7 - Media 9,591
- repolist: 9,591
最后我们总结一下如何使用本地 yum 源
如何使用光盘并挂载 yum 仓库:
(1) 挂载光盘至某目录, 例如:/media/cdrom
# mount -r /dev/sr0 /media/cdrom
(2) 创建配置文件
- [CentOS 7]
- name=
- baseurl=
- gpgcheck=
- enabled=
2018-3-14Linux 系统管理(12) Linux 程序包管理(2)yum 前端管理工具
来源: http://www.bubuko.com/infodetail-2530583.html