鸟哥的 Linux 私房菜
为取得较佳浏览结果,请爱用 firefox 浏览本网页
目录 | Linux 基础文件 | Linux 架站文件 | Linux 企业运用 | 新手讨论 |
     
 
第二十三章、软体安装: RPM, SRPM YUM 功能
最近更新日期:2009/09/18
虽然使用原始码进行软体编译可以具有客制化的设定,但对于 Linux distribution 的发布商来说,则有软体管理不易的问题, 毕竟不是每个人都会进行原始码编译的。如果能够将软体预先在相同的硬体与作业系统上面编译好才发布的话, 不就能够让相同的 distribution 具有完全一致的软体版本吗?如果再加上简易的安装/移除/管理等机制的话, 对于软体控管就会简易的多。有这种东西吗?有的,那就是 RPM 与 YUM 这两个好用的咚咚。 既然这么好用,我们当然不能错过学习机会啰!赶紧来参详参详!


大标题的图示软体管理员简介

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

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

那么如果在安装的时候还可以加上一些与这些程式相关的资讯,将他建立成为资料库,那不就可以进行安装、反安装、 升级与验证等等的相关功能啰 (类似 Windows 底下的‘新增移除程式’)?确实如此,在 Linux 上面至少就有两种常见的这方面的软体管理员,分别是 RPM 与 Debian 的 dpkg 。我们的 CentOS 主要是以 RPM 为主,但也不能不知道 dpkg 啦!所以底下就来约略介绍一下这两个玩意儿。


小标题的图示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 软体等。

distribution 代表软体管理机制使用指令线上升级机制(指令)
Red Hat/FedoraRPMrpm, rpmbuildYUM (yum)
Debian/UbuntuDPKGdpkgAPT (apt-get)

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


小标题的图示什么是 RPM 与 SRPM

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

他最大的特点就是将你要安装的软体先编译过, 并且打包成为 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 的用处了!

档案格式档名格式直接安装与否内含程式类型可否修改参数并编译
RPMxxx.rpm已编译不可
SRPMxxx.src.rpm不可未编译之原始码
Tips:
为何说 CentOS 是‘社群维护的企业版’呢? Red Hat 公司的 RHEL 释出后,连带会将 SRPM 释出。 社群的朋友就将这些 SRPM 收集起来并重新编译成为所需要的软体,再重复释出成为 CentOS,所以才能号称与 Red Hat 的 RHEL 企业版同步啊!真要感谢 SRPM 哩!如果你想要理解 CentOS 是如何编译一支程式的, 也能够透过学习 SRPM 内含的编译参数,来学习的啊!
鸟哥的图示

小标题的图示什么是 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 等的档案名称出现了!

    平台名称适合平台说明
    i386 几乎适用于所有的 x86 平台,不论是旧的 pentum 或者是新的 Intel Core 2 与 K8 系列的 CPU 等等,都可以正常的工作!那个 i 指的是 Intel 相容的 CPU 的意思,至于 386 不用说,就是 CPU 的等级啦!
    i586 就是针对 586 等级的电脑进行最佳化编译。那是哪些 CPU 呢?包括 pentum 第一代 MMX CPU, AMD 的 K5, K6 系列 CPU (socket 7 插脚) 等等的 CPU 都算是这个等级;
    i686 在 pentun II 以后的 Intel 系列 CPU ,及 K7 以后等级的 CPU 都属于这个 686 等级! 由于目前市面上几乎仅剩 P-II 以后等级的硬体平台,因此很多 distributions 都直接释出这种等级的 RPM 档案。
    x86_64 针对 64 位元的 CPU 进行最佳化编译设定,包括 Intel 的 Core 2 以上等级 CPU ,以及 AMD 的 Athlon64 以后等级的 CPU ,都属于这一类型的硬体平台。
    noarch 就是没有任何硬体等级上的限制。一般来说,这种类型的 RPM 档案,里面应该没有 binary program 存在, 较常出现的就是属于 shell script 方面的软体。

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

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


小标题的图示RPM 的优点

由于 RPM 是透过预先编译并打包成为 RPM 档案格式后,再加以安装的一种方式,并且还能够进行资料库的记载。 所以 RPM 有以下的优点:

  • RPM 内含已经编译过的程式与设定档等资料,可以让使用者免除重新编译的困扰;
  • RPM 在被安装之前,会先检查系统的硬碟容量、作业系统版本等,可避免档案被错误安装;
  • RPM 档案本身提供软体版本资讯、相依属性软体名称、软体用途说明、软体所含档案等资讯,便于了解软体;
  • RPM 管理的方式使用资料库记录 RPM 档案的相关参数,便于升级、移除、查询与验证。

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

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

为了解决这种具有相关性的软体之间的问题 (就是所谓的软体相依属性),RPM 就在提供打包的软体时,同时加入一些讯息登录的功能,这些讯息包括软体的版本、 打包软体者、相依属性的其他软体、本软体的功能说明、本软体的所有档案记录等等,然后在 Linux 系统上面亦建立一个 RPM 软体资料库,如此一来,当你要安装某个以 RPM 型态提供的软体时,在安装的过程中, RPM 会去检验一下资料库里面是否已经存在相关的软体了, 如果资料库显示不存在,那么这个 RPM 档案‘预设’就不能安装。呵呵!没有错,这个就是 RPM 类型的档案最为人所诟病的‘软体的属性相依’问题啦!


小标题的图示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 资料库已存在的软体资料相比较,就能够一口气安装所有需要的具有相依属性的软体了。 整个流程可以简单的如下图说明:

YUM 使用的流程示意图
图 1.5.1、YUM 使用的流程示意图

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

Tips:
为什么要做出‘容器’呢?由于 yum 伺服器提供的 RPM 档案内容可能有所差异,举例来说,原厂释出的资料有 (1)原版资料; (2)更新资料 (update); (3)特殊资料 (例如第三方协力软体,或某些特殊功能的软体)。 这些软体档案基本上不会放置到一起,那如何分辨这些软体功能呢?就用‘容器’的概念来处理的啦! 不同的‘容器’网址,可以放置不同的软体功能之意!
鸟哥的图示

大标题的图示RPM 软体管理程式: rpm

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


小标题的图示RPM 预设安装的路径

一般来说,RPM 类型的档案在安装的时候,会先去读取档案内记载的设定参数内容,然后将该资料用来比对 Linux 系统的环境,以找出是否有属性相依的软体尚未安装的问题。例如 Openssh 这个连线软体需要透过 Openssl 这个加密软体的帮忙,所以得先安装 openssl 才能装 openssh 的意思。那你的环境如果没有 openssl , 你就无法安装 openssh 的意思啦。

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

那么软体内的档案到底是放置到哪里去啊?当然与档案系统有关对吧!我们在第六章的目录配置谈过每个目录的意义, 这里再次的强调啰:

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

好了,底下我们就来针对每个 RPM 的相关指令来进行说明啰!


小标题的图示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

另外,如果我们在安装的过程当中发现问题,或者已经知道会发生的问题, 而还是‘执意’要安装这个软体时,可以使用如下的参数‘强制’安装上去:

rpm 安装时常用的选项与参数说明
可下达的选项代表意义
--nodeps 使用时机:当发生软体属性相依问题而无法安装,但你执意安装时
危险性: 软体会有相依性的原因是因为彼此会使用到对方的机制或功能,如果强制安装而不考虑软体的属性相依, 则可能会造成该软体的无法正常使用!
--replacefiles 使用时机: 如果在安装的过程当中出现了‘某个档案已经被安装在你的系统上面’的资讯,又或许出现版本不合的讯息 (confilcting files) 时,可以使用这个参数来直接覆盖档案。
危险性: 覆盖的动作是无法复原的!所以,你必须要很清楚的知道被覆盖的档案是真的可以被覆盖喔!否则会欲哭无泪!
--replacepkgs 使用时机: 重新安装某个已经安装过的软体!如果你要安装一堆 RPM 软体档案时,可以使用 rpm -ivh *.rpm ,但若某些软体已经安装过了, 此时系统会出现‘某软体已安装’的资讯,导致无法继续安装。此时可使用这个选项来重复安装喔!
--force 使用时机:这个参数其实就是 --replacefiles 与 --replacepkgs 的综合体!
--test 使用时机: 想要测试一下该软体是否可以被安装到使用者的 Linux 环境当中,可找出是否有属性相依的问题。范例为:
rpm -ivh pkgname.i386.rpm --test
--justdb 使用时机: 由于 RPM 资料库破损或者是某些缘故产生错误时,可使用这个选项来更新软体在资料库内的相关资讯。
--nosignature 使用时机: 想要略过数位签章的检查时,可以使用这个选项。
--prefix 新路径 使用时机: 要将软体安装到其他非正规目录时。举例来说,你想要将某软体安装到 /usr/local 而非正规的 /bin, /etc 等目录, 就可以使用‘ --prefix /usr/local ’来处理了。
--noscripts 使用时机:不想让该软体在安装过程中自行执行某些系统指令。
说明: RPM 的优点除了可以将档案放置到定位之外,还可以自动执行一些前置作业的指令,例如资料库的初始化。 如果你不想要让 RPM 帮你自动执行这一类型的指令,就加上他吧!

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

例题:
在没有网路的前提下,你想要安装一个名为 pam-devel 的软体,你手边只有原版光碟,该如何是好?
答:
你可以透过挂载原版光碟来进行资料的查询与安装。请将原版光碟放入光碟机,底下我们尝试将光碟挂载到 /media 当中, 并据以处理软体的下载啰:
  • 挂载光碟,使用: mount /dev/cdrom /media
  • 找出档案的实际路径:find /media -name 'pam-devel*'
  • 测试此软体是否具有相依性: rpm -ivh pam-devel... --test
  • 直接安装: rpm -ivh pam-devel...
  • 卸载光碟: umount /dev/cdrom
在鸟哥的系统中,刚好这个软体并没有属性相依的问题,因此最后一个步骤可以顺利的进行下去呢!


小标题的图示RPM 升级与更新 (upgrade/freshen)

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

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

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

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

  1. 先到各发展商的 errata 网站或者是国内的 FTP 映像站捉下来最新的 RPM 档案;
  2. 使用 -Fvh 来将你的系统内曾安装过的软体进行修补与升级!(真是方便呀!)

所以,在不晓得 yum 功能的情况下,你依旧可以到 CentOS 的映设站台下载 updates 资料,然后利用上述的方法来一口气升级! 当然啰,升级也是可以利用 --nodeps/--force 等等的参数啦!


小标题的图示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 档案就不同了,我们必须要列出整个档案的完整档名才行~ 这一点朋友们常常会搞错。底下我们就来做几个简单的练习吧!

例题:
  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
    就可以知道是那个软体啰!重新安装一次该软体即可!


小标题的图示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
# 呵呵!共有八个档案啊!请修改 /etc/logrotate.conf 内的 rotate 变成 5

[root@www ~]# rpm -V logrotate
..5....T  c /etc/logrotate.conf

你会发现在档名之前有个 c ,然后就是一堆奇怪的文字了。那个 c 代表的是 configuration , 就是设定档的意思。至于最前面的八个资讯是:

  • S :(file Size differs) 档案的容量大小是否被改变
  • M :(Mode differs) 档案的类型或档案的属性 (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 代表的是‘ Config file ’的意思,也就是档案的类型,档案类型有底下这几类:

  • c :设定档 (config file)
  • d :文件资料档 (documentation)
  • g :鬼档案~通常是该档案不被某个软体所包含,较少发生!(ghost file)
  • l :授权档案 (license file)
  • r :读我档案 (read me)

经过验证的功能,你就可以知道那个档案被更动过。那么如果该档案的变更是‘预期中的’, 那么就没有什么大问题,但是如果该档案是‘非预期的’,那么是否被入侵了呢?呵呵!得注意注意啰! 一般来说,设定档 (configure) 被更动过是很正常的,万一你的 binary program 被更动过呢? 那就得要特别特别小心啊!

Tips:
虽说家丑不可外扬,不过有件事情还是跟大家分享一下的好。鸟哥之前的主机曾经由于安装一套软体,导致被攻击成为跳板。 会发现的原因是系统中只要出现 *.patch 的副档名时,使用 ls -l 就是显示不出来该档名 (该档名确实存在)。 找了好久,用了好多工具都找不出问题,最终利用 rpm -Va 找出来,原来好多 binary program 被更动过,连 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)(注1)。 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 时选择略过数位签章的选项。


小标题的图示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   <==重建资料库

大标题的图示SRPM 的使用 : rpmbuild

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


小标题的图示利用预设值安装 SRPM 档案 (--rebuid/--recompile)

假设我下载了一个 SRPM 的档案,又不想要修订这个档案内的原始码与相关的设定值, 那么我可以直接编译并安装吗?当然可以!利用 rpmbuild 配合选项即可。选项主要有底下两个:

--rebuild 这个选项会将后面的 SRPM 进行‘编译’与‘打包’的动作,最后会产生 RPM 的档案,但是产生的 RPM 档案并没有安装到系统上。当你使用 --rebuild 的时候,最后通常会发现一行字体:
Wrote: /usr/src/redhat/RPMS/i386/pkgname.i386.rpm
这个就是编译完成的 RPM 档案啰!这个档案就可以用来安装啦!安装的时候请加绝对路径来安装即可!
--recompile 这个动作会直接的‘编译’‘打包’并且‘安装’啰!请注意, rebuild 仅‘编译并打包’而已,而 recompile 不但进行编译跟打包,还同时进行‘安装’了!

不过,要注意的是,这两个选项都没有修改过 SRPM 内的设定值,仅是透过再次编译来产生 RPM 可安装软体档案而已。 一般来说,如果编译的动作顺利的话,那么编译过程所产生的中间暂存档都会被自动删除,如果发生任何错误, 则该中间档案会被保留在系统上,等待使用者的除错动作!那么,该如何除错呢?如果想要自行除错, 或者是想要修改 SRPM 内的设定值时,就得要知道利用 SRPM 的时候,系统会动用到哪些重要的目录了! 底下我们就来谈一谈当处理 SRPM 时,系统会使用到的目录。


小标题的图示SRPM 使用的路径与需要的软体

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

/usr/src/redhat/SPECS 这个目录当中放置的是该软体的设定档,例如这个软体的资讯参数、设定项目等等都放置在这里;
/usr/src/redhat/SOURCES 这个目录当中放置的是该软体的原始档 (*.tar.gz 的档案) 以及 config 这个设定档;
/usr/src/redhat/BUILD 在编译的过程中,有些暂存的资料都会放置在这个目录当中;
/usr/src/redhat/RPMS 经过编译之后,并且顺利的编译成功之后,将打包完成的档案放置在这个目录当中。里头有包含了 i386, i586, i686, noarch.... 等等的次目录。
/usr/src/redhat/SRPMS 与 RPMS 内相似的,这里放置的就是 SRPM 封装的档案啰!有时候你想要将你的软体用 SRPM 的方式释出时, 你的 SRPM 档案就会放置在这个目录中了。

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

由于 SRPM 需要重新编译,而编译的过程当中,我们至少需要有 make 与其相关的程式,及 gcc, c, c++ 等其他的编译用的程式语言来进行编译,更多说明请参考第二十二章原始码所需基础软体吧。 所以,如果你在安装的过程当中没有选取软体开发工具之类的软体, 呵呵!得重新拿出你的光碟,然后再安装喔!哈哈!只是得要克服一大堆的属性相依的问题就是了~ 这问题待会儿可以使用 yum 来处理,你当然也可以先使用‘ yum groupinstall "Development Tools" ’来安装开发软体。 鸟哥这里假设你已经安装了该软体群组啰。

例题:
尝试使用 --rebuild 选项制作出一个 RPM 软体档案,可以到国家高速网路中心下载 rp-pppoe 这个 SRPM 软体档案, 你可以到 http://ftp.twaren.net/Linux/CentOS/5/os/SRPMS/ 找到这个软体来下载。 鸟哥这里使用 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 的方式差不多,也是编译后变成 binary program,接着再以 RPM 的机制封装起来啦。 重点在上面特殊字体的部分,记得要察看一下喔!若一切正常,则会看到 exit 0 的字样,且会主动的删除 (rm) 很多中间暂存档哩。


小标题的图示设定档的主要内容 (*.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 设定段落:


  • 系统整体资讯方面:

刚刚你看到的就有底下这些重要的咚咚啰:

参数参数意义
Summary 本软体的主要说明,例如上表中说明了本软体是针对 xDSL 的拨接用途啦!
Name 本软体的软体名称 (最终会是 RPM 档案的档名构成之一)
Version 本软体的版本 (也会是 RPM 档名的构成之一)
Release 这个是该版本打包的次数说明 (也会是 RPM 档名的构成之一)。由于我们想要动点手脚,所以上头的档案中, 这个部分请修改为 32.2.vbird 看看
License 这个软体的授权模式,我们是使用 GPL 啦!
Group 这个软体的发展团体名称;
Url 这个原始码的主要官方网站;
Source 这个软体的来源,如果是网路上下载的软体,通常一定会有这个资讯来告诉大家这个原始档的来源! 此外,还有来自开发商自己提供的原始档资料喔!例如上面的 adsl-start 等程式。
Patch 就是作为补丁的 patch file 啰!
BuildRoot 设定作为编译时,该使用哪个目录来暂存中间档案 (如编译过程的目标档案/连结档案等档)。
ExclusiveArch 这个是说明这个软体的适合安装的硬体,通常预设为 i386,当然,你也可以调整为 i586 啦等等的! 由于我们的系统是新的 CPU 架构,这里我们修改内容成为‘ExclusiveArch: i686’来玩玩看。
上述为必须要存在的项目,底下为可使用的额外设定值
Requires 如果你这个软体还需要其他的软体的支援,那么这里就必需写上来,则当你制作成 RPM 之后,系统就会自动的去检查啦!这就是‘相依属性’的主要来源啰!
Prereq 这个软体需要的前驱程式为何!这里指的是‘程式’而 Requires 指的是‘软体’!
BuildRequires 编译过程中所需要的软体。Requires 指的是‘安装时需要检查’的,因为与实际运作有关,这个 BuildRequires 指的是‘编译时’所需要的软体,只有在 SRPM 编译成为 RPM 时才会检查的项目。
Packager 这个软体是经由谁来打包的呢?
Vender 发展的厂商哪;

上面几个资料通常都必需要写啦!但是如果你的软体没有相依属性的关系时,那么就可以不需要那个 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 就是建立啊!所以当然啰,这个段落就是在谈怎么 make 编译成为可执行的程式啰! 你会发现在此部分的程式码方面,就是 ./configure, make 等项目哩!


  • %install:

编译完成 (build) 之后,就是要安装啦!安装就是写在这里,也就是类似 Tarball 里面的 make install 的意思啰!


  • %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 来吧!


小标题的图示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 啰)。


小标题的图示一个打包自己软体的范例

这个就有趣了!我们自己来编辑一下自己制作的 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 的来源档内容啰!


大标题的图示YUM 线上升级机制

我们在本章一开始的地方谈到过 yum 这玩意儿,这个 yum 是透过分析 RPM 的标头资料后, 根据各软体的相关性制作出属性相依时的解决方案,然后可以自动处理软体的相依属性问题,以解决软体安装或移除与升级的问题。 详细的 yum 伺服器与用户端之间的沟通,可以再回到前面的部分查阅一下图 1.5.1 的说明。

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

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


小标题的图示利用 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 如何用在查询上面了吧?那么实际来应用一下:

例题:
利用 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!

有没有很高兴啊!你不必知道软体在哪里,你不必手动下载软体,你也不必拿出原版光碟出来 mount 之后查询再安装!全部不需要,只要有了 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 的功能忘记了呢!切记切记!


小标题的图示yum 的设定档

虽然 yum 是你的主机能够连线上 Internet 就可以直接使用的,不过,由于 CentOS 的映射站台可能会选错, 举例来说,我们在台湾,但是 CentOS 的映射站台却选择到了大陆北京或者是日本去,有没有可能发生啊! 有啊!鸟哥教学方面就常常发生这样的问题,要知道,我们连线到大陆或日本的速度是非常慢的呢!那怎办? 当然就是手动的修改一下 yum 的设定档就好啰!

在台湾,CentOS 的映射站台主要有高速网路中心与义首大学,鸟哥近来比较偏好高速网路中心, 似乎更新的速度比较快,而且连接台湾学术网路也非常快速哩!因此,鸟哥底下建议台湾的朋友使用高速网路中心的 ftp 主机资源来作为 yum 伺服器来源喔!目前高速网路中心对于 CentOS 所提供的相关网址如下:

如果你连接到上述的网址后,就会发现里面有一堆连结,那些连结就是这个 yum 伺服器所提供的容器了! 所以高速网路中心也提供了 addons, centosplus, extras, fasttrack, os, updates 等容器,最好认的容器就是 os (系统预设的软体) 与 updates (软体升级版本) 啰!由于鸟哥在我的测试用主机是利用 i386 的版本, 因此那个 os 再点进去就会得到如下的可提供安装的网址:

为什么在上述的网址内呢?有什么特色!最重要的特色就是那个‘ 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=:就是数位签章的公钥档所在位置!使用预设值即可

了解这个设定档之后,接下来让我们修改整个档案的内容,让我们这部主机可以直接使用高速网路中心的资源吧! 修改的方式鸟哥仅列出 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
# 底下其他的容器项目,请自行到高速网路中心去查询后自己处理!

接下来当然就是给他测试一下啰!如何测试呢?再次使用 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

小标题的图示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 这个视窗介面所需的所有软体! 这个咚咚真是非常的方便呢!这个功能请一定要记下来,对你未来安装软体是非常有帮助的喔! ^_^


小标题的图示全系统自动升级

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

[root@www ~]# vim /etc/crontab
....(前面省略并保留设定值)....
0  3 * * * root /usr/bin/yum -y update

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


大标题的图示管理的抉择:RPM 还是 Tarball

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

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

    由于原厂释出的软体通常具有一段时间的维护期,举例来说, RHEL 与 CentOS 每一个版本至少提供五年以上的更新期限。这对于我们的系统安全性来说,实在是非常好的选项! 何解?既然 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 来安装,轻松又惬意!


大标题的图示重点回顾
  • 为了避免使用者自行编译的困扰,开发商自行在特定的硬体与作业系统平台上面预先编译好软体, 并将软体以特殊格式封包成档案,提供终端用户直接安装到固定的作业系统上,并提供简单的查询/安装/移除等流程。 此称为软体管理员。常见的软体管理员有 RPM 与 DPKG 两大主流。
  • RPM 的全名是 RedHat Package Manager,原本是由 Red Hat 公司所发展的,流传甚广;
  • RPM 类型的软体中,所含有的软体是经过编译后的 binary program ,所以可以直接安装在使用者端的系统上, 不过,也由于如此,所以 RPM 对于安装者的环境要求相当严格;
  • RPM 除了将软体安装至使用者的系统上之外,还会将该软体的版本、名称、档案与目录配置、系统需求等等均记录于资料库 (/var/lib/rpm) 当中,方便未来的查询与升级、移除;
  • RPM 可针对不同的硬体等级来加以编译,制作出来的档案可于副档名 (i386, i586, i686, x86_64) 来分辨;
  • RPM 最大的问题为软体之间的相依性问题;
  • SRPM 为 Source RPM ,内含的档案为 Source code 而非为 binary file ,所以安装 SRPM 时还需要经过 compile ,不过,SRPM 最大的优点就是可以让使用者自行修改设定参数 (makefile/configure 的参数) ,以符合使用者自己的 Linux 环境;
  • RPM 软体的属性相依问题,已经可以藉由 yum 或者是 APT 等方式加以克服。 CentOS 使用的就是 yum 机制。
  • yum 伺服器提供多个不同的容器放置个别的软体,以提供用户端分别管理软体类别。

大标题的图示本章习题
  • 情境模拟题一:实际安装 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 进行安装时老是发现错误, 此时你该如何是好?
    先确认你的设定档确实是正确的,如果没问题,可以将 yum 的快取清除,使用‘yum clean all’即可。 事实上, yum 的所有快取、下载软体、下载软体的表头资料,都放置于 /var/cache/yum/ 目录下。
  • 简单说明 RPM 与 SRPM 的异同?
    RPM 档案是由程式打包者 (通常是由 distribution 的开发商) 藉由程式的原始码,在特定的平台上面所编译成功的 binary program 的资料,并将该资料制作成为 RPM 的格式,以方便相同软、硬体平台的使用者之安装使用。 在安装时显的很简单,因为程式打包者的平台与使用者所使用的平台预设为相同。
    至于 SRPM 则是藉由与 RPM 相同的设定档资料,不过将原始码直接包在 SRPM 档案当中,而不经过编译。 因为 SRPM 所内含的资料为原始码,所以安装时必须要再经过编译的行为才能成为 RPM 并提供使用者安装。
  • 假设我想要安装一个软体,例如 pkgname.i386.rpm ,但却老是发生无法安装的问题,请问我可以加入哪些参数来强制安装他?
    可以加入 --nodeps 等参数。例如 rpm -ivh --nodeps pkgname.i386.rpm
  • 承上题,你认为强制安装之后,该软体是否可以正常执行?为什么?
    一般来说,应该是‘不能执行’的,因为该软体具有相依属性的问题, 某些时刻该软体的程式可能需要呼叫外部的函式库,但函式库可能未安装,因此当然无法执行成功。
  • 有些人使用 OpenLinux 3.1 Server 安装在自己的 P-166 MMX ,却发现无法安装,在查询了该原版光碟的内容,发现里面的档案名称为 ***.i686.rpm 。请问,无法安装的可能原因为何?
    因为 P-166MMX 为 i586 的硬体平台,而 OpenLinux 为针对 i686 的硬体平台进行最佳化, 因此很可能由于下达的参数无法支援的问题,导致无法安装成功。
  • 请问我使用 rpm -Fvh *.rpm 及 rpm -Uvh *.rpm 来升级时,两者有何不同?
    -Uvh 后面接的软体,如果原本未安装,则直接安装,原本已安装时,则直接升级;
    -Fvh 后面接的软体,如果原本未安装,则不安装,原本已安装时,则直接升级;
  • 假设有一个厂商推出软体时,自行处理了数位签章,你想要安装他们的软体所以需要使用数位签章,假设数位签章的档名为 signe, 那你该如何安装?
    rpm --import signe
  • 承上,假设该软体厂商提供了 yum 的安装网址为: http://their.server.name/path/ ,那你该如何处理 yum 的设定档?
    可以自行取个档名,在此例中我们使用‘ vim /etc/yum.repos.d/their.repo ’,副档名要正确! 内容有点像这样即可:
    [their]
    name=their server name
    baseurl=http://their.server.name/path/
    enable=1
    gpgcheck=0
    然后使用 yum 去安装该软体看看。

大标题的图示参考资料与延伸阅读

2002/08/21:第一次完成
2003/02/11:重新编排与加入 FAQ
2004/04/11:已经完成了 Source code 与 Tarball ,开始进行 RPM 与 SRPM 的介绍!(需要耗时多日啊!因为又要进兵营去了!)
2004/04/20:终于给他熬出来啦!又是过了两个休假期间~啊!给我退伍令、其余免谈!
2005/10/02:旧版的 SRPM 资料已经移动到 此处
2005/10/03:旧版的针对 Red Hat 与 Mandriva 的版本移动到 此处
2005/10/03:将原本去年的版本改为 FC4 为范例的模样!
2009/06/20:原本的针对 FC4 写的旧版文章移动到此处
2009/09/18:加入了简单的情境模拟,也加入了一些关于 yum 的习题喔!



 
     
本网页主要以 firefox 配合解析度 1024x768 作为设计依据
http://linux.vbird.org is designed by VBird during 2001-2009. Aerosol Lab.