Linux软件安装(9)之YUM在线升级机制

Linux软件安装(9)之YUM在线升级机制

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:

我们很早就谈到过 yum 这玩意儿,这个 yum 是通过分析 RPM 的标头资料后,根据各软件的相关性制作出属性相依时的解决方案,然后可以自动处理软件的相依属性问题,以解决软件安装或移除与升级的问题。

由于 distribution 必须要先释出软件,然后将软件放置于 yum 服务器上面,以提供客户端来要求安装与升级之用的。因此我们想要 使用 yum 的功能时,必须要先找到适合的 yum server 才行。而每个 yum server 可能都会提供许多不同的软件功能,那就是我们之前谈到的软件库啦!因此,你必须要前往 yum server 查询到相关的软件库网址后,再继续处理后续的设定事宜。

事实上 CentOS 在释出软件时已经制作出多部映像站点(mirrorsite)提供全世界的软件更新之用。所以,理论上我们不需要处理任何设定值,只要能够连上 Internet ,就可以使用 yum 啰!下面就让我们来玩玩看吧!

利用 yum 进行查询、安装、升级与移除功能

yum 的使用真是非常简单,对应的指令为 yum。那么这个指令怎么用呢?用法很简单,就让我们来简单的看看:

查询功能

如果想要利用 yum 来查询原版 distribution 所提供的软件,或已知某软件的名称,可以利用 yum 指令的如下选项及参数:

yum [option] [查询软件] [相关参数]
[option],主要的选项,包括有:
    -y:yum 要等待用户输入时,这个选项可以自动提供 yes 的响应;
    --installroot=/some/path:将该软件安装在 /some/path 下而不是用默认路径;
[查询工作项目] [相关参数]:
    search:以关键字来搜寻某个软件名称或者是描述(description);
    list:列出目前 yum 所管理的所有的软件名称与版本,有点类似 rpm -qa;
    info:同上,不过有点类似 rpm -qai 的执行结果;
    provides:查询指定文件是由哪一个软件提供,类似 rpm -qf 的功能;

【例 1】搜寻磁盘阵列(raid)相关的软件有哪些?

[root@localhost ~]# yum search raid
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
============================================ N/S matched: raid ============================================
dmraid.i686 : dmraid (Device-mapper RAID tool and library)
dmraid.x86_64 : dmraid (Device-mapper RAID tool and library)
...
mdadm.x86_64 : The mdadm program controls Linux md devices (software RAID arrays)

: 左边的是软件名称,右边的则是软件在 rpm 包内的名称。

【例 2】找出 mdadm 这个软件的详细信息。

[root@localhost ~]# yum info mdadm
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
可安装的软件包
名称    :mdadm
架构    :x86_64
版本    :4.1
发布    :1.el7
大小    :435 k
源    :base/7/x86_64
...

可看到该软件未被安装并且可被安装。

【例 3】列出 yum 服务器上面提供的所有软件名称。

[root@localhost ~]# yum list
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
已安装的软件包
GeoIP.x86_64                                1.5.0-13.el7               @anaconda
NetworkManager.x86_64                       1:1.12.0-6.el7             @anaconda
NetworkManager-libnm.x86_64                 1:1.12.0-6.el7             @anaconda
NetworkManager-team.x86_64                  1:1.12.0-6.el7             @anaconda
...

上面三列所表示的含义依次是 软件名称版本所属于哪个软件库

【例 4】列出目前服务器上可供本机进行升级的软件。

[root@localhost ~]# yum list updates
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
base                                                                                | 3.6 kB  00:00:00     
extras                                                                              | 2.9 kB  00:00:00     
updates                                                                             | 2.9 kB  00:00:00     
updates/7/x86_64/primary_db                                                         | 2.8 MB  00:00:00     
更新的软件包
GeoIP.x86_64                                         1.5.0-14.el7                                   base   
NetworkManager.x86_64                                1:1.18.0-5.el7_7.1                             updates
NetworkManager-libnm.x86_64                          1:1.18.0-5.el7_7.1                             updates
...

【例 5】找出 passwd 是由哪个软件所提供。

[root@localhost ~]# yum provides passwd
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
passwd-0.79-5.el7.x86_64 : An utility for setting or changing passwords using PAM
源    :base
...

【例 6】利用 yum 的功能,找出以 pam 为开头的软件名称有哪些?而其中尚未安装的又有哪些?

[root@localhost ~]# yum list pam*
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
已安装的软件包
pam.x86_64                                            1.1.8-22.el7                                @anaconda
可安装的软件包
pam.i686                                              1.1.8-22.el7                                base     
pam-devel.i686                                        1.1.8-22.el7                                base     
pam-devel.x86_64                                      1.1.8-22.el7                                base 
...

安装及升级功能

既然可以查询,那么安装与升级呢?很简单啦!就利用 installupdate 这两各选项来处理即可喔!

yum [option] [安装或升级的软件] [相关参数]
[option]:
    install:后面接要安装的软件;
    update:后面接要升级的软件,不指定软件时则表示更新所有软件;

【例】:安装 pam-devel

[root@localhost ~]# yum install pam-devel
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
正在解决依赖关系
--> 正在检查事务
---> 软件包 pam-devel.x86_64.0.1.1.8-22.el7 将被 安装
--> 解决依赖关系完成

依赖关系解决

===========================================================================================================
 Package                   架构                   版本                          源                    大小
===========================================================================================================
正在安装:
 pam-devel                 x86_64                 1.1.8-22.el7                  base                 184 k

事务概要
===========================================================================================================
安装  1 软件包

总下载量:184 k
安装大小:528 k
Is this ok [y/d/N]: y
Downloading packages:
pam-devel-1.1.8-22.el7.x86_64.rpm                                                   | 184 kB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  正在安装    : pam-devel-1.1.8-22.el7.x86_64                                                          1/1 
  验证中      : pam-devel-1.1.8-22.el7.x86_64                                                          1/1 

已安装:
  pam-devel.x86_64 0:1.1.8-22.el7                                                                          

完毕!

有没有很高兴啊!你不必知道软件在哪里,你不必手动下载软件,你也不必拿出原版光盘出来 mount 之后查询再安装!全部不需要,只要有了 yum 这个家伙,你的安装、升级再也不是什么难事!而且还能主动的进行软件的属性相依处理流程,如上所示,一口气帮我们处理好了所有事情!是不是很过瘾啊!而且整个动作完全免费!够酷吧!

移除功能

那能不能用 yum 移除软件呢?将刚刚的软件移除看看,会出现啥状况啊?

[root@localhost ~]# yum remove pam-devel
已加载插件:fastestmirror
正在解决依赖关系
--> 正在检查事务
---> 软件包 pam-devel.x86_64.0.1.1.8-22.el7 将被 删除
--> 解决依赖关系完成

依赖关系解决

===========================================================================================================
 Package                   架构                   版本                         源                     大小
===========================================================================================================
正在删除:
 pam-devel                 x86_64                 1.1.8-22.el7                 @base                 528 k

事务概要
===========================================================================================================
移除  1 软件包

安装大小:528 k
是否继续?[y/N]:y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  正在删除    : pam-devel-1.1.8-22.el7.x86_64                                                          1/1 
  验证中      : pam-devel-1.1.8-22.el7.x86_64                                                          1/1 

删除:
  pam-devel.x86_64 0:1.1.8-22.el7                                                                          

完毕!

连移除也这么简单!看来,似乎不需要 rpm 这个指令也能够快乐的安装所有的软件了!虽然是如此,但是 yum 毕竟是架构在 rpm
上面所发展起来的,所以,你还是得需要了解 rpm 才行!不要学了 yum 之后就将 rpm 的功能忘记了呢!切记!切记!

yum 源的配置文件

虽然 yum 是你的主机能够联机上Internet 就可以直接使用的,不过,CentOS 的映射站点可能会选错。举例来说, 我们在中国,但是 CentOS 的映射站台却选择到了台湾或者是日本去,要知道,我们联机到台湾或日本的速度是非常慢的呢?那怎么办?当然就是手动的修改一下 yum 的配置文件就好啰!
在中国,CentOS 的映像站点主要有阿里和网易,阿里和网易对于 CentOS 所提供的相关地址如下:

如果你进入到上述的网址后,就会发现里面有一堆链接,这些链接就是这个 yum 服务器所提供的软件库了!所以阿里和网易云也提供了 centosplus、cloud、extras、fasttrack、os、updates 等软件库,最好认的软件库就是 os(系统默认的软件)与 updates(软件升级版本)。由于在我的测试用主机是利用 x86_64 的版本,因此那个 os 再点进去就会得到如下的可提供安装软件的网址:

为什么在这个目录下呢?这个目录有什么特点?最重要的特点就是哪个 repodata 的目录!该目录就是分析 RPM 软件后所产生的软件依赖属性数据放置处!因此,当你要找软件库所在网址时,最重要的就是该网址底下一定要有个名为 repodata 的目录存在!其他的软件库地址,就请各位自行寻找一下哦!现在让我们修改配置文件吧!
yum 的配置文件在 /etc/yum.repos.d 目录下,这里先以 base 软件库的内容为例:

[root@localhost yum.repos.d]# cat CentOS-Base.repo 
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
...

如上所示,这里仅列出 base 这个软件库内容而已,其他的软件库内容请自行查阅哦!上面的数据各项含义如下:

  • [base]:代表软件库的名字,中括号一定要存在,里面的名称则可以随意取,但是不能有两个相同的软件库名称,否则 yum 会不晓得该到哪里去找软件库相关软件列表文件;
  • name:只是说明一下这个软件库的意义而已,不重要;
  • mirrorlist:列出这个软件库可以使用的映射站点,如果不想使用,可以注释这行;
  • baseurl:这个最重要,因为后面接的就是软件库的实际地址!mirrorlist 是由 yum 程序自行去选择镜像站
  • 点,baseurl 则是指定固定的一个软件库网址;
  • enable:值为 1 时就是让这个软件库被启动,如果不想启动可以使用 0
  • gpgcheck:还记得RPM的数字签名吗?这就是指定是否需要查阅 RPM 文件内的数字签名,1 表示需要,0 表示不需要;
  • gpgkey:就是数字签名的公钥文件所在位置,使用默认值即可;

了解这个配置文件之后,接下来让我们修改整个文件的内容,让我们这部主机可以直接使用阿里镜像站点的资源吧!这里仅以修改 CentOS-Base.repo 为例,因为默认情况下就是这个文件里面定义的几个软件库生效,修改为如下:

[base]
name=CentOS-$releasever - Base
baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

[updates]
name=CentOS-$releasever - Updates
baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

[extras]
name=CentOS-$releasever - Extras
baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

接下来当然就是给它测试一下这些软件库是否正常的运作中啊!如何测试呢?再次使用 yum 即可啊!
【例 1】列出目前 yum server 所使用的软件库有哪些?

image.png

状态这一列为启用的才是正在使用的软件库,由于有多个配置文件,所以你还会发现其它的软件库存在。
其实国内 yum 软件库源如阿里和网易已经提供它们自己的 yum 源配置文件,我们只需要将它们下载下来放到 /etc/yum.repos.d 目录即可,具体使用可参考【CentOS使用国内yum镜像源】。

修改配置文件产生的问题与解决方法

由于我们是修改系统默认的配置文件,事实上,我们应该要在 /etc/yum.repos.d/ 底下新建扩展名为 .repo 的一个文件,但因为我们使用的是指定特定的映像站台,而不是其他软件开发商提供的软件库,因此才修改系统默认配置文件。但是可能由于使用的软件库版本有新旧之分,你得要知道,yum 会先下载软件库的清单缓存到本机的 /var/cache/yum 里面去!那我们修改了网址却没有修改软件库名称(中括号内的文字),可能就会造成本机的列表与 yum 服务器的列表不同步,此时就会出现无法更新的问题了!
那怎么办啊?很简单,就清除掉本机上面的旧数据即可!需要手动处理吗?不需要的,通过 yum 的 clean 选项来处理即可!

yum clean [packages|headers|all]
    packages:将缓存的软件文件删除;
    headers:将缓存的软件文件头删除;
    all:将所有软件库数据删除;

比如要删除已下载过的所有软件库的相关数据(含软件本身与列表),执行下面命令即可:

yum clean all

yum 的软件群组功能

通过 yum 来在线安装一个软件是非常的简单,但是,如果要安装的是一个大型项目呢?举例来说,我这里使用默认安装的方式安装了测试机,这部主机就只有 GNOME 这个窗口管理程序,那我如果想要安装 KDE 呢?难道需要重新安装?当然不需要,使用 yum 的软件群组功能即可!来看看指令先:

yum [群组功能] [软件群组]
选项与参数:
     grouplist:列出所有可用的软件群组;
     groupinfo:后面跟一个软件群组名称,查看该软件群组包含的所有软件名;
     groupinstall:安装指定的软件群组;
     groupremove:移除某个软件群组;

【例 1】查阅目前软件库与本机上面的可用与安装过的软件群组有哪些。

[root@localhost ~]# yum grouplist
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
可用的环境分组:
   最小安装
   基础设施服务器
   计算节点
   文件及打印服务器
   基本网页服务器
   虚拟化主机
   带 GUI 的服务器
   GNOME 桌面
   KDE Plasma Workspaces
   开发及生成工作站
已安装的组:
   开发工具
可用组:
   传统 UNIX 兼容性
   兼容性程序库
   图形管理工具
   安全性工具
   控制台互联网工具
   智能卡支持
   科学记数法支持
   系统管理
   系统管理工具
完成

你会发现系统上面的软件大多是群组的方式一口气来提供安装的!还记全新安装 CentOS 时,不是可以选择所需要的软件吗?而那些软件不就是以 GNOME/KDE/XWindow 之类的名称存在吗?
这里由于我的系统语言设置了中文,实际安装时还需要指定其英文名称,各个组对应英文名称如下:
| 组英文名称 | 组中文名称 |
| --- | --- |
| Minimal Install | 最小安装 |
| Compute Node | 计算节点 |
| Infrastructure Server | 基础结构服务器 |
| File and Print Server | 文件和打印服务器 |
| Basic Web Server | 基本Web服务器 |
| Virtualization Host | 虚拟化主机 |
| Server with GUI | GUI服务器 |
| GNOME Desktop | 桌面桌面 |
| KDE Plasma Workspaces | KDE等离子工作区 |
| Development and Creative Workstation | 开发创意工作站 |
| Available Groups | 可用组 (表示还未安装的) |
| Compatibility Libraries | 兼容性库 |
| Console Internet Tools | 控制台Internet工具 |
| Development Tools | 开发工具 |
| Graphical Administration Tools | 图形管理工具 |
| Legacy UNIX Compatibility | 传统的Unix兼容性 |
| Scientific Support | 科学支持 |
| Security Tools | 安全工具 |
| Smart Card Support | 智能卡支持 |
| System Administration Tools | 系统管理工具 |
| System Management | 系统管理 |
比如我要查看 科学支持 这个软件组的详细信息,则可使用如下命令:

[root@localhost ~]# yum groupinfo "Scientific Support"
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile

组:科学记数法支持
 组编号:scientific
 描述:用于数学和科学计算以及平行计算的工具。
 可选的软件包:
   atlas
   fftw
   fftw-devel
   fftw-static
   gnuplot
   gsl-devel
   lapack
...

你会发现那就是一个科学运算、平行运算会用到的各种工具就是了,而下方则列出许多应该会在该群组安装时被下载与安装的软件们!让我们直接来安装看看!

[root@localhost ~]# yum groupinstall "Scientific Support"
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
警告:分组 scientific 不包含任何可安装软件包。
Maybe run: yum groups mark install (see man yum)
指定组中没有可安装或升级的软件包

正常情况下系统是会帮你安装好各项软件的。只是伤脑筋的是,刚刚好 Scientific Support 里面的软件都是可选的,而不是主要的mandatory),因此默认情况下,上面这些软件通通不会帮你安装!如果你想要安装上述的软件,可以使用 yum install atlas fftw.. 一个一个写进去安装~如果想要让 groupinstall 默认安装好所有的可选 软件呢?那就得要修改配置文件(/etc/yum.conf),更改 groupinstall 选择的软件项目即可!只需要在 /etc/yum.conf 文件尾部添加如下配置即可:

group_package_types=default, mandatory, optional

再次执行上面的安装操作你就会发现系统开始进行了一大堆软件的安装。

EPEL/ELRepo 外部软件及自定义配置文件

有时候我们需要在 Linux 安装第三方协力软件,这些软件默认是不在 CentOS 的软件库中的,怎么办?要使用之前介绍的 Tarball 来编译和安装吗?这倒不需要~因为有万能的网友提供预先编译版本了。
在 Fedora 基金会里面发展了一个外加软件计划(Extra Packages for Enterprise Linux, EPEL),这个计划主要是针对 Red Hat Enterprise Linux 的版本来开发的,刚刚好 CentOS 也是针对 RHEL 的版本来处理的嘛!所以也就能够支持该软件库的相关软件相依环境了。这个计划的主网站地址为:

而我们的 CentOS 7主要可以使用的软件仓库地址为:

除了上述的 Fedora 计划所提供的额外软件库之外,其实社群里面也有朋友针对 CentOS 与 EPEL 的不足而提供的许多软件仓库,这就要根据你自己的需求去寻找使用了。
【例】如果我想要通过上述的 CentOS7 的 EPEL 计划来安装 netcdf 以及 R 这两套软件,该如何做?
首先,你的系统应该要针对 epel 进行 yum 源的配置文件处理,在 /etc/yum.repos.d 目录下添加 epel.repo 文件,内容如下:

[epel]
name = epel packages
baseurl = https://dl.fedoraproject.org/pub/epel/7/x86_64/
gpgcheck = 0
enabled = 0

这里故意不启动这个软件仓库,只是未来有需要的时候才手动启动它,默认不适用这个软件库。

接下来使用这个软件库来安装 netcdf 与 R:

yum --enablerepo=epel install netcdf R

这样就可以安装了!但如果你没有加上 --enablerepo=epel 时,这个 EPEL 的软件并不会被安装。

使用本机的原版光盘

万一你的主机并没有网络,但是你却有很多软件安装的需求~假设你的系统也都还没有任何升级的动作过,这个时候我能不能用本机的光盘来作为主要的软件来源呢?答案当然是可以啊!那要怎么做呢?很简单,将你的光盘挂载到某个目录,我们这里假设在 /mnt 好了,然后在 /etc/yum.repos.d 目录下新建 cdrom.repo 的配置文件,内容如下:

[mycdrom]
name = mycdrom
baseurl = file:///mnt
gpgcheck = 0
enabled = 0

接下来通过如下命令进行安装:

yum --enablerepo=mycdrom install 软件名称

这个功能在你没有网络但是却需要解决很多软件相依性的状况时,相当好用啊!

管理的抉择:RPM 还是 Tarball

这一直是个有趣的问题:如果我要升级的话,或者是全新安装一个新的软件,那么该选择 RPM 还是 Tarball 来安装呢?,事实上考虑的因素很多,不过通常是这样建议的:

  1. 优先选择原厂的 RPM 功能;

由于原厂释出的软件通常具有一段时间的维护期,举例来说,RHEL 与 CentOS 每一个版本至少提供五年以上的更新期限。这对于我们的系统安全性来说,实在是非常好的选项!啥意思?既然 yum 可以自动升级,加上原厂会持续维护软件更新,那么我们的系统就能够自己保持在软件最新的状态,对于资源安全来说当然会比较好一些的!此外,由于 RPM 与 yum 具有容易安装/移除/升级等特点,且还提供查询与验证的功能,安装时更有数字签名的保护,让你的软件管理变的更轻松自在!因此,当然首选就是利用RPM来处理啦!

  1. 选择软件官网释出的 RPM 或者是提供的软件库网址;

不过,原厂并不会包山包海,因此某些特殊软件你的原版厂商并不会提供的!举例来说 CentOS 就没有提供 NTFS 的相关模块。此时你可以自行到官网去查阅,看看有没有提供相对到你的系统的 RPM 文件,如果有提供软件库网址,那就更好啦!可以修改 yum 配置文件来加入该软件库,就能够自动安装与升级该软件!你说方不方便啊!

  1. 利用 Tarball 安装特殊软件;

某些特殊用途的软件并不会特别帮你制作 RPM 文件的,此时建议你也不要妄想自行制作 SRPM 来转成 RPM 啦!因为你只有区区一部主机而已,若是你要管理相同的 100 部主机,那么将原始码转制作成 RPM 就有价值。单机版的特殊软件,例如学术网络常会用到的 MPICHPVM 等平行运算函式库,这种软件建议使用 tarball 来安装即可,不需要特别去搜寻RPM。

  1. 用 Tarball 测试新版软件;

某些时刻你可能需要使用到新版的某个软件,但是原版厂商仅提供旧版软件,举例来说,我们的 CentOS 主要是定位于企业版,因此很多软件的要求是稳而不是新,但你就是需要新软件啊!然后又担心新软件装好后产生问题,回不到旧软件,那就惨了!此时你可以用 tarball 安装新软件到 /usr/local 底下,那么该软件就能够同时安装两个版本在系统上面了!而且大多数软件安装数种版本时还不会互相干扰的!嘿嘿!用来作为测试新软件是很不错的呦~只是你就得要知道你使用的指令是新版软件还是旧版软件了。

所以说,RPM 与 Tarball 各有其优缺点,不过,如果有 RPM 的话,那么优先权还是在于 RPM 安装上面,毕竞管理上比较便利,但是如果软件的架构差异性太大,或者是无法解决相依属性的问题,那么与其花大把的时间与精力在解决属性相依的问题上,还不如直接以 tarball 来安装,轻松又惬意!

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.zze.xyz/archives/linux-software-install9.html

Buy me a cup of coffee ☕.