第22章 软件安装RPM,SRPM与YUM

发布时间 2023-07-31 10:58:53作者: Evan-whc

第22章 软件安装RPM,SRPM与YUM

22.1 软件管理员简介

22.1.1 Linux界的两大主流:RPM与DPKG

  目前新的Linux开发商都有提供这样的“在线升级”机制,透过这个机制,原版光盘就只有第一次安装时需要用到而已,其他时候只要有网络,你就能够取得原本开发商所提供的任何软件了呢!在dpkg管理机制上就开发出APT的在线升级机制,RPM则依开发商的不同,有RedHat系统的yum,SuSE系统的Yast Online Update(YOU)等。

什么是RPM与SRPM

  RPM的全名是【RedHat Package Manager】简称为RPM啦!顾名思义,当初这个软件管理的机制是由RedHat这家公司发展出来的。RPM是以一种数据库记录的方式来将你所需要的软件安装到你的Linux系统的一套管理机制。
  他最大的特点就是将你要安装的软件先编译过,并且打包成为RPM机制的包装文件,透过包装好的软件里头默认的数据库记录,记录这个软件要安装的时候必须具备的相依属性软件,当安装在你的Linux主机时,RPM会先依照软件里头的数据查询Linux主机的相依属性是否满足,若满足则予以安装,若不满足则不予安装。那么安装的时候就将该软件的信息整个写入RPM的数据库中,以便未来的查询、验证与反安装!
  SRPM是什么呢?顾名思义,他是Source RPM的意思,也就是这个RPM文件里面含有原始码哩!特别注意的是,这个SRPM所提供的软件内容“并没有经过编译”,它提供的是原始码喔!
  通常SRPM的扩展名是以***.src.rpm这种格式来命名的。不过,既然SRPM提供的是原始码,那么为什么我们不使用Tarball直接来安装就好了?这是因为SRPM虽然内容是原始码,但是他仍然含有该软件所需要的相依性软件说明,以及所有RPM文件所提供的数据。同时,他与RPM不同的是,他也提供了参数配置文件(就是configure与makefile)。所以,如果我们下载的是SRPM,那么要安装该软件时,你就必须要:

  • 先将该软件以RPM管理的方式编译,此时SRPM会被编译成为RPM文件
  • 然后将编译完成的RPM文件安装到Linux系统当中

  SRPM既然是原始码的格式,自然我们就可以透过修改SRPM内的参数配置文件,然后重新编译产生能适合我们Linux环境的RPM文件,如此一来,不就可以将该软件安装到我们的系统当中,而不必与原作者打包的Linux环境相同了?这就是SRPM的用处了。

22.1.5 RPM属性相依的克服方式:YUM在线升级

  CentOS(1)先将释出的软件放置到YUM服务器内,然后(2)分析这些软件的相依属性问题,将软件内的记录信息写下来(header)。然后再将这些信息分析后记录成软件相关性的列表。这些列表数据与软件所在的本机或网络位置可以称呼为容器或软件仓库或软件库(repository)。当客户端有软件安装的需求时,客户端主机会主动的向网络上面的yum服务器的软件库网址下载清单列表,然后透过列表的数据与本机RPM数据库已存在的软件数据相比较,就能够一口气安装所有的具有相依属性的软件了。

22.2 软件管理程序:rpm

  RPM的使用其实不难,只要使用rpm这个指令即可!

22.2.1 RPM默认安装的路径

  RPM软件安装完毕后,该软件相关的信息就会写入/var/lib/rpm/目录下的数据库文件中了。上面这个目录内的数据很重要哦!因为未来如果我们有任何软件升级的需求,版本之间的比较就是来自于这个数据库,而如果你想要查询系统已经安装的软件,也是从这里查询的!同时,目前的RPM也提供数字签名信息,这些数字签名也是在这个目录内记录的呢!
  那么软件内的文件到底是放置到哪里去啊?当然与文件系统有关对吗!

目录 类别
/etc 一些配置文件放置的目录,例如/etc/crontab
/usr/bin 一些可执行文件案
/usr/lib 一些程序使用的动态函式库
/usr/share/doc 一些基本的软件使用手册与说明文件
/usr/share/man 一些man page文件

22.2.2 RPM安装(install)

  因为安装软件是root的工作,因此你得要是root的身份才能够操作rmp这指令的。
rpm -i /mnt/Packages/rp-pppoe-3.11-5.el7.x86_64.rpm
  不过,这样的参数其实无法显示安装的进度,所以,通常我们会这样下达安装指令:

rpm -ivh package_name
选项与参数:
-i: install的意思
-v: 察看更细部的安装信息画面
-h: 以安装信息列显示安装进度
范例一:安装原版光盘上的rp-pppoe软件
rpm -ivh /mnt/Packages/rp-pppoe-3.11-5.el7-x86_64.rpm

rpm安装常用的选项与参数说明:

可下达的选项 代表意义
--nodeps 当发生软件属性相依问题而无法安装,但你执意安装时
--replacefiles 如果在安装的过程中出现了“某个文件已经被安装在你的系统上面”的信息,又或许出现版本不合的讯息(confilcting files)时,可以使用这个参数来直接覆盖文件
--replacepkgs 重新安装某个已经安装过的软件
--force 这个参数其实就是--replacefiles与--replacepkgs的综合体
--test 想要测试一下该软件是否可以被安装到使用者的Linux环境当中,可找出是否有属性相依的问题。
--justdb 由于RPM数据破损或者是某些缘故产生错误时,可使用这个选项来更新软件在数据库内的相关信息
--nosignature 想要略过数字签名的检查时
--prefix 新路径 要将软件安装到其他非正规目录时。
--noscripts 不想让该软件在安装过程中自行执行某些系统指令

22.2.3 RPM升级与更新(upgrade/freshen)

  使用RPM来升级真是太简单了!就以-Uvh或-Fvh来升级即可,而-Uvh与-Fvh可以用的选项与参数,跟install是一样的。不过,-U与-F的意义还是不太一样的,基本的差别是这样的:

参数 意义
-Uvh 后面接的软件即使没有安装过,则系统将予以直接安装;若有安装过,则系统自动更新至新版
-Fvh 如果后面接的软件并未安装到你的Linux系统上,则该软件不会被安装;亦即只有已安装至你的Linux系统内的软件会被‘升级’

22.2.4 查询(query)

  RPM在查询的时候,其实查询的地方是在/var/lib/rpm/这个目录下的数据库文件啦!另外,RPM也可以查询未安装的RPM文件内的信息哦!

rpm -qa   <==已安装软件
rpm -q[licdR] 已安装的软件名称
rpm -qf 存在于系统上面的某个文件名  <==已安装软件
rpm -qp[licdR] 未安装的某个文件名  <==查阅RPM文件
选项与参数:
查询已安装软件的信息:
-q: 仅查询,后面接的软件名称是否有安装
-qa: 列出所有的,已经安装在本机Linux系统上面的所有软件名称
-qi: 列出该软件的详细信息,包含开发商、版本与说明等
-ql: 列出该软件所有的文件与目录所在完整文件名(list)
-qc: 列出所有的配置文件
-qd: 列出所有说明文件
-qR: 列出与该软件有关的相依软件所含的文件
-qf: 由后面接的文件名,找出该文件属于哪一个已安装的软件
-q--scripts: 列出是否含有安装后需要执行的脚本档
查询某个RPM文件内含有的信息:
-qp[icdlR]: -qp后面的参数与上面的说明一致。但用途仅在于找出某个RPM文件内的信息,而非已安装的软件信息!

22.2.5 RPM验证与数字签名(Verify/signature)

  验证(Verify)的功能主要在于提供系统管理员一个有用的管理机制!作用的方式是【使用/var/lib/rpm】底下的数据库内容来比对目前Linux系统的环境下的所有软件文件,也就是说,当你有数据不小心遗失,或者是因为你误杀了某个软件的文件,或者是不小心不知道修改到某一个软件的文件内容,就用这个简单的方法来验证一下原本的文件系统吧!好让你了解这一阵子到底是修改到哪些文件数据了!验证的方式很简单:

rpm -Va
rpm -V 已安装的软件名称
rpm -Vp 某个RPM文件的档名
rpm -Vf 在系统上面的某个文件
选项与参数:
-V:后面加的是软件名称,若该软件所含的文件被更动过,才会列出来
-Va: 列出目前系统上面所有可能被更动过的文件
-Vp: 后面加的是文件名,列出该软件内可能被更动过的文件
-Vf: 列出某个文件是否被更动过
  • 数字签名
    验证只能验证软件内的信息与/var/lib/rpm/里面的数据库信息而已,如果该软件文件所提供的数据本身就有问题,那你使用验证的手段也无法确定该软件的正确性啊!那如何解决呢?在Tarball与文件的验证方面,我们可以使用前一章谈到的md5指纹码来检查,不过,连指纹码也可能会被窜改的嘛!没关系,我们可以透过数字签名来检验软件的来源的!
      就像你自己的签名一样,我们的软件开发商原厂所推出的软件也会有一个厂商自己的签章系统!只是这个签章被数字化了而已。厂商可以数字签名系统产生一个专属于该软件的签章,并将该签章的公钥释出。当你要安装一个RPM文件时:
  1. 首先你必须要先安装原厂释出的公钥文件
  2. 实际安装原厂的RPM软件时,rpm指令会去读取RPM文件的签章信息,与本机系统内的签章信息比对
  3. 若签章相同则予以安装,若找不到相关的签章信息时,则给予警告并且停止安装喔!

  我们CenOS使用的数字签名系统为GNU计划的GnuPG(GNU Privacy Guard)。GPG可以透过哈希运算,算出独一无二的专属密钥系统或者是数字签名系统。如rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
  由于不同版本的GPG密钥文件放置的位置可能不同,不过档名大多是以GPG-KEY来说明的,因此你可以简单的使用locate或find来找寻,如以下的方式来搜寻即可:

locate GPG-KEY
find /etc -name '*GPG-KEY*'
rpm -qa | grep pubkey
rpm -qi gpg-pubkey-f4a80eb5-53a7ff4b

22.2.6 RPM反安装与重建数据库(erase/rebuilddb)

  反安装就是将软件卸载啦!要注意的是,【解安装的过程一定要由最上层往下解除】。例如:rpm -e pam
rpm --rebuilddb <==重建数据库

22.3 在线升级机制

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

  • 查询功能:yum [list|info|search|provides|whatprovides] 参数
yum [option] [查询工作项目][相关参数]
选项与参数:
[option]: 主要的选项,包括有:
-y: 当yum要等待用户输入时,这个选项可以自动提供yes的响应
--installroot=/some/path: 将该软件安装在/some/path而不使用默认路径
[查询工作项目][相关参数]:这方面的参数有:
search: 搜寻某个软件名称或者是描述(description)的重要关键字:
list: 列出目前yum所管理的所有软件名称与版本,有点类似rpm -qa
info: 同上,不过有点类似rpm -qai的执行结果
provides: 从文件上去搜寻软件!类似rpm -qf的功能!
  • 安装/升级功能:yum [install|update] 软件
yum [option] [安装与升级的工作项目] [相关参数]
选项与参数:
install:后面接要安装的软件
update: 后面接要升级的软件,若要整个系统都升级,就直接update即可
  • 移除功能:yum [remove] 软件
    yum remove pam-devel

22.3.2 yum的配置文件

  软件库最重要的特色就是那个【repodata】的目录!该目录就是分析RPM软件后所产生的软件属性相依数据放置处!因此,当你要找软件库所在网址时,最重要的就是该网址底下一定要有个名为repodata的目录存在!那就是软件库的网址了!

  • name: 只是说明性文字!
  • mirrorlist: 映射站台,如果不想使用,可以批注掉
  • baseurl: 这个最重要,因为后面接的就是软件库的实际网址!
  • enable=1: 让这个软件库被启动,值为0为不启动
  • gpgcheck=1: 指定是否需要查阅RPM文件内的数字签名
  • gpgkey=: 数字签名的公钥文件所在位置!使用默认值即可

vim /etc/yum.repos.d/CentOS-Base.repo
yum repolist all

  • 修改软件库产生的问题与解决之道

    yum clean [packages|headers|all]
    选项参数:
    packages: 将已下载的软件文件删除
    headers: 将下载的软件文件头删除
    all: 将所有软件库数据都删除
    

22.3.3 yum的软件群组功能

yum [群组功能] [软件群组]
选项与参数:
grouplist: 列出所有可使用的[软件群组组],例如Development Tools之类的
groupinfo: 了解该group内含的所有软件名
groupinstall:可以安装一整组的软件群组
groupremove: 移除某个软件群组

22.3.4 EPEL/ELRepo 外挂软件以及自定义配置文件

  在Fedora基金会里面发展了一个外加软件计划(Extra Packages for Enterprise Linux,EPEL),这个计划主要是针对Red Hat Enterprise Linux的版本来开发的,刚刚好CentOS也是针对RHEL的版本来处理的嘛!所以也就能够支持该软件库的相关软件相依环境了。这个计划的主网站在底下网页:

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

  除了上述的Fedora计划所提供的额外软件库之外,其实社群里面也有朋友针对CentOS与EPEL的不足而提供的许多软件仓库哦!底下鸟哥是列出当初鸟哥为了要处理PCI passthrough虚拟化而使用到的ELRepo这个软件仓库,若有其他的需求,你就得要自己搜寻了!这个ELRepo软件仓库与提供给CentOS 7.x的网址如下:

  这个ELRepo的软件仓库跟其他软件库比较不同的地方在于这个软件库提供的数据大多是与核心、核心模块与虚拟化相关软件有关,例如NVidia的驱动程序也在里面咧!尤其提供了最新的核心。
  好了,根据上面的说明,来玩一玩底下这个模拟安全看看:

问:
我的系统上面要透过上述的CentOS 7的EPEL计划来安装netcdf以及R这两套软件,该如何处理?
答:
1. 首先,你的系统应该要针对epel进行yum的配置文件处理,处理方式如下:
vim /etc/yum.repos.d/epel.repo
[epel]
name = epel packages
baseurl = https://dl.fedoraprojects.org/pub/epel/7/x86_64/
gpgcheck = 0
enabled = 0

鸟哥故意不要启动这个软件仓库,只是未来有需要的时候才进行安装,预设不要去找这个软件库

2. 接下来使用这个软件仓库来进行安装netcdf与R的行为哦!
yum --enablerepo=epel install netcdf R
这样就可以安装起来了!
  • 使用本机的原版光盘
    万一你的主机并没有网络,但是你却有很多软件安装的需求~假设你的系统也都还没有任何升级的动作过,这个时候我能不能用本机的光盘来作为主要的软件来源呢?答案当然是可以啊!那要怎么做呢?很简单,将你的光盘挂载到某个目录,我们这里还是继续假设在/mnt好了,然后设定如下的yum配置文件:

    vim /etc/yum.repos.d/cdrom.repo
    [mycdrom]
    name = mycdrom
    baseurl = file:///mnt
    gpgcheck = 0
    enabled = 0
    范例:
    yum --enablerepo=mycdrom install software_name
    

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

22.3.5 全系统自动升级

  我们可以手动选择是否需要升级,那能不能让系统自动升级,让我们的系统随时保持在最新的状态呢?当然可以啊!透过【yum -y update】来自动升级,那个 -y 很重要,因为可以自动回答yes来开始下载与安装!然后再透过crontab的功能来处理即可!假设我每天在台湾时间3:00am网络带宽比较轻松的时候进行升级,你可以这样做的:

echo '10 1 * * * root /usr/bin/yum -y --enablerepo=epel update' > /etc/corn.d/yumupdate
vim /etc/crontab