第23章 软件安装:RPM、SRPM与YUM功能

虽然使用源代码进行软件编译可以具有定制化的设置,但对于 Linux distribution 的发行商来说,则有软件管理不易的问题,毕竟不是每个人都会进行源代码编译的。如果能够将软件预先在相同的硬件与操作系统上面编译好才发行的话,不就能够让相同的distribution具有完全一致的软件版本吗?如果再加上简易的安装/删除/管理等机制的话,对于软件管理就会简易得多。有这种东西吗?有的,那就是 RPM 与 YUM 这两个好用的东东。既然这么好用,我们当然不能错过学习机会,赶紧来参详参详!

23.1 软件管理器简介

在前一章我们提到以源代码的方式来安装软件,也就是利用厂商发布的 Tarball 来进行软件的安装。不过,你应该很容易发现,那就是每次安装软件都需要检测操作系统与环境、设置编译参数、实际的编译,最后还要依据个人喜好的方式来安装软件到定位。这过程是真的很麻烦的,而且对于不熟悉整个系统的朋友来说,还真是累人啊!

那有没有想过,如果我的Linux系统与厂商的系统一模一样,那么在厂商的系统上面编译出来的可执行文件自然也就可以在我的系统上面跑。也就是说,厂商先在他们的系统上面编译好了我们用户所需要的软件,然后将这个编译好提可执行的软件直接发布给用户来安装,如此一来,由于我们本来就使用厂商的 Linux distribution,所以当然系统(硬件与操作系统)是一样的,那么使用厂商提供的编译过的可执行文件就没有问题。说得比较直白一些,那就是利用类似Windows的安装方式,由程序开发者直接在已知的系统上面编译好,再将该程序直接给用户来安装,如此而已。

那么如果在安装的时候还可以加上一些与这些程序相关的信息,将它新建成为数据库,那不就可以进行安装、反安装、升级与验证等的相关功能(类似Windows下面的“添加或删除程序”)?确实如此,在Linux上面至少就有两种常见的这方面的软件管理器,分别是RPM与Debian的dpkg。我们的CentOS主要是以RPM为主,但也不能不知道dpkg。所以下面就来简略介绍一下这两个玩意。

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

由于自由软件的蓬勃发展,加上大型UNIX-Like主机的强大性能,让很多软件开发者将他们的软件使用 Tarball 来发布。后来 Linux 发展起来后,由一些企业或社区将这些软件收集起来制作成为distributions以发布这个好用的Linux操作系统。但后来发现到,这些distribution的软件管理实在伤脑筋,如果软件有漏洞时,又该如何修补呢?使用tarball的方式来管理吗?又经常不晓得到底我们安装过了哪些程序?因此,一些社区与企业就开始思考Linux的软件管理方式。

如同刚才谈过的方式,Linux 开发商先在固定的硬件平台与操作系统平台上面将需要安装或升级的软件编译好,然后将这个软件的所有相关文件打包成为一个特殊格式的文件,在这个软件文件内还包含了预先检测系统与依赖软件的脚本,并提供记载该软件提供的所有文件信息等,最终将这个软件文件发布。客户端取得这个文件后,只要通过特定的命令来安装,那么该软件文件就会按照内部的脚本来检测相关的前驱软件是否存在,若安装的环境符合需求,那就会开始安装,安装完成后还会将该软件的信息写入软件管理机制中,以完成未来可以进行升级、删除等操作。

目前在Linux界软件安装方式最常见的有两种,分别是:

dpkg

这个机制最早是由Debian Linux社区所开发出来的,通过dpkg的机制,Debian提供的软件就能够简单安装起来,同时还能提供安装后的软件信息,实在非常不错。只要是派生于Debian的其他Linux distributions大多使用dpkg这个机制来管理软件,包括B2D, Ubuntu等。

RPM

这个机制最早是由 Red Hat 这家公司开发出来的,后来实在很好用,因此很多 distributions就使用这个机制来作为软件安装的管理方式,包括 Fedora, CentOS, SuSE 等知名的开发商都是用它。

如前所述,不论是dpkg还是rpm,这些机制或多或少都会有软件属性依赖的问题,那该如何解决呢?其实前面不是谈到过每个软件文件都有提供依赖属性的检查吗?那么如果我们将依赖属性的数据做成列表,等到实际软件安装时,若发生有依赖属性的软件情况时,例如安装A需要先安装B与C,而安装B则需要安装D与E时,那么当你要安装A,通过依赖属性列表,管理机制自动去取得B、C、D、E来同时安装,不就解决了属性依赖的问题吗?

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

表23-1

figure_0680_0387

我们这里使用的是CentOS系统。所以说:使用的软件管理机制为RPM机制,而用来作为在线升级的方式则为yum。下面就让我们来谈谈RPM与YUM的相关说明吧!

23.1.2 什么是 RPM 与SRPM

RPM 全名是“RedHat Package Manager”,简称则为 RPM。顾名思义,当初这个软件管理的机制是由 Red Hat 这家公司发展出来的。RPM 是以一种数据库记录的方式来将你所需要的软件安装到你的Linux系统的一套管理机制。

RPM最大的特点就是将你要安装的软件先编译过,并且打包成为RPM机制的安装包,通过包装好的软件里头默认的数据库记录这个软件要安装的时候必须具备的依赖属性软件,当安装在你的Linux主机时,RPM会先依照软件里头的数据查询Linux主机的依赖属性软件是否满足,若满足则予以安装,若不满足则不予安装。那么安装的时候就将该软件的信息整个写入 RPM 的数据库中,以便未来的查询、验证与反安装。这样一来的优点是:

1.由于已经编译完成并且打包完毕,所以软件传输与安装上很方便(不需要再重新编译);

2.由于软件的信息都已经记录在Linux主机的数据库上,很方便查询、升级与反安装。

但是这也造成些许的困扰。由于 RPM 文件是已经包装好的数据,也就是说,里面的数据已经都“编译完成”了,所以,该软件文件几乎只能安装在原本默认的硬件与操作系统版本中。也就是说,你的主机系统环境必须要与当初建立这个软件文件的主机环境相同才行!举例来说,rp-pppoe 这个ADSL拨号软件,它必须要在ppp这个软件存在的环境下才能进行安装!如果你的主机并没有ppp这个软件,那么很抱歉,除非你先安装ppp否则rp-pppoe就是不让你安装的(当然你可以强制安装,但是通常都会有点问题发生就是了)。

所以,通常不同的distribution所发布的RPM文件并不能用在其他的distributions上。举例来说, Red Hat 释出的 RPM 文件通常无法直接在 SuSE 上面进行安装的。更有甚者,相同 distribution 的不同版本之间也无法互通,例如 CentOS 4.x 的 RPM 文件就无法直接应用在 CentOS 5.x!因此,这样可以发现这些软件管理机制的问题是:

1.软件安装的环境必须与打包时的环境需求一致或相当;

2.需要满足软件的依赖属性需求;

3.反安装时需要特别小心,最底层的软件不可先删除,否则可能造成整个系统的问题!

那怎么办?如果我真的想要安装其他distributions提供的好用的RPM软件时?还好,还有SRPM这个东西!SRPM 是什么呢?顾名思义,它是Source RPM 的意思,也就是这个RPM 文件里面含有源代码。特别 意的是,这个SRPM 所提供的软件内容并没有经过编译,它提供的是源代码。

通常SRPM的扩展名是以*.src.rpm这种格式来命名的。不过,既然SRPM提供的是源代码,那么为什么我们不使用Tarball直接来安装就好了?这是因为SRPM虽然内容是源代码,但是它仍然含有该软件所需要的依赖性软件说明以及所有RPM文件所提供的数据。同时,它与RPM不同的是,它也提供了参数设置文件(就是configure与makefile)。所以,如果我们下载的是SRPM,那么要安装该软件时,你就必须要:

先将该软件以RPM管理的方式编译,此时SRPM会被编译成为RPM文件;

然后将编译完成的RPM文件安装到Linux系统当中。

怪了,怎么SRPM这么麻烦。还要重新编译一次,那么我们直接使用RPM来安装不就好了?通常一个软件在发布的时候,都会同时释出该软件的RPM 与SRPM。我们现在知道RPM 文件必须要在相同的Linux环境下才能够安装,而SRPM既然是源代码的格式,自然我们就可以通过修改SRPM内的参数设置文件,然后重新编译生成能适合我们Linux环境的RPM文件,如此一来,不就可以将该软件安装到我们的系统当中,而不必与原作者打包的Linux环境相同了?这就是SRPM的用处了,如表23-2所示。

表23-2

figure_0681_0388

为何说 CentOS 是“社区维护的企业版”呢? Red Hat 公司的 RHEL 发布后,连带会将 SRPM 发布。一些社区的朋友就将这些 SRPM 收集起来并重新编译成所需要的软件,再重复发布成为 CentOS,所以才能号称与 Red Hat 的 RHEL 企业版同步啊!真要感谢 SRPM 。如果你想要理解 CentOS 是如何编译一个程序的,也能够通过学习 SRPM内含的编译参数来学习。

23.1.3 什么是i386、i586、i686、noarch、x86_64

从上面的说明,现在我们知道RPM与SRPM的格式分别为:

xxxxxxxxx.rpm <==RPM 的格式,已经经过编译且包装完成的 rpm 文件;

xxxxx.src.rpm <==SRPM的格式,包含未编译的源代码信息。

那么我们怎么知道这个软件的版本、适用的平台、编译发布的次数呢?只要通过文件名就可以知道了!例如rp-pppoe-3.1-5.i386.rpm这的文件的意义为:

rp-pppoe -  3.1 - 5  .i386  .rpm

软件名称 软件的版本信息 发布的次数 适合的硬件平台 扩展名

除了后面适合的硬件平台与扩展名外,主要是以“-”来隔开各个部分,这样子可以很清楚地发现该软件的名称、版本信息、打包次数与操作的硬件平台。好了,来谈一谈每个不同的地方吧!

软件名称

当然就是每一个软件的名称了!上面的范例就是rp-pppoe。

版本信息

每一次更新版本就需要有一个版本的信息,否则如何知道这一版是新是旧?这里通常又分为主版本跟次版本。以上面为例,主版本为3,在主版本的架构下改动部分源代码内容而释出一个新的版本,就是次版本,以上面为例,就是1。

发布版本次数

通常就是编译的次数。那么为何需要重复的编译呢?这是由于同一版的软件中,可能由于有某些 bug或者是安全上的顾虑,所以必须要进行小幅度的 patch或重设一些编译参数。设置完成之后重新编译并打包成RPM文件,因此就有不同的打包数出现了!

操作硬件平台

这是个很好玩的地方,由于RPM可以适用在不同的操作平台上,但是不同的平台设置的参数还是有所区别性。并且,我们可以针对比较高级的CPU来进行优化参数的设置,这样才能够使用高级别CPU所带来的硬件加速功能,所以就有所谓的i386、i586、i686、x86_64与noarch等的文件名称出现了,如表23-3所示。

表23-3

figure_0682_0389

受惠于目前 x86系统的支持方面,新的CPU都能够执行老版本 CPU所支持的软件,也就是说硬件方面都可以向下兼容的,因此最低等级的i386软件可以安装在所有的x86硬件平台上面,不论是32位还是64位,但是反过来说就不行了。举例来说,目前硬件大多是64位,因此你可以在该硬件上面安装x86_64或i386级别的RPM软件。但在你的旧型主机,例如 P-III/P-4 32 位机器上面,就不能够安装 x86_64 的软件!

根据上面的说明,其实我们只要选择i386版本来安装在你的x86硬件上面就肯定没问题。但是如果强调性能的话,还是选择搭配你的硬件的RPM文件吧!毕竟该软件才有针对你的CPU硬件平台进行过参数优化的编译嘛!

23.1.4 RPM 的优点

由于RPM是通过预编译并打包成为RPM文件格式后再加以安装的一种方式,并且还能够进行数据库的记载,所以RPM有以下的优点:

RPM内含已经编译过的程序与设置文件等数据,可以让用户免除重新编译的困扰;

RPM在被安装之前,会先检查系统的硬盘容量、操作系统版本等,可避免文件被错误安装;

RPM文件本身提供软件版本信息、依赖属性软件名称、软件用途说明、软件所含文件等信息,便于了解软件;

RPM管理的方式使用数据库记录RPM文件的相关参数,便于升级、删除、查询与验证。

为什么RPM在使用上很方便呢?我们前面提过,RPM这个软件管理器所处理的软件是由软件提供程序在特定的Linux操作平台上面将该软件编译完成并且打包好。那用户只要拿到这个打包好的软件,然后将里头的文件放置到应该要摆放的目录,不就完成了安装?对。就是这样!

但是有没有想过,我们在前一章里面提过的,有些软件是有相关性的,例如要安装网卡驱动程序,就得要有kernel source与gcc及make等软件。那么我们的RPM软件是否一定可以安装完成呢?如果该软件安装之后,却找不到它相关的前驱软件,那不是挺麻烦的吗?因为安装好的软件也无法使用啊!

为了解决这种具有相关性的软件之间的问题(就是所谓的软件依赖属性),RPM 就在提供打包的软件时,同时加入一些信息记录的功能,这些信息包括软件的版本、打包软件者、依赖属性的其他软件、本软件的功能说明、本软件的所有文件记录等,然后在Linux系统上面也建立一个RPM软件数据库,如此一来,当你要安装某个以RPM类型提供的软件时,在安装的过程中,RPM会去检验一下数据库里面是否已经存在相关的软件了,如果数据库显示不存在,那么这个 RPM 文件“默认”就不能安装。这个就是RPM类型的文件最为人诟病的“软件的属性依赖”问题。

23.1.5 RPM 属性依赖的解决方式:YUM 在线升级

为了重复利用既有的软件功能,因此很多软件都会以函数库的方式释出部分功能,以方便其他软件的调用应用,例如PAM模块的验证功能。此外,为了节省用户的数据量,目前的distributions在发布软件时,都会将软件的内容分为一般使用与开发使用(development)两大类。所以你才会经常看到有类似 pam-x.x.rpm 与 pam-devel-x.x.rpm 之类的文件名,而默认情况下,大部分的software-devel-x.x.rpm都不会安装,因为终端用户大部分不会去开发软件。

因为有上述的现象,因此 RPM 软件文件就会有所谓的属性依赖的问题产生(其实所有的软件管理几乎都有这方面的情况存在)。那有没有办法解决啊?前面不是谈到RPM软件文件内部会记录依赖属性的数据吗?那想一想,要是我将这些依赖属性的软件先列表,在有要安装软件需求的时候先到这个列表去找,同时与系统内已安装的软件相比较,没安装到的依赖软件就一口气同时安装起来,那不就解决了依赖属性的问题了吗?有没有这种机制啊?有啊!那就是YUM机制的由来!

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

figure_0683_0390

图23-1 YUM 使用的流程示意图

当客户端有升级、安装的需求时, yum 会向容器要求清单的更新,等到清单更新到本机的/var/cache/yum 里面后,等一下更新时就会用这个本机清单与本机的 RPM 数据库进行比较,这样就知道该下载什么软件。接下来 yum 会跑到容器服务器(yum server)下载所需要的软件,然后再通过RPM的机制开始安装软件。这就是整个流程。谈到最后,还是需要用到RPM的。所以下个小节就让我们来谈谈RPM这东东吧!

为什么要做出“容器”呢?由于 yum 服务器提供的 RPM 文件内容可能有所区别,举例来说,原厂发布的数据有原版数据、更新数据 (update)及特殊数据 (例如第三方软件,或某些特殊功能的软件)。这些软件文件基本上不会放置到一起,那如何分辨这些软件功能呢?就用“容器”的概念来处理! 不同的“容器”网址可以放置不同的软件功能。

23.2 RPM 软件管理程序:rpm

RPM的使用其实不难,只要使用rpm这个命令即可。鸟哥最喜欢的就是rpm命令的查询功能了,可以让我很轻易就知道某个系统有没有安装鸟哥要的软件呢!此外,我们最好还是得要知道一下,到底RPM类型的文件将软件的相关文件放置在哪里呢?还有,我们说的那个RPM的数据库又是放置在哪里呢?

23.2.1 RPM 默认安装的路径

一般来说,RPM类型的文件在安装的时候,会先去读取文件内记载的设置参数内容,然后将该数据用来比较Linux系统的环境,以找出是否有属性依赖的软件尚未安装的问题。例如Openssh这个联网软件需要通过Openssl这个加密软件的帮忙,所以得先安装openssl才能装openssh。那你的环境如果没有openssl,你就无法安装openssh。

若环境检查合格了,那么RPM文件就开始被安装到你的Linux系统上。安装完毕后,该软件相关的信息就会被写入/var/lib/rpm/目录下的数据库文件中了。上面这个目录内的数据很重要。因为未来如果我们有任何软件升级的需求,版本之间的比较就是来自于这个数据库,而如果你想要查询系统已经安装的软件,也是从这里查询的。同时,目前的 RPM 也提供数字证书信息,这些数字证书也是在这个目录内记录的呢!所以说,这个目录得要注意不要被删除了。

那么软件内的文件到底是放置到哪里去啊?当然与文件系统有关!我们在第6章的目录配置谈过每个目录的意义,这里再次强调,如表23-4所示。

表23-4

figure_0684_0391

好了,下面我们就来针对每个RPM的相关命令来进行说明。

23.2.2 RPM 安装(install)

因为安装软件是root的工作,因此你得要是root的身份才能够操作rpm这命令的。用rpm来安装很简单。假设我要安装一个文件名为rp-pppoe-3.5-32.1.i386.rpm的文件,那么我可以这样:

[root@www~]# rpm -i rp-pppoe-3.5-32.1.i386.rpm

不过,这样的参数其实无法显示安装的进度,所以,通常我们会这样执行安装命令:

[root@www ~]# rpm -ivh package_name

参数:

-i :install 的意思

-v :查看更详细的安装信息画面

-h :以安装信息栏显示安装进度

范例一:安装 rp-pppoe-3.5-32.1.i386.rpm

[root@www ~]# rpm -ivh rp-pppoe-3.5-32.1.i386.rpm

Preparing… ####################################### [100%]

1:rp-pppoe ####################################### [100%]

范例二:一口气安装两个以上的软件时:

[root@www ~]# rpm -ivh a.i386.rpm b.i386.rpm *.rpm

后面直接接上许多的软件文件

范例三:直接由网络上面的某个文件安装,以网址来安装:

[root@www ~]# rpm -ivh http://website.name/path/pkgname.rpm

另外,如果我们在安装的过程当中发现问题,或者已经知道会发生的问题,而还是“执意”要安装这个软件时,可以使用如下的参数“强制”安装上去,如表23-5所示。

表23-5

figure_0685_0392

一般来说,rpm的安装参数大约就是这些了。通常鸟哥建议直接使用-ivh就好了,如果安装的过程中发现问题,一个一个去将问题找出来,尽量不要使用“暴力安装法”,就是通过—force去强制安装。因为可能会发生很多不可预期的问题,除非你很清楚地知道使用上面的参数后安装的结果是你预期的!

figure_0685_0393

在没有网络的前提下,你想要安装一个名为pam-devel的软件,你手边只有原版光盘,该如何是好?

答:你可以通过挂载原版光盘来进行数据的查询与安装。请将原版光盘放入光驱,下面我们尝试将光盘挂载到/media当中:

挂载光盘,使用:mount /dev/cdrom /media

找出文件的实际路径:find /media -name 'pam-devel*'

测试此软件是否具有依赖性:rpm -ivh pam-devel… —test

直接安装:rpm -ivh pam-devel…

卸载光盘:umount /dev/cdrom

在鸟哥的系统中,刚好这个软件并没有属性依赖的问题,因此最后一个步骤可以顺利进行下去呢!

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

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

表23-6

figure_0686_0394

由上面的说明来看,如果你想要大量的升级系统旧版本的软件时,使用-Fvh则是比较好的做法,因为没有安装的软件才不会被不小心安装进系统中。但是需要注意的是,如果你使用的是-Fvh,偏偏你的机器上尚无这一个软件,那么很抱歉,该软件并不会被安装在你的Linux主机上面,所以请重新以ivh来安装吧!

通常有的朋友在进行整个操作系统的旧版软件修补时,喜欢这么进行:

1.先到各厂商的errata网站或者是国内的FTP镜像站点下载最新的RPM文件;

2.使用-Fvh来将你的系统内曾安装过的软件进行修补与升级(真是方便呀)!

所以,在不晓得yum功能的情况下,你依旧可以到CentOS的镜像站点下载updates数据,然后利用上述的方法来一口气升级!当然,升级也是可以利用—nodeps/—force等参数。

23.2.4 RPM 查询(query)

RPM在查询的时候,其实查询的地方是/var/lib/rpm/这个目录下的数据库文件。另外,RPM也可以查询未安装的RPM文件内的信息。那如何去查询呢?我们先来谈谈可用的选项有哪些。

[root@www~]# rpm -qa       <==已安装软件

[root@www ~]# rpm -q[licdR]已安装的软件名称  <==已安装软件

[root@www ~]# rpm -qf存在于系统上面的某个文件名   <==已安装软件

[root@www ~]# rpm -qp[licdR]未安装的某个文件名称 <==查阅RPM文件

参数:

查询已安装软件的信息:

-q :仅查询,后面接的软件名称是否有安装;

-qa :列出所有的已经安装在本机 Linux 系统上面的所有软件名称;

-qi :列出该软件的详细信息 (information),包含开发商、版本与说明等;

-ql :列出该软件所有的文件与目录所在完整文件名 (list);

-qc :列出该软件的所有设置文件 (找出在 /etc/ 下面的文件名而已);

-qd :列出该软件的所有帮助文件 (找出与 man 有关的文件而已);

-qR :列出与该软件有关的依赖软件所含的文件 (Required 的意思);

-qf :由后面接的文件名称找出该文件属于哪一个已安装的软件。

查询某个 RPM 文件内含有的信息:

-qp[icdlR]:注意 -qp 后面接的所有参数以上面的说明一致,但用途仅在于找出

某个 RPM 文件内的信息,而非已安装的软件信息!注意!

在查询的部分,所有的参数之前都需要加上-q才是所谓的查询。查询主要分为两部分,一个是查已安装到系统上面的的软件信息,这部分的信息都是由/var/lib/rpm/所提供;另一个则是查某个rpm文件内容,等于是由RPM文件内找出一些要写入数据库内的信息,这部分就得要使用-qp(p是package的意思)。那就来看看几个简单的范例吧!

范例一:找出你的 Linux 是否有安装 logrotate 这个软件

[root@www ~]# rpm -q logrotate

logrotate-3.7.4-8

[root@www ~]# rpm -q logrotating

package logrotating is not installed

注意,系统会去找是否有安装后面接的软件名称。注意,

不必加上版本。至于显示的结果,一看就知道有没有安装。

范例二:列出上题当中属于该软件所提供的所有目录与文件:

[root@www ~]# rpm -ql logrotate

/etc/cron.daily/logrotate

/etc/logrotate.conf

….(以下省略)….

可以看出该软件到底提供了多少的文件与目录,也可以跟踪软件的数据。

范例三:列出 logrotate 这个软件的相关说明数据:

[root@www ~]# rpm -qi logrotate

Name  : logrotate   Relocations: (not relocatable)

Version : 3.7.4     Vendor: CentOS

Release : 8     Build Date: Sun 02 Dec 2007 08:38:06 AM CST

Install Date: Sat 09 May 2009 11:59:05 PM CST Build Host: builder6

Group  : System Environment/Base Source RPM: logrotate-3.7.4-8.src.rpm

Size  : 53618    License: GPL

Signature : DSA/SHA1, Sun 02 Dec 2007 09:10:01 AM CST, Key ID a8a447dce8562897

Summary : Rotates, compresses, removes and mails system log files.

Description :

The logrotate utility is designed to simplify the administration of

log files on a system which generates a lot of log files. Logrotate

allows for the automatic rotation compression, removal and mailing of

log files. Logrotate can be set to handle a log file daily, weekly,

monthly or when the log file gets to a certain size. Normally,

logrotate runs as a daily cron job.

Install the logrotate package if you need a utility to deal with the

log files on your system.

列出该软件的 information (信息),里面的信息可多着呢!包括了软件名称、

版本、开发商、SRPM文件名称、打包次数、简单说明信息、软件打包者、

安装日期等!如果想要详细了解该软件的数据,用这个参数来了解一下。

范例四:分别仅找出 logrotate 的设置文件与帮助文件

[root@www ~]# rpm -qc logrotate

[root@www ~]# rpm -qd logrotate

范例五:若要成功安装 logrotate,它还需要什么文件的帮忙?

[root@www ~]# rpm -qR logrotate

/bin/sh

config(logrotate) = 3.7.4-8

libc.so.6

….(以下省略)….

由这里看起来,呵呵~还需要很多文件的支持才行。

范例六:由上面的范例五,找出 /bin/sh 是那个软件提供的。

[root@www ~]# rpm -qf /bin/sh

bash-3.2-21.el5

这个参数后面接的可是“文件”!不像前面都是接软件。

这个功能在于查询系统的某个文件属于哪一个软件所有的。

范例七:假设我有下载一个 RPM 文件,想要知道该文件的需求文件,该如何办?

[root@www ~]# rpm -qpR filename.i386.rpm

加上 -qpR ,找出该文件需求的数据!

常见的查询就是这些了!要特别说明的是,在查询本机上面的 RPM 软件相关信息时,不需要加上版本的名称,只要加上软件名称即可!因为它会由/var/lib/rpm这个数据库里面去查询,所以我们可以不需要加上版本名称。但是查询某个 RPM 文件就不同了,我们必须要列出整个文件的完整文件名才行。这一点朋友们经常会搞错。下面我们就来做几个简单的练习。

figure_0688_0395

1.我想要知道我的系统当中以c开头的软件有几个,如何做?

2.我的WWW服务器为Apache,我知道它使用的RPM软件文件名为httpd。现在,我想要知道这个软件的所有设置文件放置在何处,可以怎么做?

3.承上题,如果查出来的设置文件已经被我改过,但是我忘记了曾经修改过哪些地方,所以想要直接重新安装一次该软件,该怎么做?

4.如果我误删了某个重要文件,例如/etc/crontab,偏偏不晓得它属于哪个软件,该怎么办?

答:

1.rpm -qa | grep ^c | wc -l

2.rpm -qc httpd

3.假设该软件在网络上的地址为:

http://web.site.name/path/httpd-x.x.xx.i386.rpm

则我可以这样做:

rpm -ivh http://web.site.name/path/httpd-x.x.xx.i386.rpm —replacepkgs

4.虽然已经没有这个文件了,不过没有关系,因为RPM有记录在/var/lib/rpm当中的数据库啊!所以直接执行:

rpm-qf /etc/crontab

就可以知道是哪个软件。重新安装一次该软件即可。

23.2.5 RPM 验证与数字证书(Verify/Signature)

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

[root@www~]# rpm -Va

[root@www ~]# rpm -V 已安装的软件名称

[root@www ~]# rpm -Vp 某个 RPM 文件的文件名

[root@www ~]# rpm -Vf 在系统上面的某个文件

参数:

-V :后面加的是软件名称,若该软件所含的文件被改动过,才会列出来;

-Va :列出目前系统上面所有可能被改动过的文件;

-Vp :后面加的是文件名称,列出该软件内可能被改动过的文件;

-Vf :列出某个文件是否被改动过。

范例一:查询你的 Linux 内的 logrotate 这个软件是否被改动过

[root@www ~]# rpm -V logrotate

如果没有出现任何信息,恭喜你,该软件所提供的文件没有被改动过。

如果有出现任何信息,才是有出现状况啊!

范例二:查询一下,你的/etc/crontab是否有被改动过

[root@www ~]# rpm -Vf /etc/crontab

S.5….T c /etc/crontab

瞧!因为有被改动过,所以会列出被改动过的信息类型!

好了,那么我怎么知道到底我的文件被改动过的内容是什么?例如上面的范例二。简单说明一下吧!例如,我们检查一下logrotate这个软件:

[root@www ~]# rpm -ql logrotate

/etc/cron.daily/logrotate

/etc/logrotate.conf

/etc/logrotate.d

/usr/sbin/logrotate

/usr/share/doc/logrotate-3.7.4

/usr/share/doc/logrotate-3.7.4/CHANGES

/usr/share/man/man8/logrotate.8.gz

/var/lib/logrotate.status

共有8个文件啊!请修改 /etc/logrotate.conf 内的 rotate 变成 5

[root@www ~]# rpm -V logrotate

..5….T c /etc/logrotate.conf

你会发现在文件名之前有个c,然后就是一堆奇怪的文字了。那个c代表的是configuration,就是设置文件的意思。至于最前面的8个信息是:

S(file Size differs):文件的容量大小是否被改变;

M(Modediffers):文件的类型或文件的属性(rwx)是否被改变,如是否可执行等参数已被改变;

5(MD5 sum differs):MD5 这一种指纹码的内容已经不同;

D(Device major/minor number mis-match):设备的主/次代码已经改变;

L(readLink(2) path mis-match):Link 路径已被改变;

U(User ownership differs):文件的所有者已被改变;

G(Group ownership differs):文件的所属用户组已被改变;

T(mTime differs):文件的创建时间已被改变。

所以,如果当一个设置文件所有的信息都被改动过,那么它的显示就会是:

SM5DLUGT c filename

至于那个 c 代表的是“Configfile”的意思,也就是文件的类型,文件类型有下面这几类:

c:设置文件(config file);

d:文档(documentation);

g:“鬼”文件(ghost file),通常是该文件不被某个软件所包含,较少发生;

l:授权文件(license file);

r:自述文件(read me)。

经过验证的功能,你就可以知道哪个文件被改动过。那么如果该文件的更改是预期中的,那么就没有什么大问题,但是如果该文件是非预期的,那么是否被入侵了呢?得注意。一般来说,设置文件(configure)被更改过是很正常的,万一你的二进制程序被更改过呢?那就得要特别特别小心啊!

虽说家丑不可外扬,不过有件事情还是跟大家分享一下的好。鸟哥之前的主机曾经由于安装一套软件,导致被攻击成为跳板。会发现的原因是系统中只要出现 *.patch 的扩展名时,使用 ls -l 就是显示不出来该文件名 (该文件名确实存在)。找了好久,用了好多工具都找不出问题,最终利用 rpm -Va 找出来,原来好多二进制程序被改动过,连 init 都被恶搞!此时,赶紧重新安装 Linux 并删除那套软件,之后就比较正常了。所以说,这个 rpm -Va 是个好功能。

数字证书(digital signature)

谈完了软件的验证后,不知道你有没有发现一个问题,那就是,验证只能验证软件内的信息与/var/lib/rpm/里面的数据库信息而已,如果该软件文件所提供的数据本身就有问题,那你使用验证的手段也无法确定该软件的正确性啊!那如何解决呢?在Tarball与文件的验证方面,我们可以使用前一章谈到的md5指纹码来检查,不过,连指纹码也可能会被窜改的嘛!那怎办?没关系,我们可以通过数字证书来检验软件的来源的!

就像你自己的签名一样,我们的软件开发商原厂所推出的软件也会有一个厂商自己的证书系统,只是这个证书被数字化了而已。厂商可以数字证书系统产生一个专属于该软件的证书,并将该证书的公钥(public key) 发布。当你要安装一个 RPM 文件时:

1.首先你必须要先安装原厂发布的公钥文件;

2.实际安装原厂的RPM软件时,rpm命令会去读取RPM文件的证书信息,与本机系统内的证书信息比较;

3.若证书相同则予以安装,若找不到相关的证书信息时,则给予警告并且停止安装。

我们 CentOS使用的数字证书系统为 GNU 计划的 GnuPG(GNU Privacy Guard, GPG) [11]。GPG 可以通过复杂运算算出独一无二的专属金钥系统或者是数字证书系统,有兴趣的朋友可以参考文末的延伸阅读,去了解一下GPG加密的机制。这里我们仅简单说明数字证书在RPM文件上的应用而已。而根据上面的说明,我们也会知道首先必须要安装原厂释出的GPG数字证书的公钥文件。CentOS的数字证书位于:

[root@www~]# ll /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

-rw-r—r— 1 root root 1504 6月 19 2008 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

[root@www ~]# cat /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

——-BEGIN PGP PUBLIC KEY BLOCK——-

Version: GnuPG v1.2.6 (GNU/Linux)

mQGiBEWfB6MRBACrnYW6yKMT+MwJlCIhoyTxGf3mAxmnAiDEy6HcYN8rivssVTJk

….(中间省略)….

——-END PGP PUBLIC KEY BLOCK——-

从上面的输出,你会知道该数字证书其实仅是一个随机数而已,这个随机数对于数字证书有意义而已,我们看不懂。那么这个文件如何安装呢?通过下面的方式来安装即可。

[root@www ~]# rpm —import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

由于不同版本GPG金钥文件放置的位置可能不同,不过文件名大多是以GPG-KEY来说明的,因此你可以简单使用locate或find来找寻,如以下的方式来搜索即可:

[root@www~]# locate GPG-KEY

[root@www ~]# find /etc -name 'GPG-KEY'

那安装完成之后,这个金钥的内容会以什么方式呈现呢?基本上都是使用 pubkey 作为软件的名称的!那我们先列出金钥软件名称后,再以-qi的方式来查询看看该软件的信息为何:

[root@www ~]# rpm -qa | grep pubkey

gpg-pubkey-e8562897-459f07a4

[root@www ~]# rpm -qi gpg-pubkey-e8562897-459f07a4

Name  : gpg-pubkey  Relocations: (not relocatable)

Version : e8562897   Vendor: (none)

Release : 459f07a4  Build Date: Wed 27 May 2009 10:07:26 PM CST

Install Date: Wed 27 May 2009 10:07:26 PM CST Build Host: localhost

Group  : Public Keys  Source RPM: (none)

Size  : 0    License: pubkey

Signature : (none)

Summary : gpg(CentOS-5 Key <centos-5-key@centos.org>)

Description :

——-BEGIN PGP PUBLIC KEY BLOCK——-

Version: rpm-4.4.2 (beecrypt-4.1.2)

….(下面省略)….

重点就是最后面出现的那一串乱码。那可是作为数字证书非常重要的一环。如果你忘记加上数字证书,很可能很多原版软件就不能让你安装,除非你利用rpm时选择略过数字证书的参数。

23.2.6 卸载 RPM 与重建数据库(erase/rebuilddb)

卸载就是将软件解除安装。要注意的是,解安装的过程一定要由最上层往下解除,以 rp-pppoe为例,这一个软件主要是依据ppp 这个软件来安装的,所以当你要缺载ppp的时候,就必须要先解除rp-pppoe才行!否则就会发生结构上的问题。这个可以由建筑物来说明,如果你要拆除五、六楼,那么当然要由六楼拆起,否则先拆的是第五楼时,那么上面的楼层难道会悬空?

删除的选项很简单,就通过-e即可删除。不过,很常发生软件属性依赖导致无法删除某些软件的问题。我们以下面的例子来说明:

1. 找出与 pam 有关的软件名称,并尝试删除 pam 这个软件:

[root@www ~]# rpm -qa | grep pam

pam-devel-0.99.6.2-3.27.el5

pam_passwdqc-1.0.2-1.2.2

pam_pkcs11-0.5.3-23

pam_smb-1.1.7-7.2.1

pam-0.99.6.2-3.27.el5

pam_ccreds-3-5

pam_krb5-2.2.14-1

[root@www ~]# rpm -e pam

error: Failed dependencies: <==这里提到的是依赖性的问题

libpam.so.0 is needed by (installed) coreutils-5.97-14.el5.i386

libpam.so.0 is needed by (installed) libuser-0.54.7-2.el5.5.i386

….(以下省略)….

2. 若仅删除 pam-devel 这个之前范例安装上的软件呢?

[root@www ~]# rpm -e pam-devel <==不会出现任何信息

[root@www ~]# rpm -q pam-devel

package pam-devel is not installed

从范例一我们知道 pam 所提供的函数库是让非常多其他软件使用的,因此你不能删除 pam,除非将其他依赖软件一口气也全部删除!你当然也能加—nodeps 来强制删除,不过,如此一来所有会用到pam函数库的软件都将成为无法运行的程序,我想,你的主机也只好准备停机休假了吧!至于范例二中,由于pam-devel是依附于pam的开发工具,你可以单独安装与单独删除。

由于RPM文件经常会安装/删除/升级等,某些操作或许可能会导致RPM数据库/var/lib/rpm/内的文件损坏。果真如此的话,那你该如何是好?别担心,我们可以使用—rebuilddb 这个参数来重建一下数据库。做法如下:

[root@www ~]# rpm —rebuilddb <==重建数据库

23.3 SRPM 的使用:rpmbuild

谈完了 RPM 类型的软件之后,再来我们谈一谈包含了 Source code 的 SRPM 该如何使用呢?假如今天我们由网络上面下载了一个SRPM的文件,该如何安装它?另外,如果我想要修改这个SRPM里面源代码的相关设置值,又该如何修订与重新编译呢?此外,最需要注意的是,新版的rpm已经将RPM 与SRPM 的命令分开了,SRPM 使用的是rpmbuild 这个命令,而不是rpm。如果你是 Red Hat 7.3以前的用户,那么请使用rpm来替代rpmbuild。

23.3.1 利用默认值安装SRPM 文件(—rebuid/—recompile)

假设我下载了一个SRPM的文件,又不想要修改这个文件内的源代码与相关的设置值,那么我可以直接编译并安装吗?当然可以!利用rpmbuild配合选项即可。参数主要有下面两个,如表23-7所示。

表23-7

figure_0692_0396

不过,要注意的是,这两个参数都没有修改过SRPM内的设置值,仅是通过再次编译来产生RPM可安装软件文件而已。一般来说,如果编译的操作顺利的话,那么编译过程所生成的临时文件都会被自动删除,如果发生任何错误,则该临时文件会被保留在系统上,等待用户的调试操作。那么,该如何调试呢?如果想要自行调试,或者是想要修改SRPM内的设置值时,就得要知道利用SRPM的时候系统会动用到哪些重要的目录了!下面我们就来谈一谈当处理SRPM时系统会使用到的目录。

23.3.2 SRPM 使用的路径与需要的软件

SRPM 既然含有 source code,那么其中必定有设置文件,所以首先我们需要知道这个 SRPM 在进行编译的时候会使用到哪些目录,这样一来才能够来修改。你可以到你的/usr/src 这个目录里面去查看一下,通常每个 distribution 提供的目录都不太相同,以 CentOS 5.x 为例,它是以/usr/src/redhat/为工作目录,Openlinux则是以/usr/src/openlinux为工作目录!无论如何,反正就是在/usr/src这个目录下就对了!好了,既然我们是CentOS,请到/usr/src/redhat里头去看一看,如表23-8所示。

表23-8

figure_0692_0397

此外,在编译的过程当中,可能会发生不明的错误或者是设置的错误,这个时候就会在/tmp下面产生一个相对应的错误文档,你可以根据该错误文档进行除错的工作呢!等到所有的问题都解决之后,也编译成功了,那么刚才解压缩之后的文件就是在/usr/src/redhat/下的 SPECS、SOURCES、BUILD等的文件都会被杀掉,而只剩下放置在/usr/src/redhat/RPMS 下面的文件了!

由于SRPM需要重新编译,而编译的过程当中,我们至少需要有make与其相关的程序,及gcc、c、c++等其他的编译用的程序语言来进行编译,更多说明请参考第22章源代码所需基础软件。所以,如果你在安装的过程当中没有选择软件开发工具之类的软件,得重新拿出你的光盘,然后再安装,只是得要克服一大堆的属性依赖的问题就是了,这问题待会儿可以使用yum来处理,你当然也可以先使用“yum groupinstall "Development Tools"”来安装开发软件。鸟哥这里假设你已经安装了该软件组。

figure_0693_0398

尝试使用—rebuild 选项制作出一个 RPM 软件文件,可以到 http://ftp.twaren.net/Linux/CentOS/5/os/ SRPMS/下载rp-pppoe这个SRPM软件文件。鸟哥这里使用CentOS 5.3的rp-pppoe-3.5-32.1.src.rpm。

答:假设你已经将rp-pppoe软件下载到/root下面,那接下来可以简单使用下面的方式来重新编译:

[root@www ~]# rpmbuild —rebuild rp-pppoe-3.5-32.1.src.rpm

正在安装 rp-pppoe-3.5-32.1.src.rpm

警告:用户 mockbuild 不存在 - 现使用 root 代替

….(中间省略)….

已写入:/usr/src/redhat/RPMS/i386/rp-pppoe-3.5-32.1.i386.rpm

已写入:/usr/src/redhat/RPMS/i386/rp-pppoe-debuginfo-3.5-32.1.i386.rpm

正在执行 (%clean):/bin/sh -e /var/tmp/rpm-tmp.69789

  • umask 022

  • cd /usr/src/redhat/BUILD

  • cd rp-pppoe-3.5

  • rm -rf /var/tmp/rp-pppoe-3.5-32.1-root

  • exit 0

正在执行 (—clean):/bin/sh -e /var/tmp/rpm-tmp.69789

  • umask 022

  • cd /usr/src/redhat/BUILD

  • rm -rf rp-pppoe-3.5

  • exit 0

[root@www ~]# ll /usr/src/redhat/RPMS/i386/

-rw-r—r— 1 root root 105443 6月 27 02:51 rp-pppoe-3.5-32.1.i386.rpm

-rw-r—r— 1 root root 18756 6月 27 02:51 rp-pppoe-debuginfo-3.5-32.1.i386.rpm

其实整个过程与Tarball的方式差不多,也是编译后变成二进制程序,接着再以RPM的机制封装起来。重点在上面特殊字体的部分,记得要查看一下。若一切正常,则会看到 exit0 的字样,且会主动删除(rm)很多临时文件。

23.3.3 设置文件的主要内容(*.spec)

除了使用SRPM内默认的参数来进行编译之外,我们还可以修改这些参数后再重新编译。那该如何处理呢?首先我们必须要将SRPM内的文件安置到/usr/src/redhat/内的相关目录,然后再去修改设置文件即可。我们就拿刚才上面那个rp-pppoe来说明好了,假设我们已经将该文件放置到/root中,然后:

[root@www ~]# rpm -i rp-pppoe-3.5-32.1.src.rpm

过程不会显示任何东西,它只会将 SRPM 的文件解开后放置到 /usr/src/redhat/下

[root@www ~]# find /usr/src/redhat/ -type f

/usr/src/redhat/SOURCES/rp-pppoe-3.5-firewall.patch <==补丁文件

/usr/src/redhat/SOURCES/adsl-stop    <==CentOS 提供的脚本

/usr/src/redhat/SOURCES/rp-pppoe-3.5.tar.gz  <==源代码

/usr/src/redhat/SOURCES/rp-pppoe-3.5-buildroot.patch <==补丁文件

/usr/src/redhat/SOURCES/adsl-start    <==CentOS 提供的脚本

/usr/src/redhat/SOURCES/adsl-connect

/usr/src/redhat/SOURCES/adsl-setup

/usr/src/redhat/SOURCES/adsl-status

/usr/src/redhat/SOURCES/rp-pppoe-3.4-redhat.patch <==补丁文件

/usr/src/redhat/SPECS/rp-pppoe.spec    <==重要设置文件

主要含有源代码与一个重要的设置文件rp-pppoe.spec !

好了,来看看我们的设置参数文件,即是在/usr/src/redhat/SPECS内的*.spec文件。

[root@www ~]# cd /usr/src/redhat/SPECS

[root@www SPECS]# vi rp-pppoe.spec

1. 首先,这个部分介绍整个软件的基本相关信息,不论是版本还是发布次数等

Summary: A PPP over Ethernet client (for xDSL support).

Name: rp-pppoe

Version: 3.5

Release: 32.1

License: GPL

Group: System Environment/Daemons

Url: http://www.roaringpenguin.com/pppoe/

Source: http://www.roaringpenguin.com/rp-pppoe-%{version}.tar.gz

Source1: adsl-connect

Source2: adsl-setup

….(中间省略)….

2. 这部分则是设置依赖属性需求的地方

BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root

Prereq: /sbin/chkconfig <==需要的前驱程序有哪些

Prereq: /sbin/service

Prereq: fileutils

Requires: ppp >= 2.4.2  <==需要的软件又有哪些

Requires: initscripts >= 5.92

Requires: iproute >= 2.6

BuildRequires: libtool <==还需要哪些工具软件

BuildRequires: autoconf

BuildRequires: automake

%description   <==此软件的描述

PPPoE (Point-to-Point Protocol over Ethernet) is a protocol used by

many ADSL Internet Service Providers. This package contains the

Roaring Penguin PPPoE client, a user-mode program that does not

require any kernel modifications. It is fully compliant with RFC 2516,

the official PPPoE specification.

3. 编译前的预处理以及编译过程当中所需要进行的命令都写在这里

 尤其 %build 下面的数据,几乎就是 makefile 里面的信息。

%prep <==这部分在预先 (pre) 进行处理,大致就是 patch 软件。

%setup -q

%patch0 -p1 -b .config

%patch1 -p1 -b .buildroot

%patch2 -p1 -b .ipchains

%build <==这部分就是在实际编译。

cd src

autoconf

CFLAGS="-D_GNU_SOURCE" %configure

make

install -m 0755 %{SOURCE1} scripts

install -m 0755 %{SOURCE2} scripts

install -m 0755 %{SOURCE3} scripts

install -m 0755 %{SOURCE4} scripts

install -m 0755 %{SOURCE5} scripts

%install <==这就是安装过程!

rm -rf %{buildroot}

mkdir -p %{buildroot}/sbin

make -C src install RPM_INSTALL_ROOT=%{buildroot}

….(中间省略)….

4. 这里列出这个软件发布的文件有哪些

%files <==这个软件发布的文件有哪些,需要记录在数据库内

%defattr(-,root,root)

%doc doc/LICENSE scripts/adsl-connect scripts/adsl-setup scripts/adsl-init

%doc scripts/adsl-start scripts/adsl-status scripts/adsl-stop

%doc configs

%config(noreplace) %{_sysconfdir}/ppp/pppoe-server-options

%config(noreplace) %{_sysconfdir}/ppp/firewall*

/sbin/*

%{_sbindir}/*

%{_mandir}/man?/*

5. 列出这个软件的更改历史记录文件

%changelog

  • Wed Jul 12 2006 Jesse Keating <jkeating@redhat.com> - 3.5-32.1
  • rebuild

….(中间省略)….

  • Wed May 31 2000 Than Ngo <than@redhat.de>
  • adopted for Winston.

要注意到的是rp-pppoe.sepc这个文件,这是主要将SRPM编译成RPM的设置文件,它的基本规则可以这样看:

1.整个文件的开头以Summary为开始,这部分的设置都是最基础的说明内容;

2.然后每个不同的段落之间都以%来作为开头,例如%prep与%install等。

我们来谈一谈几个常见的SRPM设置段落:

系统整体信息方面

刚才你看到的就有下面这些重要的内容,如表23-9所示。

表23-9

figure_0695_0399

上面几个数据通常都必须要写。但是如果你的软件没有依赖属性的关系时,那么就可以不需要那个 Requires。根据上面的设置,最终的文件名就会是“{Name}-{Version}-{Release}.{ExclusiveArch}.rpm”的样子,以我们上面的设置来说,文件名应该会是“rp-pppoe-3.5- 32.2. vbird.i686.rpm”的样子。

%description

将你的软件做一个简短的说明。这个也是必需的。还记得使用“rpm-qi 软件名称”会出现一些基础的说明吗?上面这些东西包括Description就是显示这些重要信息的。所以,这里记得要详加解释。

%prep

pre这个关键字原本就有“在⋯⋯之前”的意思,因此这个项目在这里指的就是尚未进行设置或安装之前你要编译完成的RPM帮你事先做的事情,就是prepare的简写。那么它的工作事项主要有:

1.进行软件的补丁(patch)等相关工作;

2.寻找软件所需要的目录是否已经存在,确认用的;

3.事先新建你的软件所需要的目录,或者事先需要进行的任务;

4.如果待安装的Linux系统内已经有安装的时候可能会被覆盖掉的文件时,那么就需要进行备份(backup)的工作了!

在本例中,你会发现程序会使用patch去进行补丁的操作。

%setup

这个选项就是在进行类似解压缩之类的工作。这个选项一定要写。不然你的 tarball 源代码是无法被解压缩的。切记切记!

%build

build 就是创建。所以当然这个段落就是在谈怎么编译成为可执行的程序。你会发现此部分的程序代码方面就是./configure、make等选项。

%install

编译完成( build )之后就是要安装。安装就是写在这里,也就是类似 Tarball 里面的makeinstall的意思。

%clean

编译与安装完毕后,必须要将一些暂存在BuildRoot内的数据删除才好,因此这个时候这个clean 的项目就重要。这有点像是 make clean 的感觉,保持系统的清爽嘛!

%files

这个软件安装的文件都需要写到这里来,当然包括了“目录”。所以连同目录请一起写到这个段落当中,以备查验呢!此外,你也可以指定每个文件的类型,包括文档(%doc后面接的)与设置文件(%config后面接的)等。

%changelog

这个选项主要则是在记录这个软件曾经的更新记录。星号(*)后面应该要以时间、修改者、email 与软件版本来作为说明,减号(-)后面则是你要做的详细说明。在这部分鸟哥就新增了两行,内容如下:

%changelog

  • Wed Jul 01 2009 VBird Tsai <vbird@mail.vbird.idv.tw> - 3.5-32.2.vbird
  • only rebuild this SRPM to RPM
  • Wed Jul 12 2006 Jesse Keating <jkeating@redhat.com> - 3.5-32.1

….(下面省略)….

修改到这里也差不多了,你也应该要了解到这个 rp-pppoe.spec 有多么重要!我们用 rpm-q去查询一堆信息时,其实都是在这里写入的。这样了解否?接下来,就让我们来了解一下如何将SRPM编译出RPM来吧!

23.3.4 SRPM 的编译命令(-ba/-bb)

要将在/usr/src/redhat下面的数据编译或者是单纯打包成为RPM或SRPM时,就需要rpmbuild命令与相关选项的帮忙了!我们只介绍两个常用的参数给你了解一下:

[root@www ~]# rpmbuild -ba rp-pppoe.spec <==编译并同时生成 RPM 与 SRPM 文件

[root@www ~]# rpmbuild -bb rp-pppoe.spec <==仅编译成 RPM 文件

这个时候系统就会这样做:

1.先进入到BUILD这个目录中,即是/usr/src/redhat/BUILD这个目录;

2.依照*.spec文件内的Name与Version定义出工作的目录名称,以我们上面的例子为例,那么系统就会在BUILD目录中先删除rp-pppoe-3.5的目录,再重新建立一个rp-pppoe-3.5的目录,并进入该目录;

3.在新建的目录里面,针对SOURCES目录下的源文件,也就是*.spec里面的Source设置的那个文件,以tar进行解压缩,以我们这个例子来说,则会在/usr/src/redhat/BUILD/rp-pppoe-3.5当中将/usr/src/redhat/SOURCES/rp-pppoe-3.5.tar.gz进行解压缩;

4.再来开始%build 及%install 的设置与编译;

5.最后将完成打包的文件放置到该放置的地方去,如果你规定的硬件是在i386的系统,那么最后编译成功的*.i386.rpm 文件就会被放置在/usr/src/redhat/RPMS/i386 里面。如果是i686那么自然就是/usr/src/redhat/RPMS/i686目录下。

整个步骤大概就是这样子!最后的结果数据会放置在RPMS那个目录下面就对。我们这个例子中想要同时打包 RPM 与 SRPM,因此请你自行处理一下“rpmbuild-ba rp-pppoe.spec”。

[root@www ~]# cd /usr/src/redhat/SPECS

[root@www SPECS]# rpmbuild -ba rp-pppoe.spec

….(以上省略)….

正在处理文件:rp-pppoe-debuginfo-3.5-32.2.vbird

已写入:/usr/src/redhat/SRPMS/rp-pppoe-3.5-32.2.vbird.src.rpm

已写入:/usr/src/redhat/RPMS/i386/rp-pppoe-3.5-32.2.vbird.i386.rpm

已写入:/usr/src/redhat/RPMS/i386/rp-pppoe-debuginfo-3.5-32.2.vbird.i386.rpm

正在执行 (%clean):/bin/sh -e /var/tmp/rpm-tmp.10628

  • umask 022

  • cd /usr/src/redhat/BUILD

  • cd rp-pppoe-3.5

  • rm -rf /var/tmp/rp-pppoe-3.5-32.2.vbird-root

  • exit 0

[root@www SPECS]# find /usr/src/redhat -name 'rp-pppoe*rpm'

/usr/src/redhat/RPMS/i386/rp-pppoe-3.5-32.2.vbird.i386.rpm

/usr/src/redhat/RPMS/i386/rp-pppoe-debuginfo-3.5-32.2.vbird.i386.rpm

/usr/src/redhat/SRPMS/rp-pppoe-3.5-32.2.vbird.src.rpm

上面分别是 RPM 与 SRPM 的文件名!

老实说,应该会出现i686的文件名才对。不过,可能是源代码本身没有支持i686之类的语法吧!所以仅出现i386的文件名而已。另外,你可以看到文件名确实是如同我们之前谈到的。那你可以自行制作出有你特殊名称的文件名(例如上面的vbird)。

23.3.5 一个打包自己软件的范例

这个就有趣了!我们自己来编辑一下自己制作的 RPM 怎么样?会很难吗?完全不会!我们这里就举个例子来玩玩吧!还记得我们在前一章谈到Tarball与make时曾经谈到的main这个程序吗?现在我们将这个程序加上Makefile后,将它制作成为main-0.1.i386.rpm,该如何进行呢?下面就让我们来处理处理吧!

制作源代码文件tarball生成

请将前一章你曾经处理过的main.tgz再次找来,我们将这个文件放置到/root下面,并且在/usr/local/src下面新建一个名为main-0.1的目录来解压缩。

[root@www ~]# mkdir /usr/local/src/main-0.1

[root@www ~]# tar -zxvf main.tgz -C /usr/local/src/main-0.1

[root@www ~]# cd /usr/local/src/main-0.1

[root@www main-0.1]# vim Makefile <==新建源代码所需的 make 规则

LIBS = -lm

OBJS = main.o haha.o sin_value.o cos_value.o

main: ${OBJS}

gcc -o main ${OBJS} ${LIBS}

clean:

rm -f main ${OBJS}

install:

install -m 755 main $(RPM_INSTALL_ROOT)/usr/local/bin/main

记得 gcc 与 rm 之前是使用 <tab> 按键生成的空白。

[root@www main-0.1]# cd ..

[root@www src]# tar -zcvf main-0.1.tar.gz main-0.1

此时会产生 main-0.1.tar.gz ,将它挪到 /usr/src/redhat/SOURCES 下面:

[root@www src]# cp main-0.1.tar.gz /usr/src/redhat/SOURCES

这个时候在/usr/src/redhat下面的源代码就新建成功了!接下来就是spec文件的创建。

新建*.spec的设置文件

这个文件的生成是所有RPM制作里面最重要的课题!你必须要仔细设置它,不要随便处理。仔细看看吧!

[root@www ~]# cd /usr/src/redhat/SPECS

[root@www SPECS]# vim main.spec

Summary: calculate sin and cos value.

Name: main

Version: 0.1

Release: 1

License: GPL

Group: VBird's Home

Source: main-0.1.tar.gz <==记得要写正确的 Tarball 文件名。

Url:  http://linux.vbird.org

Packager: VBird

BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root

%description

This package will let you input your name and calculate sin cos value.

%prep

%setup -q

%build

make

%install

rm -rf %{buildroot}

mkdir -p %{buildroot}/usr/local/bin

make install RPM_INSTALL_ROOT=%{buildroot} <==这项目也很重要!

%files

/usr/local/bin/main

%changelog

  • Wed Jul 01 2009 VBird Tsai <vbird@mail.vbird.idv.tw> 0.1
  • build the program

编译成为RPM与SRPM

老实说,spec文件生成妥当后,后续的操作很简单,开始来编译吧!

[root@www SPECS]# rpmbuild -ba main.spec

….(前面省略)….

已写入:/usr/src/redhat/SRPMS/main-0.1-1.src.rpm

已写入:/usr/src/redhat/RPMS/i386/main-0.1-1.i386.rpm

已写入:/usr/src/redhat/RPMS/i386/main-debuginfo-0.1-1.i386.rpm

很快,我们就已经新建了几个RPM文件。接下来让我们好好测试一下打包起来的成果吧!

安装/测试/实际查询

[root@www ~]# rpm -ivh /usr/src/redhat/RPMS/i386/main-0.1-1.i386.rpm

正在准备…   ########################################### [100%]

1:main    ########################################### [100%]

[root@www ~]# rpm -ql main

/usr/local/bin/main <==自己尝试执行 main 看看!

[root@www ~]# rpm -qi main

Name  : main   Relocations: (not relocatable)

Version : 0.1    Vendor: (none)

Release : 1    Build Date: 公元2009年07月02日 (周四)

Install Date: 公元2009年07月02日 Build Host: www.vbird.tsai

Group  : VBird's Home  Source RPM: main-0.1-1.src.rpm

Size  : 3360    License: GPL

Signature : (none)

Packager : VBird

URL  : http://linux.vbird.org

Summary : calculate sin and cos value.

Description :

This package will let you input your name and calculate sin cos value.

看到没?属于你自己的软件。真是很愉快的!

用很简单的方式就可以将自己的软件或者程序修改与设置妥当!以后你就可以自行设置你的RPM。当然,也可以手动修改你的SRPM的源文件内容。

23.4 YUM 在线升级机制

我们在本章一开始的地方谈到过yum这玩意,这个yum是通过分析RPM的标题数据后,根据各软件的相关性制作出属性依赖时的解决方案,然后可以自动处理软件的依赖属性问题,以解决软件安装或删除与升级的问题。详细的yum服务器与客户端之间的通信,可以再回到前面的部分查阅一下图23-1的说明。

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

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

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

yum的使用真是非常简单,就是通过yum这个命令。那么这个命令怎么用呢?用法很简单,就让我们来简单的谈谈:

查询功能:yum [list|info|search|provides|whatprovides]参数

如果想要查询利用yum来查询原版distribution所提供的软件或已知某软件的名称,想知道该软件的功能,可以利用yum相关的参数为:

[root@www~]# yum [option] [查询工作项目] [相关参数]

参数:

[option]:主要的参数,包括有:

-y :当 yum 要等待用户输入时,这个选项可以自动提供 yes 的响应;

—installroot=/some/path :将该软件安装在 /some/path 中而不使用默认路径

[查询工作项目] [相关参数]:这方面的参数有:

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

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

info :同上,不过有点类似于 rpm -qai 的运行结果;

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

范例一:搜索磁盘阵列 (raid) 相关的软件有哪些

[root@www ~]# yum search raid

….(前面省略)….

mdadm.i386 : mdadm controls Linux md devices (software RAID arrays)

lvm2.i386 : Userland logical volume management tools

….(后面省略)….

在冒号 (:) 左边的是软件名称,右边的则是在 RPM 内的 name 设置 (软件名)

瞧!上面的结果这不就是与 RAID 有关的软件吗?如果想了解 mdadm 的软件内容呢?

范例二:找出 mdadm 这个软件的功能为何

[root@www ~]# yum info mdadm

Installed Packages <==这说明该软件是已经安装的了

Name : mdadm  <==这个软件的名称

Arch : i386  <==这个软件的编译架构

Version: 2.6.4  <==此软件的版本

Release: 1.el5  <==发布的版本

Size : 1.7 M  <==此软件的文件总容量

Repo : installed <==容器回报说已安装的

Summary: mdadm controls Linux md devices (software RAID arrays)

Description:   <==看到否?这就是 rpm -qi 嘛!

mdadm is used to create, manage, and monitor Linux MD (software RAID)

devices. As such, it provides similar functionality to the raidtools

package. However, mdadm is a single program, and it can perform

almost all functions without a configuration file, though a configuration

file can be used to help with some common tasks.

不要跟我说,上面说了些什么?自己找字典翻一翻吧!

范例三:列出 yum 服务器上面提供的所有软件名称

[root@www ~]# yum list

Installed Packages <==已安装软件

Deployment_Guide-en-US.noarch   5.2-9.el5.centos  installed

Deployment_Guide-zh-CN.noarch   5.2-9.el5.centos  installed

Deployment_Guide-zh-TW.noarch   5.2-9.el5.centos  installed

….(中间省略)….

Available Packages <==还可以安装的其他软件

Cluster_Administration-as-IN.noarch 5.2-1.el5.centos  base

Cluster_Administration-bn-IN.noarch 5.2-1.el5.centos  base

….(下面省略)….

上面提供的意义为:“ 软件名称 版本 在哪个容器内 ”

范例四:列出目前服务器上可供本机进行升级的软件有哪些

[root@www ~]# yum list updates <==一定要是 updates 。

Updated Packages

Deployment_Guide-en-US.noarch   5.2-11.el5.centos base

Deployment_Guide-zh-CN.noarch   5.2-11.el5.centos base

Deployment_Guide-zh-TW.noarch   5.2-11.el5.centos base

….(下面省略)….

上面就列出在哪个容器内可以提供升级的软件与版本!

范例五:列出提供 passwd 这个文件的软件有哪些

[root@www ~]# yum provides passwd

passwd.i386 : The passwd utility for setting/changing passwords using PAM

passwd.i386 : The passwd utility for setting/changing passwords using PAM

找到。就是上面的这个软件提供了 passwd 这个程序!

通过上面的查询,你应该大致知道yum如何用在查询上面了吧?那么实际来应用一下。

figure_0701_0400

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

答:可以通过如下的方法来查询:

[root@www ~]# yum list pam*

Installed Packages

pam.i386    0.99.6.2-3.27.el5 installed

pam_ccreds.i386  3-5    installed

pam_krb5.i386   2.2.14-1   installed

pam_passwdqc.i386  1.0.2-1.2.2   installed

pam_pkcs11.i386  0.5.3-23   installed

pam_smb.i386   1.1.7-7.2.1   installed

Available Packages <==下面则是“可升级”的或“未安装”的

pam.i386    0.99.6.2-4.el5  base

pam-devel.i386   0.99.6.2-4.el5  base

pam_krb5.i386   2.2.14-10   base

如上所示,所以可升级者有pam, pam_krb5这两个软件,完全没有安装的则是pam-devel这个软件。

安装/升级功能:yum[install|update] 软件

既然可以查询,那么安装与升级呢?很简单。就利用install与update这两项工作来处理即可。

[root@www ~]# yum [option] [查询工作项目] [相关参数]

参数:

install :后面接要安装的软件!

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

范例一:将前一个练习找到的未安装的 pam-devel 安装起来

[root@www ~]# yum install pam-devel

Setting up Install Process

Parsing package install arguments

Resolving Dependencies <==先检查软件的属性依赖问题

—> Running transaction check

—-> Package pam-devel.i386 0:0.99.6.2-4.el5 set to be updated

—> Processing Dependency: pam = 0.99.6.2-4.el5 for package: pam-devel

—> Running transaction check

—-> Package pam.i386 0:0.99.6.2-4.el5 set to be updated

filelists.xml.gz  100% |=========================| 1.6 MB 00:05

filelists.xml.gz  100% |=========================| 138 kB 00:00

-> Finished Dependency Resolution

Dependencies Resolved

===========================================================================

Package    Arch  Version  Repository  Size

===========================================================================

Installing:

pam-devel   i386  0.99.6.2-4.el5 base   186 k

Updating:

pam    i386  0.99.6.2-4.el5 base   965 k

Transaction Summary

===========================================================================

Install 1 Package(s) <==结果发现要安装此软件需要升级另一个依赖的软件

Update  1 Package(s)

Remove  0 Package(s)

Total download size: 1.1 M

Is this ok [y/N]: y <==确定要安装!

Downloading Packages: <==先下载!

(1/2): pam-0.99.6.2-4.el5 100% |=========================| 965 kB 00:05

(2/2): pam-devel-0.99.6.2 100% |=========================| 186 kB 00:01

Running rpm_check_debug

Running Transaction Test

Finished Transaction Test

Transaction Test Succeeded

Running Transaction <==开始安装!

Updating : pam      ######################### [1/3]

Installing: pam-devel    ######################### [2/3]

Cleanup : pam      ######################### [3/3]

Installed: pam-devel.i386 0:0.99.6.2-4.el5

Updated: pam.i386 0:0.99.6.2-4.el5

Complete!

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

删除功能:yum [remove]软件

那能不能用yum删除软件呢?将刚才的软件删除看看,会出现什么状况呢?

[root@www ~]# yum remove pam-devel

Setting up Remove Process

Resolving Dependencies <==同样,先解决属性依赖的问题

—> Running transaction check

—-> Package pam-devel.i386 0:0.99.6.2-4.el5 set to be erased

—> Finished Dependency Resolution

Dependencies Resolved

===========================================================================

Package    Arch  Version  Repository  Size

===========================================================================

Removing:

pam-devel   i386  0.99.6.2-4.el5 installed  495 k

Transaction Summary

===========================================================================

Install 0 Package(s)

Update  0 Package(s)

Remove  1 Package(s) <==还好,并没有属性依赖的问题,单纯删除一个软件

Is this ok [y/N]: y

Downloading Packages:

Running rpm_check_debug

Running Transaction Test

Finished Transaction Test

Transaction Test Succeeded

Running Transaction

Erasing : pam-devel    ######################### [1/1]

Removed: pam-devel.i386 0:0.99.6.2-4.el5

Complete!

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

23.4.2 yum 的设置文件

虽然yum是你的主机能够联网就可以直接使用的,不过,由于CentOS的镜像站点可能会选错,举例来说,我们在北京,但是CentOS的镜像站点却选择到了台湾地区或者是日本,有没有可能发生。有啊!鸟哥教学方面就经常发生这样的问题,要知道,我们联网到台湾地区或日本的速度是非常慢的!那怎办?当然就是手动修改一下yum的设置文档就好。

如果你连接到CentOS的镜像站点(如ftp.twaren.net/Linux/CentOS/51)后,就会发现里面有一堆链接,那些链接就是这个yum服务器所提供的容器了,包括addons、centosplus、extras、fasttrack、os、updates 等容器,最好认的容器就是 os(系统默认的软件)与 updates(软件升级版本)。由于鸟哥我的测试用机是利用i386的版本,因此那个os再点进去就会得到如下的可提供安装的网址:

http://ftp.twaren.net/Linux/CentOS/5/os/i386/

为什么在上述的网址内呢?有什么特色!最重要的特色就是那个“repodata”的目录。该目录就是分析 RPM 软件后所产生的软件属性依赖数据放置处。因此,当你要找容器所在网址时,最重要的就是该网址下面一定要有个名为repodata的目录存在,那就是容器的网址了。其他的容器正确网址,就请各位读者自行寻找一下。现在让我们修改设置文件吧!

[root@www ~]# vi /etc/yum.repos.d/CentOS-Base.repo

[base]

name=CentOS-$releasever - Base

mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os

baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/

gpgcheck=1

gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5

如上所示,鸟哥仅列出 base 这个容器内容而已,其他的容器内容请自行查阅。上面的数据需要注意的是:

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

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

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

baseurl=:这个最重要,因为后面接的就是容器的实际网址。mirrorlist是由yum程序自行去找镜像站点,baseurl则是指定固定的一个容器网址。我们刚才找到的网址放到这里来。

enable=1:就是让这个容器被启动。如果不想启动可以使用enable=0。

gpgcheck=1:还记得RPM的数字证书吗?这就是指定是否需要查阅RPM文件内的数字证书。

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

了解这个设置文件之后,接下来让我们修改整个文件的内容,让我们这台主机可以直接使用ftp.twaren.net的资源吧!修改的方式鸟哥仅列出base这个容器项目而已,其他的选项请你自行依照上述的做法来处理即可!

[root@www ~]# vi /etc/yum.repos.d/CentOS-Base.repo

[base]

name=CentOS-$releasever - Base

baseurl=http://ftp.twaren.net/Linux/CentOS/5/os/i386/

gpgcheck=1

gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5

下面其他的容器项目,请自行到ftp.twaren.net去查询后自己处理!

接下来当然就是测试一下。如何测试呢?再次使用yum即可。

范例一:列出目前 yum server 所使用的容器有哪些

[root@www ~]# yum repolist all

repo id  repo name    status

addons  CentOS-5 - Addons  enabled

base   CentOS-5 - Base   enabled

c5-media  CentOS-5 - Media  disabled

centosplus CentOS-5 - Plus   disabled

extras  CentOS-5 - Extras  enabled

updates  CentOS-5 - Updates  enabled

上面最右边有写 enabled 才是有激活的!由于 /etc/yum.repos.d/

有多个设置文件,所以你会发现还有其他的容器存在。

修改容器产生的问题与解决之道

由于我们是修改系统默认的设置文件,事实上,我们应该要在/etc/yum.repos.d/下面新建一个文件,该扩展名必须是.repo才行!但因为我们使用的是指定特定的镜像站点,而不是其他软件开发生提供的容器,因此才修改系统默认设置文件。但是可能由于使用的容器版本有新旧之分,你得要知道,yum 会先下载容器的清单到本机的/var/cache/yum 里面去!那我们修改了网址却没有修改容器名称(中括号内的文字),可能就会造成本机的列表与yum服务器的列表不同步,此时就会出现无法更新的问题了!

那怎么办啊?很简单,就清除掉本机上面的旧数据即可。需要手动处理吗?不需要的,通过yum的clean参数来处理即可。

[root@www ~]# yum clean [packages|headers|all]

参数:

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

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

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

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

[root@www ~]# yum clean all

23.4.3 yum 的软件组功能

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

[root@www ~]# yum [组功能] [软件组]

参数:

grouplist :列出所有可使用的组列表,例如 Development Tools 之类的;

groupinfo :后面接 group_name,则可了解该 group 内含的所有组名称;

groupinstall:这个好用!可以安装一整组的软件,相当不错!

groupremove :删除某个组。

范例一:查看目前容器与本机上面的可用与安装过的软件组有哪些

[root@www ~]# yum grouplist

Installed Groups:

Office/Productivity

Editors

System Tools

….(中间省略)….

Available Groups:

Tomboy

Cluster Storage

Engineering and Scientific

….(以下省略)….

你会发现系统上面的软件大多是组的方式一口气来提供安装的!还记得全新安装CentOS时,不是可以选择所需要的软件吗?而那些软件不是利用GNOME/KDE/X Window之类的名称存在吗?其实那就是软件组。如果你执行上述的命令后,在“Available Groups”下面应该会看到一个“XFCE-4.4”的软件组,想知道那是什么吗?就这样做:

[root@www ~]# yum groupinfo XFCE-4.4

Setting up Group Process

Group: XFCE-4.4

Description: This group contains the XFCE desktop environment.

Mandatory Packages:

xfce4-session

….(中间省略)….

Default Packages:

xfce4-websearch-plugin

….(中间省略)….

Optional Packages:

xfce-mcs-manager-devel

xfce4-panel-devel

….(以下省略)….

你会发现那就是一个桌面环境(desktop environment),也就是一个窗口管理器。至于下面就列出主要的与选择性(optional)的软件名称。让我们直接安装看看:

[root@www~]# yum groupinstall XFCE-4.4

你会发现系统进行了一大堆软件的安装!那就是整个安装XFCE这个窗口接口所需的所有软件!这个东东真是非常方便呢!这个功能请一定要记下来,对你未来安装软件是非常有帮助的。

23.4.4 全系统自动升级

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

[root@www ~]# vim /etc/crontab

….(前面省略并保留设置值)….

0 3 * root /usr/bin/yum -y update

从此你的系统就会自动升级。很棒吧!此外,你还是得要分析登录文件与收集root的信件的,因为如果升级的是内核软件(kernel),那么你还是得要重新开机才会让安装的软件顺利运行的!所以还是得分析日志文件,若有新内核安装,就重新开机,否则就让系统自动维持在最新较安全的环境吧!真是轻松愉快的管理啊!

23.5 管理的抉择:RPM 还是Tarball

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

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

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

2.选择软件官方网站发布的RPM或者是提供的容器网址

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

3.利用Tarball安装特殊软件

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

4.用Tarball测试新版软件

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

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

23.6 重点回顾

为了避免用户自行编译的困扰,开发商自行在特定的硬件与操作系统平台上面预编译好软件,并将软件以特殊格式打包成文件,提供给终端用户直接安装到固定的操作系统上,并提供简单的查询/安装/删除等流程。此称为软件管理器。常见的两大主流软件管理器有RPM与DPKG。

RPM 的全名是 Red Hat Package Manager,原本是由 Red Hat 公司所开发的,流传甚广。

RPM类型的软件中,所含有的软件是经过编译后的二进制程序,所以可以直接安装在用户端的系统上,不过,也由于如此,所以RPM对于安装者的环境要求相当严格。

RPM除了将软件安装至用户的系统上之外,还会将该软件的版本、名称、文件与目录配置、系统需求等均记录于数据库(/var/lib/rpm)当中,方便未来的查询与升级、删除。

RPM可针对不同的硬件等级来加以编译,制作出来的文件可于扩展名(i386、i586、i686、x86_64)来分辨。

RPM最大的问题为软件之间的依赖性问题。

SRPM 为 Source RPM,内含的文件为源代码而非为二进制文件,所以安装 SRPM 时还需要经过编译,不过,SRPM最大的优点就是可以让用户自行修改设置参数(makefile/configure的参数),以符合用户自己的Linux环境。

RPM软件的属性依赖问题已经可以通过yum或者是APT等方式加以解决。CentOS使用的就是yum机制。

yum服务器提供多个不同的容器放置不同的软件,以提供客户端分别管理软件类型。

23.7 本章习题

情境模拟题一

实际安装 php, php-mysql, php-devel, httpd-devel 等软件的方式:

目标:利用rpm查询软件是否已安装,利用yum进行在线查询;

目标:你的Linux必须要已经接上Internet才行;

需求:最好了解磁盘容量是否够用,以及如何启动服务等。

这个模拟题的目的是想要安装一套较为完整的WWW服务器,并且此服务器可以支持外挂的其他网页服务器模块。所以需要安装的就会有网页程序语言php与数据库软件MySQL,以及未来开发用的php-devel,httpd-devel等软件。整个流程会有点像这样:

1.检查所需要的软件是否存在,最好直接使用rpm,因为可以直接取得RPM的数据库内容:

[root@www ~]# rpm -q httpd httpd-devel php php-devel php-mysql

httpd-2.2.3-22.el5.centos

package httpd-devel is not installed <==没有安装的软件!

php-5.1.6-23.el5

package php-devel is not installed <==没有安装的软件!

package php-mysql is not installed <==没有安装的软件!

经过上面的分析,我们知道httpd-devel、php-devel、php-mysql等软件并没有安装,那么该如何安装可以使用yum直接在线安装?不过我们必须要先有网络才行!

2.确认网络的可行性:

[root@www ~]# ifconfig eth0

eth0 Link encap:Ethernet HWaddr 08:00:27:11:3B:75

inet addr:192.168.201.201 Bcast:192.168.201.255 Mask:255.255.255.0

….(下面省略)….

你可以看到我们的主机是有 IP 存在的!再来看看有没有路由设置存在

[root@www ~]# route -n

Kernel IP routing table

Destination Gateway  Genmask  Flags Metric Ref Use Iface

192.168.201.0 0.0.0.0  255.255.255.0 U 0 0  0 eth0

0.0.0.0  192.168.201.254 0.0.0.0  UG 0 0  0 eth0

确实是有路由器 (Gateway) 存在的!那么该路由器是否设置正确呢?

[root@www ~]# ping -c 2 192.168.201.254

PING 192.168.201.254 (192.168.201.254) 56(84) bytes of data.

64 bytes from 192.168.201.254: icmp_seq=1 ttl=64 time=0.325 ms

64 bytes from 192.168.201.254: icmp_seq=2 ttl=64 time=0.281 ms

路由器有回应!表示可以连接到路由器!那么 TCP/IP 设好了,

但是域名服务器 (DNS) 该如何处理?

[root@www ~]# dig www.google.com

; <<>> DiG 9.3.4-P1 <<>> www.google.com

;; global options: printcmd

….(中间省略)….

;; QUESTION SECTION:

;www.google.com.     IN A

….(中间省略)….

;; ANSWER SECTION:

www.google.com.  522933 IN CNAME www.l.google.com.

www.l.google.com.  107 IN A  72.14.203.103

….(中间省略)….

;; Query time: 5 msec

;; SERVER: 120.114.150.1#53(120.114.150.1)

;; WHEN: Fri Sep 18 13:14:45 2009

;; MSG SIZE rcvd: 340

确实有查到 Google 的 IP ,且是由 120.114.150.1 那部 DNS 主机帮忙解析的!

3.网络设置妥当之后,那我们就能够直接使用yum。可以这样直接进行安装的:

[root@www ~]# yum install httpd httpd-devel php php-devel php-mysql

然后接着一步一步进行安装即可。

简答题部分

如果你曾经修改过 yum 设置文件内的容器设置(/etc/yum.repos.d/*.repo),导致下次使用 yum进行安装时老是发现错误,此时你该如何是好?

简单说明RPM与SRPM的异同。

假设我想要安装一个软件,例如 pkgname.i386.rpm,但却老是发生无法安装的问题,请问我可以加入哪些参数来强制安装它?

承上题,你认为强制安装之后该软件是否可以正常执行?为什么?

有些人使用 OpenLinux 3.1 Server 安装在自己的 P-166 MMX,却发现无法安装,在查看了该原版光盘的内容后,发现里面的文件名称为*.i686.rpm。请问无法安装的可能原因为何?

请问我使用 rpm -Fvh .rpm 及 rpm -Uvh .rpm 来升级时两者有何不同?

假设有一个厂商推出软件时,自行处理了数字证书,你想要安装他们的软件所以需要使用数字证书,假设数字证书的文件名为signe,那你该如何安装?

承上,假设该软件厂商提供了 yum 的安装网址为 http://their.server.name/path/ ,那你该如何处理yum的设置文件?

23.8 参考数据与扩展阅读

RPM包装文件管理程序:http://www.study-area.org/tips/rpm.htm

中文 RPM HOW-TO:http://www.linux.org.tw/CLDP/RPM-HOWTO.html

RPM的使用:http://linux.tnc.edu.tw/techdoc/rpm-howto.htm

大家来作RPM:http://freebsd.ntu.edu.tw/bsd/4/3/2/29.html

一本RPM的原文书:http://linux.tnc.edu.tw/techdoc/maximum-rpm/rpmbook/