YUM

YUM

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

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

介绍

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

YUM 通过依赖 rpm 软件包管理器,实现了 rpm 软件包管理器在功能上的扩展,因此 YUM 是不能脱离 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

解释一下选项:

注意:

语法:

yum clean [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/

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,然后创建挂载目录,并挂载

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

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

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

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

文件内容为

[local] 
name=local
baseurl=file:///mnt/cdrom 
enabled=1 
gpgcheck=0

执行 yum clean all,清除缓存

执行 yum makecache,生成缓存

即可。

yum 操作

查询

查询相关的命令:

操作:

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 这个文件的软件有哪些,可以使用通配符,带上会很方便

……

安装和升级

相关的命令:

参数

注意

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>:仅更新指定的软件命令

卸载

相关命令:

参数

最好还是别带 -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 工具自带两个参数

简单实践

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

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

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

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 博客