YUM

警告
本文最后更新于 2023-12-07,文中内容可能已过时。

YUM

Linux 平台中软件的安装都由源码文件编译成二进制文件后再运行,其中很多的制作好的 rpm 程序包,制作方在制作的过程中把通常不常用的功能去除进行编译打包,或者再将不同功能的包进行单独编译打包,提供多个功能程序包,这个情况安装软件时,一个功能包或者程序会依赖于其他程序的库文件,甚至有的时候会出现死循环依赖,导致软件的安装不正常工作或者根本安装不成功。此 yum 工具就是为了有效解决程序之间的依赖关系。

YUM 有点像应用市场。yum,全称“Yellow dog Updater, Modified”,是一个专门为了解决包的依赖关系而存在的软件包管理器。就好像 Windows 系统上可以通过 360 软件管家实现软件的一键安装、升级和卸载,Linux 系统也提供有这样的工具,就是 yum。

介绍

YUM 的存在很好的解决了 RPM 的属性依赖问题,安装 rpm 包之前不用担心本地依赖不全了。这是 yum 最牛逼的一点

YUM 通过依赖 rpm 软件包管理器,实现了 rpm 软件包管理器在功能上的扩展,因此 YUM 是不能脱离 rpm 而独立运行的。

特点:

  • 可以同时配置多个资源库 (Repository,也叫 yum 源),就是下载 rpm 包的地方,类似于 Maven 的远程仓库

  • 简洁的配置文件 (/etc/yum.conf)

  • 自动解决增加或删除 rpm 包时遇到的依赖性问题

  • 使用方便

  • 保持与 RPM 数据库的一致性

跟 rpm 一样,包名为第一个横杠前面那个,如果发现多个,那就用最后的点前面那一段

原理:

YUM 可以看作是 CS 架构的软件

Server 端即yum 源,先对程序包进行分类后存储到不同的容器中(容器其实就是一个文件夹,至于不同的 rpm 包怎么放到不同的容器中,这个分配机制还不清楚 TODO); 再通过收集到大量的 rpm 包的数据库文件中程序包之间的依赖关系数据,生成对应的依赖关系和所需文件在本地的存放位置的说明文件(.xml格式), 存放在 server 端容器中的 repodata 目录下供 Client 端取用。

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

也就是说,得查两次,原理图:

yum 源以 centos 的镜像网站:Index of /Linux/CentOS/7 为例

其中有包括 centosplus、extras、fasttrack、os、updates 等目录,这些目录就是这个 yum 源所提供的容器了,最好认的就是 os(系统默认的软件)与 updates(软件升级版本)。其他文件夹也是其字面意思吗?TODO

在每一个容器下面,都有一个 repodata 目录,该目录是分析 RPM 软件后所产生的软件依赖数据放置处。因此,当你找到容器所在网址时,最重要的就是该网址下面一定要有一个名为“repodata”的目录存在。比如:Index of /Linux/CentOS/7/centosplus/x86_64

Packages 下就是各种 rpm 包:

……

repodata 目录下都是这样的文件:

使用 yum 安装软件包之前,需指定好 yum 下载 RPM 包的位置,也就是 yum 源。换句话说,yum 源指的就是软件安装包的来源。

使用 yum 安装软件时至少需要一个 yum 源。yum 源既可以使用网络 yum 源,也可以将本地光盘(比如 Centos 的 ISO 文件)作为 yum 源。因为 Centos 的 ISO 里面的 Packages 文件夹下有大量的 rpm 包。

操作起来也很简单:挂载目录,创建新的 yum 源,设置 yum 源的 baseurl 和 enable,参考博客:Linux yum 是什么,yum 源配置(网络 yum 源和本地 yum 源)

不过现在一般都是用网络 yum 源。

yum 源配置文件

先查询一下目录 yum 源所使用的容器有哪些。

yum repolist all

只有当最右边的 status 为 enabled 该容器才算激活,最右侧的数字,是这个容器下的包的数量 TODO

/etc/yum.repos.d/里面会有多个配置文件(文件名以.repo结尾),这些文件都是 yum 源配置文件,yum 会从里面逐个查找,所以里面的容器名称不能有重复。

打开其中的一个 yum 源文件,vim CentOS-Base.repo

解释一下选项:

  • [base]:代表容器的名字。中括号一定要存在,里面的名称可以随意起,但不能有两个相同的容器名称,否则 yum 会不知道去哪里找容器相关软件列表文件。

  • name:只是说明一下这个容器的意义而已,重要性不高。

  • mirrorlist:列出这个容器可以使用的镜像站点,如果不想使用可以批注掉这一行。TODO

  • baseurl:这个最重要,因为后面接的就是容器的实际网址。mirrorlist 是由 yum 程序自行去找镜像站点,baseurl 指定固定的一个容器网址。默认是 CentOS 官方的 yum 源服务器,注意,这个地址是可以使用的,如果你觉得慢,你可以换成你喜欢的镜像地址,查看后文

  • enable=1:启动这个容器,默认值也为 1。关闭这个容器可以设置enable=0

    yum repolist all命令的结果中我们只看到了三个启用的容器,对应上了CentOS-Base.repo文件中前三个容器,看了下此目录其他 repo 文件,enable 选项都是 0

  • gpgcheck=1:指定是否需要查阅 RPM 文件内的数字证书。

  • gpgkey:数字证书的公钥文件所在位置,使用默认值即可。

注意:

  • yum 会自动识别/etc/yum.repos.d/目录以.repo结尾的文件。

  • 当我们修改了配置文件的网址却没有修改容器名称,可以会造成本机的列表与 yum 服务器的列表不同步,这时就需要手动来清除容器的数据了:

语法:

1
yum clean [packages|headers|all]

参数:

  • packages:将已下载的软件文件删除

  • headers:将下载的软件文件头删除

  • all:将所有容器数据都删除

例:删除已下载过的所有容器相关数据(含软件本身与列表):yum clean all

yum clean all:清除缓存

yum makecache:生成缓存

配置 yum 源

阿里 yum 源

参考 https://developer.aliyun.com/mirror/centos?spm=a2c6h.13651102.0.0.3e221b11uNBZfM

注意:老的源地址,http://mirrors.aliyun.com/repo/Centos-7.repo,或者,http://mirrors.aliyun.com/repo/Centos-8.repo已经作废,不要再使用

阿里的开发者社区提供的各种镜像的地址:阿里巴巴开源镜像站-OPSX 镜像站 - 阿里云开发者社区

注意,源可能会作废,需要经常去看看。

下载新的 CentOS-Base.repo/etc/yum.repos.d/

1
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo

执行yum clean all,清除缓存

执行yum makecache,生成缓存

即可。

本地 yum 源

在离线环境中,要在服务器上安装软件,只能在有限环境下下载对应的 RPM 包,然后再手动把 RPM 包拷贝到离线环境中,再安装,这个很麻烦,有一种方案是,我们把需要的 RPM 给打包成 ISO,然后直接挂载在服务器上,然后将这个 ISO 的挂载目录的当成是一个本地的 YUM 源,这样就不用每次都从外面拷贝了,而完整的操作系统的 ISO 文件,就是一个自带了很多软件包的 YUM 源。

首先,上传 ISO 文件到指定目录,比如/opt/iso,然后创建挂载目录,并挂载

1
2
mkdir /mnt/cdrom 
mount -t iso9660 /mntCentOS-7-x86_64-DVD-2009.isoo /mnt/cdrom

注意,这里是临时挂载,系统关机就会取消挂载,如果需要永久挂载的话,则需要修改/etc/fstab文件,请参考《挂载分区的经典案例》的设置可以永久挂载或者叫自动挂载

然后配置本地 YUM 源,切换到/etc/yum.repo.d/下并创建本地源文件local.rep

1
2
cd /etc/yum.repo.d/ 
vim local.repo

文件内容为

1
2
3
4
5
[local] 
name=local
baseurl=file:///mnt/cdrom 
enabled=1 
gpgcheck=0

执行yum clean all,清除缓存

执行yum makecache,生成缓存

即可。

yum 操作

查询

查询相关的命令:

  • list:列出目前 yum 所管理的所有的软件名称与版本,有点类似于rpm -qa

  • search:搜索某个软件名称或者是描述的重要关键字;

  • info:同上,不过有点类似于rpm -qai

  • provides:从文件去搜索软件!类似于rpm -qf

操作:

yum list:列出 yum 服务器上所提供的所有软件名称,列出的软件的个数yum list | wc -l约等于所有容器的包的数量

yum list updates:列出目前服务器上可供本机进行升级的软件有哪些

……

注意,可以使用通配符,将列出所有匹配上的软件,

例如yum list java*

例如yum list vim*

显示了本机已经安装的软件和可以下载的软件,很方便

yum search vim:查询与vim相关的软件有哪些,不支持使用通配符

扩大匹配范围:yum search all vim

yum info java*:查询 java 这个软件的功能,支持通配符,会将所有匹配上的软件的信息都显示出来,通常我们不记得软件的全名,用通配符就很方便

……

yum provides jdbc*:列出提供 jdbc 这个文件的软件有哪些,可以使用通配符,带上会很方便

……

安装和升级

相关的命令:

  • install:后面接要安装的软件。

  • update:后面接要升级的软件。若要整个系统都升级,就直接 update 即可。

参数

  • -y:当遇到需要等待用户输入时,这个选项会提供 yes 的响应

注意

yum -y update:升级所有包同时也升级软件和系统内核;

yum -y upgrade:只升级所有包,不升级软件和系统内核

实践一下下载 chrome

yum search  chrome

复制软件名称,看一下软件信息

yum info chrome-gnome-shell

下载安装,注意,安装软件需要 root 权限

yum install -y chrome-gnome-shell

系统会先解决此软件的依赖关系,然后再下载安装。


其他操作:

yum check-update:列出所有可更新的软件清单命令

yum update:更新所有软件命令

yum install <package_name>:仅安装指定的软件命令

yum update <package_name>:仅更新指定的软件命令

卸载

相关命令:

  • remove

参数

  • -y:当遇到需要等待用户输入时,这个选项会提供 yes 的响应

最好还是别带-y参数了,要是操作失误了,还有取消的机会,注意,卸载软件需要 root 权限

yum remove chrome-gnome-shell

软件组管理

还记得全新安装 CentOS 时,不是可以选择所需的软件么?而那些软件不是都有GNOME/KDE/X Window之类的名称存在吗?其实这就是软件组。软件级的存在,对于大量的一系列软件安装是非常有用的一个功能。

其实就是将一些软件放到一个列表里归个类,然后给个名字,就叫软件组,这里不仔细研究了,TODO。

准备离线安装

有时候你需要一个软件包在离线 linux 系统上安装,如果自己找软件包麻烦,可以在 linux 系统下通过 yum 下载需要的软件包,准备工作是找一台能够联网的 linux,并准备好了 yum 及 yum 源,一般我们用我们的 vmware linux 虚拟机就可以了。

参考:yum 获取 rpm 软件包的三种方法_如何提取 yum 安装 keepalived 的 rpm 软件包-CSDN 博客

一般 yum 工具自带两个参数

  • --downloadonly:不更新,只下载

  • --downloaddir=DLDIR:指定 rpm 包的下载目录

简单实践

1
yum install --downloadonly --downloaddir=/root screen

注意:这种方式会下载你需要软件包安装时所需要的依赖包,这个是不是很棒。

然后我们就可以拿着 rpm 包进行离线安装了

1
rpm -ivh *.rpm

有的时候,yum install会根据你本地环境下载需要的包,有的时候,你本地的环境有一个依赖包,yum install --downloadonly就不会下载这个包,但是目标环境没有这个依赖包,所以当你把 rpm 拿到目标环境安装的时候就会提示你缺少依赖包,此时,你可以在你本地把这个包删除rpm -e,然后再yum install --downloadonly,这样就会下载了。

rpm 下载网站:Search the RPM repository on rpmfind.net

从已经安装的 rpm 文件中再重新构建一个 rpm

参考博客:how-to-build-an-rpm-package-from-the-installed-files

最终的方案还是选择第三方工具:rpmrebuild

这个应用无法在 yum 中下载,只能通过下载 rpm 包下载同时,这个软件依赖rpm-build,如果本地没有,可直接沟通过 yum 直接下载:yum install rpm-build

手动构建 RPM 包

有两种方式,

第一种方式,是比较常规的方式,即,通过rpmbuild命令,这个命令来自rpm-build包,这是 centos 系统官方提供的标准的打 rpm 包的方式,其核心是编写 spec 文件将源码编译成 rpm 包,有点小复杂,适合 Linux 平台开发源码然后发布成 rpm 包的场景。

参考博客:

如何打一个 RPM 包 - 亚楠老猎人 - 博客园

RPM 包的构建 - SPEC 基础知识 - Michael 翔 - 博客园

Linux 操作系统使用 RPMBUILD 命令打包 RPM 的详细步骤 - 张兴龙 - 博客园

error: Empty %files file /xxxx/rpmbuild/BUILD/xxxx/debugsourcefiles.list-CSDN博客

第二种方式,是通过第三方工具fpmfpm的目的就是方便用户快速构建 rpms, debs, OSX packages 等包,在将已经存在的,保存在文件夹中的,或者其他风格的打包结果的内容重新以指定格式打包成一个新的包的场景下非常好用,而且还可以指定安装打出的包的时候的脚本操作,非常方便。

参考教程:

GitHub - jordansissel/fpm: Effing package management! Build packages for multiple platforms (deb, rpm, etc) with great ease and sanity.

Linux 下开源打包工具 fpm 的安装与使用(超详细)_fpm 打包-CSDN 博客


0%