yum命令用来安装和更新软件,例如安装nginx:

              [peter@study ~]$ sudo yum install nginx
            

编译源码安装软件,就是利用软件开发者发布的Tarball来进行软件的安装。 每次安装都需要检测操作系统环境、设置编译参数、编译、最后还要设置软件安装位置。 使用源码进行编译可以自定义设置,但对于Linux distribution开发商来说,软件管理会比较麻烦, 毕竟不是每个人都会进行源码编译。 如果能够将软件预先在相同的硬件与操作系统上编译好再发布, 就能够让相同的distribution具有完全一致的软件版本. 再加上简易的安装,移除,管理等机制, 软件管理就会简单很多。目前流行的软件安装管理工具有RPM与YUM。

软件管理工具简介

回到顶部

如果我的Linux系统与厂商的系统一模一样,在厂商的系统上编译出来的可执行文件,自然也可以在我的系统上运行! 厂商先在他们的系统上编译好用户所需要的软件,然后将编译好的可执行软件直接发布给用户来安装,就是类似Windows的软件安装方式, 由程序开发者直接在已知的系统上面编译好,再将该程序直接给用户来安装。 如果在安装的时候还可以加上一些与这些程序相关的信息,建立数据库,那就可以进行安装、卸载、升级与验证等的相关功能,类似Windows下的新增移除程序. 在Linux上至少有两种常见软件安装管理工具,分别是redhat系统的RPM和Debian系统的dpkg. 随着自由软件的蓬勃发展,很多软件开发者使用Tarball来发布他们的软件。 后来Linux内核发布,一些企业或社群将软件收集起来制作并发布成好用的linux发行版。 但这些发行版的软件管理非常混乱, 如果软件有漏洞,又该如何修补呢?使用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)等。
distribution 代表 软件管理机制 使用指令 在线升级机制(指令) Red Hat/Fedora RPM rpm, rpmbuild YUM (yum) Debian/Ubuntu DPKG dpkg APT (apt-get) CentOS使用的软件管理机制为RPM,在线升级的方式为yum!

什么是RPM与SRPM

回到顶部

RPM全名RedHat Package Manager!最初由Red Hat公司开发。 RPM是以一种数据库记录的方式将软件安装到Linux系统的一套管理机制。 RPM将要安装的软件编译并打包成RPM机制的安装文件,安装文件里记录了软件安装的依赖关系, 安装软件时RPM会先依照安装文件里的数据查询Linux主机的依赖关系是否满足, 满足则安装,不满足则不安装。 安装的时候就将该软件的信息整个写入RPM的数据库,以便未来查询、验证与卸载!
这样的优点是:
1. 由于已经编译完成且打包完毕,软件的传输与安装很方便,不需要再重新编译;
2. 软件的信息记录在Linux主机的数据库上,很方便查询、升级与卸载.
RPM安装文件只能安装在和原本建立该文件的环境相同的主机。例如ADSL拨号软件rp-pppoe,必须在ppp软件存在的环境下才能安装! 除非先安装ppp,否则无法安装rp-pppoe,当然可以强制安装,但这通常都会带来莫名其妙的问题。 所以通常一个发行版发布的RPM文件,并不能在其他的发行版上安装。例如Red Hat发布的RPM文件,通常无法直接在SuSE上安装。 更有甚者,相同 distribution 的不同版本之间也无法互通,例如 CentOS 6.x 的 RPM 文件就无法直接套用在 CentOS 7.x!
这些软件管理机制的问题是:
1. 软件文件安装的环境必须与打包时的环境一致或相当;
2. 需要满足软件的依赖关系;
3. 卸载时需要特别小心,最底层的软件不可先移除,否则可能造成整个系统的问题!
如果真想要安装其他发行版提供的RPM文件,可以使用SRPM. SRPM是Source RPM的意思,RPM文件里面含有源码! SRPM所提供的软件并没有经过编译, 它提供的是源码!
通常SRPM扩展名是以***.src.rpm这种格式命名的。既然SRPM提供的是源码,为什么不用Tarball来安装呢? SRPM虽然是源码, 但是仍然含有软件所需要的依赖软件说明、以及RPM文件所提供的数据。 与RPM不同的是,SRPM还提供了参数配置文件configure和makefile。
安装SRPM文件需要先将该软件以RPM管理的方式编译,SRPM会被编译成为RPM文件;最后将编译完成的RPM文件安装到Linux系统当中 通常一个软件在发布的时候,都会同时发布该软件的RPM与SRPM 。 RPM文件必须要在相同的Linux环境下才能安装,而SRPM既然是源码的格式,就可以通过修改SRPM内的参数配置文件,然后重新编译产生能适合我们Linux环境的RPM文件, 这样就可以将软件安装到我们的系统中,而不必与原作者打包的Linux环境相同,这就是 SRPM的用处!

              文件格式 文件名格式    直接安装与否 内含程序类型 可否修改参数并编译
              RPM     xxx.rpm     可         已编译      不可
              SRPM    xxx.src.rpm 不可       未编译源码   可
            
Red Hat公司发布RHEL后,会连带发布SRPM。 社群会将这些 SRPM 收集起来并重新编译成为所需要的软件,再重复发布成为CentOS,所以与 Red Hat 的 RHEL 企业版同步!
22.1.3 什么是 i386, i586, i686, noarch, x86_64 RPM与SRPM的文件格式分别为:
xxxxxxxxx.rpm #RPM格式,经过编译且打包的rpm文件;
xxxxx.src.rpm #SRPM格式,包含未编译的源码信息。
一般软件发布时候的文件名都会有如下的命名规范:
rp-pppoe-3.11-5.el7.x86_64.rpm
rp-pppoe - 软件名称
3.11-5.el7.x86_64.rpm 软件的版本信息 发布的次数 适合的硬件平台 扩展名 除了后面适合的硬件平台与扩展名外,主要是以-来隔开各个部分, 这样子可以很清楚的发现该 软件的名称、版本信息、打包次数与操作的硬件平台!
软件名称: 当然就是每一个软件的名称!上面的范例就是 rp-pppoe 。
版本信息: 每次更新版本就需要有一个版本信息,通常分为主版本和次版本。上面主版本为3 ,11是次版本号!所以版本名3.11
发布版本次数: 通常就是编译的次数啦。
操作硬件平台: RPM可以适用不同的操作平台,不同的平台设定的参数有所差异,就会生成针对不同平台优化编译的安装文件.例如i386,i586, i686, x86_64 与 noarch 等!
i386几乎适用于所有的x86平台,不论是旧的pentum或者是新的Intel Core 2与K8系列的CPU等等,都可以正常的工作!i指的是Intel兼容的CPU,386就是 CPU 的等级!
i586就是针对586等级的计算机进行优化编译。包括 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 方面的软件。
CentOS 7仅推出x86_64的软件版本,并没有提供i686以下等级的软件了,i386只有在某些很特别的软件上才看到的到! intel CPU都会向下兼容,因此最低等级的 i386 软件可以安装在所有的 x86 硬件平台上,不论是 32 位还是 64 位。但是反过来说就不行了。 例如目前硬件大多是 64 位的等级,因此你可以在该硬件上面安装x86_64 或 i386 等级的 RPM 软件。但不能在32位机器上安装 x86_64 的软件!
22.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 类型的文件最为人所诟病的软件的属性依赖问题 啦! 22.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(1)先将发布的软件放置到 YUM 服务器内,然后(2)分析这些软件的依赖属性问题,将软件内 的记录信息写下来 (header)。 然后再将这些信息分析后记录成软件相关性的列表列表。 这些列表数据与软件所在的本机或网络位置可以称呼为容器或软件仓库或软件库 (repository)。 当客户端有软件安装的需求时,客户端主机会主动的向网络上面的 yum 服务器的软件库网址下载清单列表, 然后通过列表列表的数据与本机 RPM 数据库已存在的软件数据相比较,就能够一口气安装所有需要的 具有依赖属性的软件了。 整个流程可以简单的如下图说明: YUM 使用的流程示意图 所以软件仓库内的列表会记载每个文件的依赖属性关系,以及所有文件的网络位置 (URL)! 由于记录了详细的软件网络位置, 所以有需要的时候,当然就会自动的从网络下载该软件啰! 当客户端有升级、安装的需求时, yum会向软件库要求清单的更新,等到清单更新到本机的 /var/cache/yum 里面后, 等一下更新时就会用这个本机清单与本机的 RPM 数据库进行比较,这样 就知道该下载什么软件。 接下来 yum会跑到软件库服务器 (yum server) 下载所需要的软件 (因为有 记录软件所在的网址),然后再通过 RPM 的机制开始安装软件啦! 这就是整个流程! 谈到最后,还 是需要动到 RPM的啦!所以下个小节就让我们来谈谈 RPM 这咚咚吧! Tips 为什么要做出软件库呢?由于 yum 服务器提供的 RPM 文件内容可能有所差异, 举例来说,原厂发布的数据有 (1)原版数据; (2)更新数据(update); (3)特殊数据 (例如第三方协力软件,或某些 特殊功能的软件)。 这些软件文件基本上不会放置到一起,那如何分辨这些软件功能呢?就用软件库的概念来 处理的啦! 不同的软件库网址,可以放置不同的功能的软件之意! 22.2 RPM 软件管理程序: rpm RPM 的使用其实不难,只要使用 rpm 这个指令即可!initroot最喜欢的就是 rpm 指令的查询功能了, 可以让我很轻易的就知道某个系统有没有安装initroot要的软件呢! 此外, 我们最好还是得要知道一下,到底 RPM 类型的文件他们是将软件的相关文件放置在哪里呢?还有,我们说的那个 RPM 的数据库又是放置在哪里呢? 事实上,下一小节要讲的 yum 就可以直接用来进行安装的动作,基本上 rpm 这个指 令真的就只剩下查询与检验的功能啰!所以,查询与检验还是要学的,至于安装,通过 yum 就好了! 22.2.1 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.11-5.el7.x86_64.rpm的文件,那么我可以这样: (假 设原版光盘已经放在 /mnt 底下了) [root@study ~]# rpm -i /mnt/Packages/rp-pppoe-3.11-5.el7.x86_64.rpm 不过,这样的参数其实无法显示安装的进度,所以,通常我们会这样下达安装指令:

              [root@study ~]# rpm -ivh package_name
              选项与参数:
              -i :install 的意思
              -v :察看更细部的安装信息画面
              -h :以安装信息列显示安装进度
            
安装原版光盘上的 rp-pppoe 软件
              [root@study ~]# rpm -ivh /mnt/Packages/rp-pppoe-3.11-5.el7.x86_64.rpm
              Preparing...                    ################################# [100%] 
              Updating / installing... 
              1:rp-pppoe-3.11-5.el7           ################################# [100%]
            
一次安装多个软件时:
              [root@study ~]# rpm -ivh a.i386.rpm b.i386.rpm *.rpm# 后面直接接上许多的软件文件!
            
范例三、直接由网络上面的某个文件安装,以网址来安装:
            [root@study ~]# 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 的安装选项与参数大约就是这些了。 通常initroot建议直接使用 -ivh 就好了, 如果安 装的过程中发现问题,一个一个去将问题找出来,尽量不要使用暴力安装法 ,就是通过 --force 去强制安装! 因为可能会发生很多不可预期的问题呢!除非你很清楚的知道使用上面的参数后,安 装的结果是你预期的! 例题: 在没有网络的前提下,你想要安装一个名为pam-devel 的软件,你手边只有原版光盘,该如何是好? 答: 你可以通过挂载原版光盘来进行数据的查询与安装。请将原版光盘放入光驱,底下我们尝试将光盘挂载到 /mnt 当中, 并据以处理软件的下载啰: 挂载光盘,使用: mount /dev/sr0 /mnt 找出文件的实际路径:find /mnt -name 'pam-devel*' 测试此软件是否具有依赖性: rpm -ivh pam-devel... --test 直接安装: rpm -ivh pam-devel... 卸除光盘: umount /mnt 在initroot的系统中,刚好这个软件并没有属性依赖的问题,因此最后一个步骤可以顺利的进行下去呢!

RPM 升级与更新 (upgrade/freshen)

回到顶部

使用 RPM 来升级真是太简单了!就以 -Uvh 或 -Fvh 来升级即可,而 -Uvh 与 -Fvh 可以用的选项 与参数,跟 install 是一样的。 不过, -U 与 -F 的意义还是不太一样的,基本的差别是这样的: -Uvh后面接的软件即使没有安装过,则系统将予以直接安装; 若后面接的软件有安装过旧版,则系统自动更 新至新版; -Fvh 如果后面接的软件并未安装到你的 Linux 系统上,则该软件不会被安装; 亦即只有已安装至你Linux 系统 内的软件会被升级 ! 由上面的说明来看,如果你想要大量的升级系统旧版本的软件时,使用 -Fvh 则是比较好的作法, 因为没有安装的软件才不会被不小心安装进系统中。 但是需要注意的是,如果你使用的是 -Fvh ,偏偏你的机器上尚无这一个软件,那么很抱歉,该软件并不会被安装在你的 Linux 主机上面, 所以请重 新以 ivh来安装吧! 早期没有 yum 的环境底下,同时网络带宽也很糟糕的状况下,通常有的朋友在进行整个操作系统的 旧版软件修补时,喜欢这么进行: 1. 先到各发展商的 errata 网站或者是国内的 FTP映像站捉下来最新的 RPM 文件; 2. 使用 -Fvh 来将你的系统内曾安装过的软件进行修补与升级!(真是方便呀!) 所以,在不晓得 yum 功能的情况下,你依旧可以到 CentOS 的映设站台下载updates 数据,然后利 用上述的方法来一口气升级! 当然啰,升级也是可以利用 --nodeps/--force 等等的参数啦! 不过,现 在既然有 yum 的机制在,这个笨方法当然也就不再需要了!

RPM 查询 (query)

回到顶部

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

            [root@study ~]# rpm -qa #已安装软件
            [root@study ~]# rpm -q[licdR] 已安装的软件名称
            #已安装软件 
            [root@study ~]# rpm -qf 存在于系统上面的某个文件名
            [root@study ~]# rpm -qp[licdR] 未安装的某个文件名 #已安装软件 #查阅 RPM
            文件 选项与参数:
            查询已安装软件的信息:
            -q :仅查询,后面接的软件名称是否有安装;
            -qa :列出所有的,已经安装在本机 Linux 系统上面的所有软件名称;
            -qi :列出该软件的详细信息 (information),包含开发商、版本与说明等;
            -ql :列出该软件所有的文件与目录所在完整文件名 (list);
            -qc :列出该软件的所有配置文件 (找出在 /etc/ 底下的檔名而已)
            -qd :列出该软件的所有说明文件 (找出与 man 有关的文件而已)
            -qR :列出与该软件有关的依赖软件所含的文件 (Required 的意思)
            -qf :由后面接的文件名,找出该文件属于哪一个已安装的软件;
            -q --scripts:列出是否含有安装后需要执行的脚本档,可用以 debug 喔!
            查询某个 RPM 文件内含有的信息:
            -qp[icdlR]:注意 -qp 后面接的所有参数以上面的说明一致。但用途仅在于找出 某个RPM 文件内的信息,而非已安装的软件信息!注意!
            在查询的部分,所有的参数之前都需要加上-q 才是所谓的查询!查询主要分为两部分, 一个是查已安装到系统上面的的软件信息,这部份的信息都是由 /var/lib/rpm/ 所提供。
            另一个则是查某个 rpm 文件内容, 等于是由 RPM 文件内找出一些要写入数据库内的信息就是了,这部份就得要使用 -qp(p 是 package 的意思)。 那就来看看几个简单的范例吧!
            
范例一:找出你的 Linux 是否有安装 logrotate 这个软件?
            [root@study ~]# rpm -q
            logrotatelogrotate-3.8.6-4.el7.x86_64
            [root@study ~]# rpm -q logrotating 
            package logrotating is not installed 
            
# 注意到,系统会去找是否有安装后面接的软件名称。 注意,不必要加上版本喔! # 至于显示的结果,一看就知道有没有安装啦! 范例二:列出上题当中,属于该软件所提供的所有目录与文件:
            [root@study ~]# rpm -ql logrotate
            /etc/cron.daily/logrotate 
            /etc/logrotate.conf ....(以下省略).... #
            
可以看出该软件到底提供了多少的文件与目录,也可以追踪软件的数据。 范例三:列出 logrotate 这个软件的相关说明数据:
            [root@study ~]# rpm -qi logrotate
            Name : logrotate # 软件名称 
            Version : 3.8.6 # 软件的版本 
            Release : 4.el7 # 发布的版本 
            Architecture: x86_64 # 编译时所针对的硬件等级
            Install Date: Mon 04 May 2015 05:52:36 PM CST # 这个软件安装到本系统的时间 
            Group : System Environment/Base #软件是放再哪一个软件群组中 
            Size : 102451 # 软件的大小 
            License : GPL+ # 发布的授权方式 
            Signature : RSA/SHA256, Fri 04 Jul 2014 11:34:56 AM CST, Key ID 24c6a8a7f4a80eb5 
            Source RPM : logrotate-3.8.6-4.el7.src.rpm # 这就是 SRPM 的檔名 
            Build Date : Tue 10 Jun 2014 05:58:02 AM CST # 软件编译打包的时间 
            Build Host : worker1.bsys.centos.org # 在哪一部主机上面编译的
            Relocations : (not relocatable) 
            Packager : CentOS BuildSystem <http://bugs.centos.org> 
            Vendor : CentOS
            URL : https://fedorahosted.org/logrotate/ 
            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@study ~]# rpm -qc logrotate
            [root@study ~]# rpm -qd logrotate
            
范例五:若要成功安装logrotate ,他还需要什么文件的帮忙?
            [root@study ~]# rpm -qR logrotate
            /bin/sh 
            config(logrotate)=3.8.6-4.el7 
            coreutils>= 5.92
            ...省略...
            
# 由这里看起来,呵呵~还需要很多文件的支持才行喔! 范例六:由上面的范例五,找出 /bin/sh 是那个软件提供的?
            [root@study ~]# rpm -qf /bin/sh
            bash-4.2.46-12.el7.x86_64
            
# 这个参数后面接的可是文件吶!不像前面都是接软件喔! # 这个功能在查询系统的某个文件属于哪一个软件所有的。 范例七:假设我有下载一个 RPM 文件,想要知道该文件的需求文件,该如何?
            [root@study ~]# 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@study ~]# rpm -Va
            [root@study ~]# rpm -V 已安装的软件名称
            [root@study ~]# rpm -Vp 某个 RPM 文件的文件名
            [root@study ~]# rpm -Vf 在系统上面的某个文件
            选项与参数:
            -V :后面加的是软件名称,若该软件所含的文件被更动过,才会列出来;
            -Va :列出目前系统上面所有可能被更动过的文件;
            -Vp :后面加的是文件名,列出该软件内可能被更动过的文件;
            -Vf :列出某个文件是否被更动过~
            
范例一:列出你的 Linux 内的 logrotate 这个软件是否被更动过?
            [root@study ~]# rpm -V logrotate
            
# 如果没有出现任何讯息,恭喜你,该软件所提供的文件没有被更动过。 # 如果有出现任何讯息,才是有出现状况啊! 范例二:查询一下,你的 /etc/crontab 是否有被更动过?
            [root@study ~]# rpm -Vf /etc/crontab
            .......T. c /etc/crontab
            
# 瞧!因为有被更动过,所以会列出被更动过的信息类型! 好了,那么我怎么知道到底我的文件被更动过的内容是什么?例如上面的范例二。呵呵!简单的说明 一下吧! 例如,我们检查一下 logrotate 这个软件:
            [root@study ~]# rpm -ql logrotate
            /etc/cron.daily/logrotate
            /etc/logrotate.conf
            /etc/logrotate.d/usr/sbin/logrotate
            /usr/share/doc/logrotate-3.8.6
            /usr/share/doc/logrotate-3.8.6/CHANGES
            /usr/share/doc/logrotate-3.8.6/COPYING
            /usr/share/man/man5/logrotate.conf.5.gz
            /usr/share/man/man8/logrotate.8.gz
            /var/lib/logrotate.status
            # 呵呵!共有 10 个文件啊!请修改 /etc/logrotate.conf 内的 rotate 变成 5
            [root@study ~]# 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) 文件的建立时间已被改变 P :(caPabilities differ) 功能已经被改变 所以,如果当一个配置文件所有的信息都被更动过,那么他的显示就会是: SM5DLUGTP c filename 至于那个 c 代表的是 Config file 的意思,也就是文件的类型,文件类型有底下这几类: c :配置文件 (config file) d :文件数据文件 (documentation) g :鬼文件~通常是该文件不被某个软件所包含,较少发生!(ghost file) l :许可证文件 (license file) r :自述文件 (read me) 经过验证的功能,你就可以知道那个文件被更动过。那么如果该文件的变更是预期中的, 那么 就没有什么大问题,但是如果该文件是非预期的,那么是否被入侵了呢?呵呵!得注意注意啰! 一般来说,配置文件 (configure) 被更动过是很正常的,万一你的 binary program 被更动过呢? 那 就得要特别特别小心啊!Tips 虽说家丑不可外扬,不过有件事情还是跟大家分享一下的好。initroot之前的主机曾经由 于安装一套软件,导致被攻击成为跳板。 会发现的原因是系统中只要出现 *.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@study ~]# ll /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
            -rw-r--r--. 1 root root 1690 Apr
            1 06:27 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
            [root@study ~]# cat /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
            -----BEGIN PGP PUBLIC KEY BLOCK-----
            Version: GnuPG v1.4.5 (GNU/Linux)
            mQINBFOn/0sBEADLDyZ+DQHkcTHDQSE0a0B2iYAEXwpPvs67cJ4tmhe/iMOyVMh9
            ....(中间省略)....
            -----END PGP PUBLIC KEY BLOCK-----
            
从上面的输出,你会知道该数字签名码其实仅是一个随机数而已,这个随机数对于数字签名有意义而 已, 我们看不懂啦!那么这个文件如何安装呢?通过底下的方式来安装即可喔! [root@study ~]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 由于不同版本 GPG 密钥文件放置的位置可能不同,不过文件名大多是以 GPG-KEY 来说明的, 因此 你可以简单的使用 locate 或 find 来找寻,如以下的方式来搜寻即可:
            [root@study ~]# locate GPG-KEY
            [root@study ~]# find /etc -name '*GPG-KEY*'
            
那安装完成之后,这个密钥的内容会以什么方式呈现呢?基本上都是使用 pubkey 作为软件的名称的! 那我们先列出密钥软件名称后,再以 -qi 的方式来查询看看该软件的信息为何:
            [root@study ~]# rpm -qa | grep pubkey
            gpg-pubkey-f4a80eb5-53a7ff4b
            [root@study ~]# rpm -qi gpg-pubkey-f4a80eb5-53a7ff4b
            Name : gpg-pubkey
            Version : f4a80eb5
            Release : 53a7ff4b
            Architecture: (none)
            Install Date: Fri 04 Sep 2015 11:30:46 AM CST
            Group : Public Keys
            Size : 0
            License : pubkey
            Signature : (none)
            Source RPM : (none)
            Build Date : Mon 23 Jun 2014 06:19:55 PM CST
            Build Host : localhost
            Relocations : (not relocatable)
            Packager : CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>
            Summary : gpg(CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>)
            Description : -----BEGIN PGP PUBLIC KEY BLOCK-----
            Version: rpm-4.11.1 (NSS-3)
            ....(底下省略)....
            
重点就是最后面出现的那一串乱码啦!那可是作为数字签名非常重要的一环哩! 如果你忘记加上数 字签名,很可能很多原版软件就不能让你安装啰~除非你利用 rpm 时选择略过数字签名的选项。

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

回到顶部

卸载就是将软件卸载啦!要注意的是,解安装的过程一定要由最上层往下解除,以 rp-pppoe 为 例,这一个软件主要是依据 ppp 这个软件来安装的,所以当你要解除 ppp 的时候,就必须要先解除 rp-pppoe 才行!否则就会发生结构上的问题啦!这个可以由建筑物来说明, 如果你要拆除五、六楼, 那么当然要由六楼拆起,否则先拆的是第五楼时,那么上面的楼层难道会悬空?移除的选项很简单,就通过 -e 即可移除。不过,很常发生软件属性依赖导致无法移除某些软件的问 题! 我们以底下的例子来说明: # 1. 找出与 pam 有关的软件名称,并尝试移除 pam 这个软件:

            [root@study ~]# rpm -qa | grep pam
            fprintd-pam-0.5.0-4.0.el7_0.x86_64
            pam-1.1.8-12.el7.x86_64
            gnome-keyring-pam-3.8.2-10.el7.x86_64
            pam-devel-1.1.8-12.el7.x86_64
            pam_krb5-2.4.8-4.el7.x86_64
            [root@study ~]# rpm -e pam
            error: Failed dependencies: #这里提到的是依赖性的问题
            libpam.so.0()(64bit) is needed by (installed) systemd-libs-208-20.el7.x86_64
            libpam.so.0()(64bit) is needed by (installed) libpwquality-1.2.3-4.el7.x86_64
            ....(以下省略).... 
            
# 2. 若仅移除 pam-devel 这个之前范例安装上的软件呢?
            [root@study ~]# rpm -e pam-devel #不会出现任何讯息! 
            [root@study ~]# rpm -q pam-devel
            package pam-devel is not installed 
            
从范例一我们知道 pam 所提供的函式库是让非常多其他软件使用的,因此你不能移除 pam , 除非将其他依赖软件一口气也全部移除!你当然也能加 --nodeps 来强制移除, 不过,如此一来所有会用 到 pam 函式库的软件,都将成为无法运作的程序,我想,你的主机也只好准备停机休假了吧! 至 于范例二中,由于 pam-devel 是依附于 pam 的开发工具,你可以单独安装与单独移除啦! 由于 RPM 文件常常会安装/移除/升级等,某些动作或许可能会导致 RPM 数据库 /var/lib/rpm/ 内的 文件破损。果真如此的话,那你该如何是好?别担心,我们可以使用 --rebuilddb 这个选项来重建一 下数据库喔! 作法如下:
            [root@study ~]# rpm --rebuilddb #重建数据库 
            

YUM在线安装升级

回到顶部

我们在本章一开始的地方谈到过 yum 这玩意儿,这个 yum 是通过分析 RPM 的标头资料后, 根据 各软件的相关性制作出属性依赖时的解决方案,然后可以自动处理软件的依赖属性问题,以解决软件 安装或移除与升级的问题。 详细的 yum 服务器与客户端之间的沟通,可以再回到前面的部分查阅 一下图 22.1.1 的说明。 由于 distribution 必须要先发布软件,然后将软件放置于 yum 服务器上面,以提供客户端来要求安 装与升级之用的。 因此我们想要使用 yum的功能时,必须要先找到适合的 yum server 才行啊!而 每个 yum server 可能都会提供许多不同的软件功能,那就是我们之前谈到的软件库啦! 因此, 你必须要前往 yum server查询到相关的软件库网址后,再继续处理后续的设定事宜。事实上 CentOS 在发布软件时已经制作出多部映像站台 (mirror site) 提供全世界的软件更新之用。 所以,理论上我们不需要处理任何设定值,只要能够连上 Internet ,就可以使用 yum 啰!底下就让 我们来玩玩看吧! 22.3.1 利用 yum 进行查询、安装、升级与移除功能 yum 的使用真是非常简单,就是通过 yum 这个指令啊!那么这个指令怎么用呢?用法很简单,就让 我们来简单的谈谈: 查询功能:yum [list|info|search|provides|whatprovides] 参数 如果想要查询利用 yum 来查询原版 distribution 所提供的软件,或已知某软件的名称,想知道该软 件的功能, 可以利用 yum 相关的参数为:

              [root@study ~]# 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@study ~]# yum search raid
            Loaded plugins: fastestmirror, langpacks # yum 系统自己找出最近的 yum server
            Loading mirror speeds from cached hostfile # 找出速度最快的那一部 yum server # 底下三个软件库,且来源为该服务器! 
            * base: ftp.twaren.net 
            * extras: ftp.twaren.net 
            * updates: ftp.twaren.net 
            ....(前面省略)....
            dmraid-events-logwatch.x86_64 : dmraid logwatch-based email reporting 
            dmraid-events.x86_64 : dmevent_tool (Device-mapper event tool) and DSO 
            iprutils.x86_64 : Utilities for the IBM Power Linux RAID adapters 
            mdadm.x86_64 : The mdadm program controls Linux md devices (software RAID arrays)
            ....(后面省略).... 
            
# 在冒号 (:) 左边的是软件名称,右边的则是在 RPM 内的 name 设定 (软件名) # 瞧!上面的结果,这不就是与 RAID 有关的软件吗?如果想了解mdadm 的软件内容呢? 范例二:找出 mdadm 这个软件的功能为何
            [root@study ~]# yum info mdadm
            Installed Packages #这说明该软件是已经安装的了
            Name : mdadm #这个软件的名称 
            Arch : x86_64 #这个软件的编译架构 
            Version : 3.3.2 #此软件的版本 
            Release : 2.el7 #发布的版本 
            Size : 920 k #此软件的文件总容量 
            Repo : installed #软件库回报说已安装的 
            From repo : anaconda
            Summary : The mdadm program controls Linux md devices (software RAID arrays) 
            URL : http://www.kernel.org/pub/linux/utils/raid/mdadm/ 
            License : GPLv2+ 
            Description : The mdadm program 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@study ~]# yum list
            Installed Packages #已安装软件 
            GConf2.x86_64 3.2.6-8.el7 @anaconda
            LibRaw.x86_64 0.14.8-5.el7.20120830git98d925 @base 
            ModemManager.x86_64 1.1.0-6.git20130913.el7 @anaconda 
            ....(中间省略).... 
            Available Packages #还可以安装的其他软件 
            389-ds-base.x86_64 1.3.3.1-20.el7_1
            updates 389-ds-base-devel.x86_64 1.3.3.1-20.el7_1 updates 
            389-ds-base-libs.x86_64 1.3.3.1-20.el7_1 updates 
            ....(底下省略).... 
            # 上面提供的意义为: 软件名称 版本 在那个软件库内 
            
范例四:列出目前服务器上可供本机进行升级的软件有哪些?
            [root@study ~]# yum list updates #一定要是 updates 喔! 
            Updated Packages 
            NetworkManager.x86_64 1:1.0.0-16.git20150121.b4ea599c.el7_1 updates 
            NetworkManager-adsl.x86_64 1:1.0.0-16.git20150121.b4ea599c.el7_1 updates 
            ....(底下省略).... 
            # 上面就列出在那个软件库内可以提供升级的软件与版本! 
            
范例五:列出提供passwd 这个文件的软件有哪些
            [root@study ~]# yum provides passwd
            passwd-0.79-4.el7.x86_64 : An utility for setting or changing passwords using PAM Repo : base
            passwd-0.79-4.el7.x86_64 : An utility for setting or changing passwords using PAM Repo : @anaconda 
            
# 找到啦!就是上面的这个软件提供了 passwd 这个程序! 通过上面的查询,你应该大致知道 yum如何用在查询上面了吧? 那么实际来应用一下: 例题: 利用 yum 的功能,找出以 pam 为开头的软件名称有哪些?而其中尚未安装的又有哪些? 答: 可以通过如下的方法来查询:
            [root@study ~]# yum list pam*
            Installed Packages 
            pam.x86_64 1.1.8-12.el7 @anaconda 
            pam_krb5.x86_64 2.4.8-4.el7 @base 
            Available Packages #底下则是可升级的或未安装的 
            pam.i686 1.1.8-12.el7_1.1 updates 
            pam.x86_64 1.1.8-12.el7_1.1 updates 
            pam-devel.i686 1.1.8-12.el7_1.1 updates 
            pam-devel.x86_64 1.1.8-12.el7_1.1 updates 
            pam_krb5.i686 2.4.8-4.el7 base 
            pam_pkcs11.i686 0.6.2-18.el7 base 
            pam_pkcs11.x86_64 0.6.2-18.el7 base
            
如上所示,所以可升级者有 pam 这两个软件,完全没有安装的则是 pam-devel 等其他几个软件啰!

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

回到顶部

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

            [root@study ~]# yum [option] [安装与升级的工作项目] [相关参数]
            选项与参数: 
            install :后面接要安装的软件! 
            update :后面接要升级的软件,若要整个系统都升级,就直接 update 即可 
            
范例一:将前一个练习找到的未安装的pam-devel 安装起来
            [root@study ~]# yum install pam-devel
            Loaded plugins: fastestmirror, langpacks # 首先的 5 行在找出最快的 yum server 
            Loading mirror speeds from cached hostfile 
            * base: ftp.twaren.net 
            * extras: ftp.twaren.net 
            * updates: ftp.twaren.net 
            Resolving Dependencies # 接下来先处理属性依赖的软件问题
            -> Running transaction check
            -> Package pam-devel.x86_64 0:1.1.8-12.el7_1.1 will be installed
            -> Processing Dependency: pam(x86-64) = 1.1.8-12.el7_1.1 for package: pam-devel-1.1.8-12.el7_1.1.x86_64
            -> Running transaction check
            -> Package pam.x86_64 0:1.1.8-12.el7 will be updated
            -> Package pam.x86_64 0:1.1.8-12.el7_1.1 will be an update
            -> Finished Dependency Resolution
            Dependencies Resolved
            # 由上面的检查发现到 pam 这个软件也需要同步升级,这样才能够安装新版 pam-devel 喔!
            # 至于底下则是一个总结的表格显示!
            ==========================================================================================
            Package Arch Version Repository Size
            ==========================================================================================
            Installing:
            pam-devel x86_64 1.1.8-12.el7_1.1 updates 183 k 
            Updating for dependencies:
            pam x86_64 1.1.8-12.el7_1.1 updates 714 k
            Transaction Summary
            ==========================================================================================
            Install 1 Package # 要安装的是一个软件
            Upgrade ( 1 Dependent package) # 因为依赖属性问题,需要额外加装一个软件!
            Total size: 897 k
            Total download size: 183 k # 总共需要下载的容量!
            Is this ok [y/d/N]: y # 你得要自己决定是否要下载与安装!当然是 y 啊!
            Downloading packages: # 开始下载啰!
            warning: /var/cache/yum/x86_64/7/updates/packages/pam-devel-1.1.8-12.el7_1.1.x86_64.rpm:
            Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
            Public key for pam-devel-1.1.8-12.el7_1.1.x86_64.rpm is not installed
            pam-devel-1.1.8-12.el7_1.1.x86_64.rpm | 183 kB 00:00:00
            Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
            Importing GPG key 0xF4A80EB5:
            Userid : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>"
            Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
            Package : centos-release-7-1.1503.el7.centos.2.8.x86_64 (@anaconda)
            From : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
            Is this ok [y/N]: y # 只有在第一次安装才会出现这个项目确定要安装数字签名才能继续!
            Running transaction check
            Running transaction test
            Transaction test succeeded
            Running transaction
            Warning: RPMDB altered outside of yum.
            Updating : pam-1.1.8-12.el7_1.1.x86_64 1/3
            Installing : pam-devel-1.1.8-12.el7_1.1.x86_64 2/3
            Cleanup : pam-1.1.8-12.el7.x86_64 3/3
            Verifying : pam-1.1.8-12.el7_1.1.x86_64 1/3
            Verifying : pam-devel-1.1.8-12.el7_1.1.x86_64 2/3
            Verifying : pam-1.1.8-12.el7.x86_64 3/3
            Installed: pam-devel.x86_64 0:1.1.8-12.el7_1.1
            Dependency Updated: pam.x86_64 0:1.1.8-12.el7_1.1
            Complete!
            
有没有很高兴啊!你不必知道软件在哪里,你不必手动下载软件,你也不必拿出原版光盘出来 mount之后查询再安装! 全部不需要,只要有了 yum 这个家伙,你的安装、升级再也不是什么难事! 而且还能主动的进行软件的属性依赖处理流程,如上所示,一口气帮我们处理好了所有事情! 是不是很过瘾啊!而且整个动作完全免费!够酷吧!

移除功能:yum [remove] 软件

回到顶部

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

            [root@study ~]# yum remove pam-devel
            Loaded plugins: fastestmirror, langpacks
            Resolving Dependencies #同样的,先解决属性依赖的问题 
            -> Running transaction check
            -> Package pam-devel.x86_64 0:1.1.8-12.el7_1.1 will be erased
            -> Finished Dependency Resolution
            Dependencies Resolved
            ==========================================================================================
            Package Arch Version Repository Size
            ==========================================================================================
            Removing:
            pam-devel x86_64 1.1.8-12.el7_1.1 @updates 528 k
            Transaction Summary
            ==========================================================================================
            Remove 1 Package # 还好!没有依赖属性的问题,仅移除一个软件!
            Installed size: 528 k
            Is this ok [y/N]: y
            Downloading packages:
            Running transaction check
            Running transaction test
            Transaction test succeeded
            Running transaction
            Erasing : pam-devel-1.1.8-12.el7_1.1.x86_64 1/1
            Verifying : pam-devel-1.1.8-12.el7_1.1.x86_64 1/1
            Removed:
            pam-devel.x86_64 0:1.1.8-12.el7_1.1
            Complete!
            
连移除也这么简单!看来,似乎不需要 rpm 这个指令也能够快乐的安装所有的软件了! 虽然是如此,但是 yum 毕竟是架构在 rpm 上面所发展起来的,所以,initroot认为你还是得需要了解 rpm 才行! 不要学了 yum 之后就将 rpm 的功能忘记了呢!切记切记!

yum配置文件

回到顶部
虽然 yum 是你的主机能够联机上 Internet 就可以直接使用的,不过,由于 CentOS 的映射站台可能 会选错, 举例来说,我们在台湾,但是 CentOS 的映射站台却选择到了大陆北京或者是日本去,有 没有可能发生啊! 有啊!initroot教学方面就常常发生这样的问题,要知道,我们联机到大陆或日本的 速度是非常慢的呢!那怎办? 当然就是手动的修改一下 yum 的配置文件就好啰! 在台湾,CentOS 的映像站台主要有高速网络中心与义守大学,initroot近来比较偏好高速网络中心, 似 乎更新的速度比较快,而且连接台湾学术网络也非常快速哩!因此,initroot底下建议台湾的朋友使用高 速网络中心的 ftp 主机资源来作为 yum 服务器来源喔!不过因为initroot也在昆大服务,昆大目前也加 入了 CentOS 的映射站, 如果在昆山或台南地区,也能够选择昆大的 FTP 喔!目前高速网络中心 与昆大对于 CentOS 所提供的相关网址如下: http://ftp.twaren.net/Linux/CentOS/7/ http://ftp.ksu.edu.tw/FTP/CentOS/7/ 如果你连接到上述的网址后,就会发现里面有一堆连结,那些连结就是这个 yum 服务器所提供的软 件库了! 所以高速网络中心也提供了 centosplus, cloud, extras, fasttrack, os, updates 等软件库,最好 认的软件库就是 os (系统默认的软件) 与 updates (软件升级版本) 啰!由于initroot在我的测试用主机是 利用 x86_64 的版本, 因此那个 os 再点进去就会得到如下的可提供安装的网址: http://ftp.ksu.edu.tw/FTP/CentOS/7/os/x86_64/ 为什么在上述的网址内呢?有什么特色!最重要的特色就是那个 repodata 的目录!该目录就是 分析 RPM 软件后所产生的软件属性依赖数据放置处!因此,当你要找软件库所在网址时, 最重要 的就是该网址底下一定要有个名为 repodata 的目录存在!那就是软件库的网址了! 其他的软件库正 确网址,就请各位看倌自行寻找一下喔!现在让我们修改配置文件吧!
            [root@study ~]# vim /etc/yum.repos.d/CentOS-Base.repo
            [base]
            name=CentOS-$releasever - Base
            mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
            #baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
            gpgcheck=1
            gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
            
如上所示,initroot仅列出 base 这个软件库内容而已,其他的软件库内容请自行查阅啰!上面的数据需 要注意的是: [base]:代表软件库的名字!中括号一定要存在,里面的名称则可以随意取。但是不能有两个相同的软件库 名称, 否则 yum 会不晓得该到哪里去找软件库相关软件列表文件。 name:只是说明一下这个软件库的意义而已,重要性不高! mirrorlist=:列出这个软件库可以使用的映射站台,如果不想使用,可以批注到这行; baseurl=:这个最重要,因为后面接的就是软件库的实际网址! mirrorlist 是由 yum 程序自行去捉映像站 台, baseurl 则是指定固定的一个软件库网址!我们刚刚找到的网址放到这里来啦! enable=1:就是让这个软件库被启动。如果不想启动可以使用 enable=0 喔! gpgcheck=1:还记得 RPM 的数字签名吗?这就是指定是否需要查阅 RPM 文件内的数字签名! gpgkey=:就是数字签名的公钥文件所在位置!使用默认值即可 了解这个配置文件之后,接下来让我们修改整个文件的内容,让我们这部主机可以直接使用高速网络 中心的资源吧! 修改的方式initroot仅列出 base 这个软件库项目而已,其他的项目请您自行依照上述 的作法来处理即可!
            [root@study ~]# vim /etc/yum.repos.d/CentOS-Base.repo
            [base]
            name=CentOS-$releasever - Base
            baseurl=http://ftp.ksu.edu.tw/FTP/CentOS/7/os/x86_64/
            gpgcheck=1
            gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
            [updates]
            name=CentOS-$releasever - Updates
            baseurl=http://ftp.ksu.edu.tw/FTP/CentOS/7/updates/x86_64/
            gpgcheck=1
            gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
            [extras]
            name=CentOS-$releasever - Extrasbaseurl=http://ftp.ksu.edu.tw/FTP/CentOS/7/extras/x86_64/
            gpgcheck=1
            gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
            
# 默认情况下,软件仓库仅有这三个有启用!所以initroot仅修改这三个软件库的 baseurl 而已喔! 接下来当然就是给它测试一下这些软件库是否正常的运作中啊!如何测试呢?再次使用 yum 即可啊! 范例一:列出目前 yum server 所使用的软件库有哪些?
            [root@study ~]# yum repolist all
            repo id repo name status
            C7.0.1406-base/x86_64 CentOS-7.0.1406 - Base disabled
            C7.0.1406-centosplus/x86_64 CentOS-7.0.1406 - CentOSPlus disabled
            C7.0.1406-extras/x86_64 CentOS-7.0.1406 - Extras disabled
            C7.0.1406-fasttrack/x86_64 CentOS-7.0.1406 - CentOSPlus disabled
            C7.0.1406-updates/x86_64 CentOS-7.0.1406 - Updates disabled
            base CentOS-7 - Base enabled: 8,652
            base-debuginfo/x86_64 CentOS-7 - Debuginfo disabled
            base-source/7 CentOS-7 - Base Sources disabled
            centosplus/7/x86_64 CentOS-7 - Plus disabled
            centosplus-source/7 CentOS-7 - Plus Sources disabled
            cr/7/x86_64 CentOS-7 - cr disabled
            extras CentOS-7 - Extras enabled: 181
            extras-source/7 CentOS-7 - Extras Sources disabled
            fasttrack/7/x86_64 CentOS-7 - fasttrack disabled
            updates CentOS-7 - Updates enabled: 1,302
            updates-source/7 CentOS-7 - Updates Sources disabled
            repolist: 10,135
            
# 上面最右边有写 enabled 才是有激活的!由于 /etc/yum.repos.d/ # 有多个配置文件,所以你会发现还有其他的软件库存在。 修改软件库产生的问题与解决之道 由于我们是修改系统默认的配置文件,事实上,我们应该要在 /etc/yum.repos.d/ 底下新建一个文件, 该扩展名必须是 .repo 才行!但因为我们使用的是指定特定的映像站台,而不是其他软件开发商提供 的软件库, 因此才修改系统默认配置文件。但是可能由于使用的软件库版本有新旧之分,你得要知 道, yum 会先下载软件库的清单到本机的 /var/cache/yum 里面去!那我们修改了网址却没有修改软 件库名称 (中括号内的文字), 可能就会造成本机的列表与 yum 服务器的列表不同步,此时就会出 现无法更新的问题了! 那怎么办啊?很简单,就清除掉本机上面的旧数据即可!需要手动处理吗?不需要的, 通过 yum 的 clean 项目来处理即可!
            [root@study ~]# yum clean [packages|headers|all]
            选项与参数:
            packages:将已下载的软件文件删除
            headers :将下载的软件文件头删除
            all :将所有软件库数据都删除!
            
范例一:删除已下载过的所有软件库的相关数据 (含软件本身与列表)
            [root@study ~]# yum clean all
            

yum 的软件群组功能

回到顶部

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

            [root@study ~]# yum [群组功能] [软件群组]
            选项与参数:
            grouplist :列出所有可使用的软件群组组,例如 Development Tools 之类的;
            groupinfo :后面接 group_name,则可了解该 group 内含的所有软件名;
            groupinstall:这个好用!可以安装一整组的软件群组,相当的不错用!
            groupremove :移除某个软件群组;
            
范例一:查阅目前软件库与本机上面的可用与安装过的软件群组有哪些?
            [root@study ~]# yum grouplist
            Installed environment groups: # 已经安装的系统环境软件群组
            Development and Creative Workstation
            Available environment groups: # 还可以安装的系统环境软件群组
            Minimal Install
            Compute Node
            Infrastructure Server
            File and Print Server
            Basic Web Server
            Virtualization Host
            Server with GUI
            GNOME Desktop
            KDE Plasma Workspaces
            Installed groups: # 已经安装的软件群组!
            Development Tools
            Available Groups: # 还能额外安装的软件群组!
            Compatibility Libraries
            Console Internet Tools
            Graphical Administration Tools
            Legacy UNIX Compatibility
            Scientific Support
            Security Tools
            Smart Card Support
            System Administration Tools
            System Management
            Done
            
你会发现系统上面的软件大多是群组的方式一口气来提供安装的!还记全新安装 CentOS 时, 不是 可以选择所需要的软件吗?而那些软件不是利用 GNOME/KDE/X Window ... 之类的名称存在吗? 其实那就是软件群组啰!如果你执行上述的指令后,在Available Groups底下应该会看到一个 Scientific Support的软件群组,想知道那是啥吗?就这样做:
            [root@study ~]# yum groupinfo "Scientific Support"
            Group: Scientific Support
            Group-Id: scientific
            Description: Tools for mathematical and scientific computations, and parallel computing.
            Optional Packages:
            atlas
            fftw
            fftw-devel
            fftw-static
            gnuplot
            gsl-devel
            lapack
            mpich
            ....(以下省略)....
            
你会发现那就是一个科学运算、平行运算会用到的各种工具就是了!而下方则列出许多应该会在该群 组安装时被下载与安装的软件们! 让我们直接来安装看看!
            [root@study ~]# yum groupinstall "Scientific Support"
            
正常情况下系统是会帮你安装好各项软件的。只是伤脑筋的是,刚刚好 Scientific Support 里面的软 件都是可选择的!而不是主要的 (mandatory), 因此默认情况下,上面这些软件通通不会帮 你安装!!如果你想要安装上述的软件,可以使用 yum install atlas fftw .. 一个一个写进去安装~ 如 果想要让 groupinstall 默认安装好所有的 optional 软件呢?那就得要修改配置文件!更改选 groupinstall 选择的软件项目即可!如下所示:
            [root@study ~]# vim /etc/yum.conf
            .....(前面省略).....
            distroverpkg=centos-release
            # 找到这一行,底下新增一行!
            group_package_types=default, mandatory, optional.....(底下省略).....
            [root@study ~]# yum groupinstall "Scientific Support"
            
你就会发现系统开始进行了一大堆软件的安装!那就是啦!这个 group 功能真是非常的方便呢!这 个功能请一定要记下来,对你未来安装软件是非常有帮助的喔! ^_^

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

回到顶部

initroot因为工作的关系,在 Linux 上面经常需要安装第三方协力软件,这包括 NetCDF 以及 MPICH 等等的软件。现在由于平行处理的函式库需求大增, 所以 MPICH 已经纳入默认的 CentOS 7 软件 库中。但是 NetCDF 这个软件就没有包含在里头了~同时,Linux 上面还有个很棒的统计软件,这 个软件名称为 R ! 默认也是不在 CentOS 的软件库内~唉~那怎办?要使用前一章介绍的 Tarball 去编译与安装吗?这倒不需要~因为有很多我们好棒的网友提供预先编译版本了! 在 Fedora 基金会里面发展了一个外加软件计划 (Extra Packages for Enterprise Linux, EPEL),这个计 划主要是针对 Red Hat Enterprise Linux 的版本来开发的, 刚刚好 CentOS 也是针对 RHEL 的版本 来处理的嘛!所以也就能够支持该软件库的相关软件依赖环境了。这个计划的主网站在底下网页: https://fedoraproject.org/wiki/EPEL 而我们的 CentOS 7 主要可以使用的软件仓库网址为: https://dl.fedoraproject.org/pub/epel/7/x86_64/ 除了上述的 Fedora 计划所提供的额外软件库之外,其实社群里面也有朋友针对 CentOS 与 EPEL 的不足而提供的许多软件仓库喔! 底下我是列出当初initroot为了要处理 PCI passthrough 虚拟化而 使用到的 ELRepo 这个软件仓库,若有其他的需求,你就得要自己搜寻了! 这个 ELRepo 软件仓 库与提供给 CentOS 7.x 的网址如下: http://elrepo.org/tiki/tiki-index.php http://elrepo.org/linux/elrepo/el7/x86_64 http://elrepo.org/linux/kernel/el7/x86_64 这个 ELRepo 的软件库跟其他软件库比较不同的地方在于这个软件库提供的数据大多是与核心、核 心模块与虚拟化相关软件有关,例如 NVidia 的驱动程序也在里面咧! 尤其提供了最新的核心 (取 名为 kernel-ml 的软件名称,其实就是最新的 Linux 核心啊!),如果你的系统像initroot的某些发展服 务器一样,那就有可能会使用到这个软件库喔! 好了!根据上面的说明,来玩一玩底下这个模拟案例看看: 问: 我的系统上面想要通过上述的 CentOS 7 的 EPEL 计划来安装 netcdf 以及 R 这两套软件,该如何处理? 答: 首先,你的系统应该要针对 epel 进行 yum 的配置文件处理,处理方式如下:

            [root@study ~]# vim /etc/yum.repos.d/epel.repo
            [epel]
            name = epel packages
            baseurl = https://dl.fedoraproject.org/pub/epel/7/x86_64/
            gpgcheck = 0
            enabled = 0
            
initroot故意不要启动这个软件仓库,只是未来有需要的时候才进行安装,默认不要去找这个软件库! 接下来使用这个软件库来进行安装 netcdf 与 R 的行为喔!
            [root@study ~]# yum --enablerepo=epel install netcdf R
            
这样就可以安装起来了!未来你没有加上 --enablerepo=epel 时,这个 EPEL 的软件并不会更新喔! 使用本机的原版光盘 万一你的主机并没有网络,但是你却有很多软件安装的需求~假设你的系统也都还没有任何升级的动 作过, 这个时候我能不能用本机的光盘来作为主要的软件来源呢?答案当然是可以啊!那要怎么做 呢? 很简单,将你的光盘挂载到某个目录,我们这里还是继续假设在 /mnt 好了,然后设定如下的 yum 配置文件:
            [root@study ~]# vim /etc/yum.repos.d/cdrom.repo
            [mycdrom]
            name = mycdrom
            baseurl = file:///mnt
            gpgcheck = 0
            enabled = 0
            [root@study ~]# yum --enablerepo=mycdrom install software_name
            
这个设定功能在你没有网络但是却需要解决很多软件依赖性的状况时,相当好用啊!

全系统自动升级

回到顶部

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

            [root@study ~]# echo '10 1 * * * root /usr/bin/yum -y --enablerepo=epel update' > /etc/cron.d/yumupdate
            [root@study ~]# vim /etc/crontab
            
从此你的系统就会自动升级啦!很棒吧!此外,你还是得要分析登录档与收集 root 的信件的, 因 为如果升级的是核心软件 (kernel),那么你还是得要重新启动才会让安装的软件顺利运作的! 所以 还是得分析登录档,若有新核心安装,就重新启动,否则就让系统自动维持在最新较安全的环境吧! 真是轻松愉快的管理啊!

管理的抉择:RPM 还是 Tarball

回到顶部

这一直是个有趣的问题:如果我要升级的话,或者是全新安装一个新的软件, 那么该选择 RPM 还 是 Tarball 来安装呢?,事实上考虑的因素很多,不过initroot通常是这样建议的: 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 来安装,轻松又惬意!

基础服务管理:以 Apache 为例

回到顶部

WWW网站服务器需要有WWW服务器软件 + 网页程序语言 + 数据库系统 + 程序语言与数据库的链接软件等等, CentOS需要的软件就有 httpd + php + mariadb-server + php-mysql 这些。
下面我们以为Apache为例,安装httpd服务.服务的安装大概需要如下几个步骤:

1. 安装: yum install (服务)
2. 启动: systemctl start (服务)
3. 开机启动: systemctl enable (服务)
4. 防火墙: firewall-cmd --add-service="(服务)"; firewall-cmd --permanent --add-service="(服务)"
5. 测试: 用软件去查阅你的服务正常与否~
              0. 先检查一下有哪些软件没有安装或已安装:
              [root@study ~]# rpm -q httpd php mariadb-server php-mysql
              httpd-2.4.6-31.el7.centos.1.x86_64 只有这个安装好了,底下三个都没装!
              package php is not installed
              package mariadb-server is not installed
              package php-mysql is not installed
              1. 安装所需的软件:
              [root@study ~]# yum install httpd php mariadb-server php-mysql
              2. 启动与开机启动,这两个步骤要记得一定得进行!
              [root@study ~]# systemctl daemon-reload
              [root@study ~]# systemctl start httpd
              [root@study ~]# systemctl enable httpd
              [root@study ~]# systemctl status httpd
              httpd.service - The Apache HTTP ServerLoaded: loaded (/usr/lib/systemd/system/httpd.service; enabled)
              Active: active (running) since Wed 2015-09-09 16:52:04 CST; 9s ago
              Main PID: 8837 (httpd)
              Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec"
              CGroup: /system.slice/httpd.service
              ├─8837 /usr/sbin/httpd -DFOREGROUND
            
              4. 防火墙设置:
              [root@study ~]# firewall-cmd --add-service="http"
              [root@study ~]# firewall-cmd --permanent --add-service="http"
              [root@study ~]# firewall-cmd --list-all
              public (default, active)
              interfaces: eth0
              sources:
              services: dhcpv6-client ftp http https ssh # 这个是否有启动才是重点!
              ports: 222/tcp 555/tcp
              masquerade: no
              forward-ports:
              icmp-blocks:
              rich rules:
              rule family="ipv4" source address="192.168.1.0/24" accept
            
进入图形界面打开浏览器,在网址列输入http://localhost就会看到apache的初始画面! 那就代表成功了!Linux已经是 Web server了!

SRPM文件的安装:rpmbuild

回到顶部

我们下载了一个SRPM文件,该如何安装它?如何修改里面源码的相关设定值,又该如何订正与重新编译呢? 新版的rpm已经将RPM与SRPM命令分开了,SRPM使用的是rpmbuild命令,而不是rpm.

默认安装SRPM文件(--rebuid/--recompile)

如果不想修订这个文件内的源码与相关的设定值,可以直接编译安装.
rpmbuild有如下选项和直接编译SRPM文件:

--rebuild 编译与打包后面的SRPM文件,最后会生成RPM文件,但并不会安装到系统上。 --rebuild会打印如下行:Wrote: /root/rpmbuild/RPMS/x86_64/pkgname.x86_64.rpm 这个就是编译完成的RPM文件!可以用rpm命令安装这个rpm文件,安装的时候请加绝对路径!
--recompile 该选项编译打包并安装!请注意, rebuild仅编译和打包,recompile不但进行编译打包,还会执行安装.
这两个选项都没有修改SRPM内的设定值,仅是通过编译产生可安装软件文件RPM而已。
一般来说,如果编译的动作顺利的话,那么编译过程所产生的中间暂存盘都会被自动删除,如果发生任何错误, 则该中间文件会被保留在系统上,等待用户的除错动作!
下面以安装ntp为例.先下载软件ntp安装包srpm文件:
              [root@study ~]# wget http://vault.centos.org/7.1.1503/updates/Source/SPackages/ntp-4.2.6p5-19.el7.centos.1.src.rpm
            
直接编译但不安装:
              [root@study ~]# rpmbuild --rebuild ntp-4.2.6p5-19.el7.centos.1.src.rpm
            
上面会提示还有一堆依赖软件没有安装,安装依赖的软件:
              [root@study ~]# yum install libcap-devel openssl-devel libedit-devel pps-tools-devel autogen autogen-libopts-devel
            
再次编译:
              [root@study ~]# rpmbuild --rebuild ntp-4.2.6p5-19.el7.centos.1.src.rpm
            
最终生成文件:/root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-19.el7.centos.1.x86_64.rpm 上面使用默认的编译参数编译,没有修改编译配置参数, 一般来说,如果你需要用到SRPM文件,大部分原因就是需要重新修改里面的某些编译参数,让软件加入某些特殊功能。 所以此时得将SRPM拆开,编辑一下编译配置文件,然后再重新编译,下面介绍如何编辑配置文件!

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

SRPM安装、设定、编译、最终结果所使用的目录都与用户的家目录有关,如果用root身份来操作SRPM, 那么就会用到下列的目录:

/root/rpmbuild/SPECS 这个目录当中放置的是该软件的配置文件,例如这个软件的信息参数、设定项目等等都放置在这里;
/root/rpmbuild/SOURCES 这个目录当中放置的是该软件的原始文件 (*.tar.gz 的文件) 以及 config 这个配置文件;
/root/rpmbuild/BUILD 在编译的过程中,有些暂存的数据都会放置在这个目录当中;
/root/rpmbuild/RPMS 经过编译之后,并且顺利的编译成功之后,将打包完成的文件放置在这个目录当中。里头有包含了 x86_64, noarch.... 等等的次目录。
/root/rpmbuild/SRPMS 与 RPMS 内相似的,这里放置的就是 SRPM 封装的文件啰!有时候你想要将你的软件用 SRPM 的方式发布时, 你的 SRPM 文件就会放置在这个目录中了。
早期必须用root身份才能编译,源码都会被放到/usr/src/redhat/目录!跟目前放置到/~username/rpmbuild/的情况不太一样! 此外,在编译的过程当中,可能会发生不明的错误,或者是设定的错误,这个时候就会在 /tmp 底下产生一个相对应的错误文件,可以根据该错误文件进行除错! 等到所有的问题都解决之后,也编译成功了,那么刚刚解压缩之后的文件, 就是在 /root/rpmbild/{SPECS, SOURCES, BUILD} 等等的文件都会被杀掉,而只剩下放置在 /root/rpmbuild/RPMS 底下的文件了!
由于SRPM文件需要编译,编译至少需要有make与gcc等c, c++程序语言编译工具来编译。需要事先使用yum来安装"Development Tools"软件群组!
将下载的ntp SRPM软件安装到系统中(不要编译),然后查阅一下所有用到的目录:
              [root@study ~]# rpm -ivh ntp-4.2.6p5-19.el7.centos.1.src.rpm
              Updating / installing...
              1:ntp-4.2.6p5-19.el7.centos.1 ################################# [100%]
              warning: user mockbuild does not exist - using root
              warning: group mockbuild does not exist - using root
              可以忽略上述的一堆warning
            
查看/root/rpmbuild目录的内容:
              [root@study ~]# ll -l /root/rpmbuild
              drwxr-xr-x. 3 root root 39 Sep 8 16:16 BUILD
              drwxr-xr-x. 2 root root 6 Sep 8 16:16 BUILDROOT
              drwxr-xr-x. 4 root root 32 Sep 8 16:16 RPMS
              drwxr-xr-x. 2 root root 4096 Sep 9 09:43 SOURCES
              drwxr-xr-x. 2 root root 39 Sep 9 09:43 SPECS 这个最重要!
              drwxr-xr-x. 2 root root 6 Sep 8 14:51 SRPMS
              [root@study ~]# ll -l /root/rpmbuild/{SOURCES,SPECS}
              /root/rpmbuild/SOURCES:
              -rw-rw-r--. 1 root root 559 Jun 24 07:44 ntp-4.2.4p7-getprecision.patch
              -rw-rw-r--. 1 root root 661 Jun 24 07:44 ntp-4.2.6p1-cmsgalign.patch
              .....(中间省略).....
              /root/rpmbuild/SPECS:
              -rw-rw-r--. 1 root root
              41422 Jun 24 07:44 ntp.spec 这个最重要!
            

编辑配置文件(*.spec)

/root/rpmbuild/SOURCES目录下存放源码文件(tarball)及相关的补丁文件(patch file), 源码编译的大概步骤是./configure, make, make check, make install等,这些步骤就记录在SPECS目录中的spec文件中:

              [root@study ~]# cd /root/rpmbuild/SPECS
              [root@study SPECS]# vim ntp.spec
              1. 这部分介绍整个软件的基本相关信息,包括版本,发布次数等
              Summary: The NTP daemon and utilities 简易的说明软件的功能
              Name: ntp                             软件的名称
              Version: 4.2.6p5                      # 软件的版本
              Release: 19%{?dist}.1                 # 软件的发布版次
              # primary license (COPYRIGHT) : MIT
              .......
              License: (MIT and BSD and BSD with advertising) and GPLv2
              Group: System Environment/Daemons
              Source0: http://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/ntp-4.2/ntp-%{version}.tar.gz
              Source1: ntp.conf                    SourceN就是源码
              Source2: ntp.keys                    源码可以有很多个
              .......
              Patch1: ntp-4.2.6p1-sleep.patch      PatchN是补丁文件
              Patch2: ntp-4.2.6p4-droproot.patch
              .......

              2. 这部分设定依赖关系
              URL: http://www.ntp.org               下面说明软件的依赖性
              Requires(post): systemd-units         编译过程需要的软件
              Requires(preun): systemd-units
              Requires(postun): systemd-units
              Requires: ntpdate = %{version}-%{release}
              BuildRequires: libcap-devel openssl-devel libedit-devel perl-HTML-Parser
              BuildRequires: pps-tools-devel autogen autogen-libopts-devel systemd-units
              .......
              %package -n ntpdate                   软件包含有很多次软件
              Summary: Utility to set the date and time via NTP
              Group: Applications/System
              Requires(pre): shadow-utils
              Requires(post): systemd-units
              Requires(preun): systemd-units
              Requires(postun): systemd-units
              ......

              3. 编译前的预处理,以及编译过程当中所需要进行的指令,%build下的数据几乎就是makefile里面的信息 
              %prep                                这部份大多在处理补丁
              %setup -q -a 5
              %patch1 -p1 -b .sleep                这些patch与前面的PatchN有关
              %patch2 -p1 -b .droproot
              ......
              %build                               其实就是./configure, make 等动作!
              sed -i 's|$CFLAGS -Wstrict-overflow|$CFLAGS|' configure sntp/configure
              export CFLAGS="$RPM_OPT_FLAGS -fPIE -fno-strict-aliasing -fno-strict-overflow"
              export LDFLAGS="-pie -Wl,-z,relro,-z,now"
              %configure \                         就是./configure
                --sysconfdir=%{_sysconfdir}/ntp/crypto \
                --with-openssl-libdir=%{_libdir} \
                --without-ntpsnmpd \
                --enable-all-clocks --enable-parse-clocks \
                --enable-ntp-signd=%{_localstatedir}/run/ntp_signd \
                --disable-local-libopts
              echo '#define KEYFILE "%{_sysconfdir}/ntp/keys"' >> ntpdate/ntpdate.h
              echo '#define NTP_VAR "%{_localstatedir}/log/ntpstats/"' >> config.h
              make %{?_smp_mflags}                 就是 make
              
              .......
              %install                             安装过程所进行的各项动作
              make DESTDIR=$RPM_BUILD_ROOT bindir=%{_sbindir} install
              mkdir -p $RPM_BUILD_ROOT%{_mandir}/man{5,8}
              sed -i 's/sntp\.1/sntp\.8/' $RPM_BUILD_ROOT%{_mandir}/man1/sntp.1mv
              $RPM_BUILD_ROOT%{_mandir}/man{1/sntp.1,8/sntp.8}
              rm -rf $RPM_BUILD_ROOT%{_mandir}/man1
              .......

              4. 这里列出这个软件发布的文件有哪些
              %files                               # 这软件所属的文件有哪些的意思!
              %dir %{ntpdocdir}
              %{ntpdocdir}/COPYRIGHT
              %{ntpdocdir}/ChangeLog
              .......

              5. 列出这个软件的更改历史纪录
              %changelog
              * Tue Jun 23 2015 CentOS Sources <bugs@centos.org> - 4.2.6p5-19.el7.centos.1
              - rebrand vendorzone
              * Thu Apr 23 2015 Miroslav Lichvar <mlichvar@redhat.com> 4.2.6p5-19.el7_1.1
              - don't step clock for leap second with -x option (#1191122)
              .......
            
ntp.sepc就是将SRPM编译成RPM的配置文件,基本规则如下:
1. 文件的开头以Summary开始,这部份都是最基础的说明内容;
2. 每个不同的段落之间都以 % 做为开头,例如 %prep 与 %install等;

下面介绍几个常见的SRPM配置段落:

系统整体信息方面:
参数 参数意义
Summary 本软件的主要说明,例如上表中说明了本软件是针对 NTP 的软件功能与工具等啦!
Name 本软件的软件名称 (最终会是 RPM 文件的文件名构成之一)
Version 本软件的版本 (也会是 RPM 文件名的构成之一)
Release 这个是该版本打包的次数说明 (也会是 RPM 文件名的构成之一)。由于我们想要动点手脚,所以请将19%{?dist}.1 修改为 20.initroot 看看
License 这个软件的授权模式,看起来涵盖了所有知名的 Open source 授权啊!!
Group 这个软件在安装的时候,主要是放置于哪一个软件群组当中 (yum grouplist 的特点!);
URL 这个源码的主要官方网站;
SourceN 这个软件的来源,如果是网络上下载的软件,通常一定会有这个信息来告诉大家这个原始档的来源!此外,如果有多个软件来源,就会以 Source0, Source1... 来处理源码喔!
PatchN 就是作为补丁的 patch file 啰!也是可以有好多个!
BuildRoot 设定作为编译时,该使用哪个目录来暂存中间文件 (如编译过程的目标文件/链接文件等档)。上述为必须要存在的项目,底下为可使用的额外设定值
Requires 如果你这个软件还需要其他的软件的支持,那么这里就必需写上来,则当你制作成 RPM 之后,系统就会自动的去检查啦!这就是依赖属性的主要来源啰!
BuildRequires 编译过程中所需要的软件。Requires 指的是安装时需要检查的,因为与实际运作有关,这个BuildRequires 指的是编译时所需要的软件,只有在 SRPM 编译成为 RPM 时才会检查的项目。
上面几个资料通常都必需要写啦!但是如果你的软件没有依赖属性的关系时,那么就可以不需要那个Requires 啰!
根据上面的设定,最终的文件名就会是{Name}-{Version}-{Release}.{Arch}.rpm的样式,
以我们上面的设定来说,文件名应该会是ntp-4.2.6p5-20.initroot.x86_64.rpm的样子啰!
%description: 将你的软件做一个简短的说明!这个也是必需要的。还记得使用 rpm -qi 软件名称 会出现一些基础的说明吗? 上面这些东西包括 Description 就是在显示这些重要信息的啦!所以,这里记得要详加解释喔!
%prep: pre 这个关键词原本就有在...之前的意思,因此这个项目在这里指的就是尚未进行设定或安装之前, 你要编译完成的 RPM 帮你事先做的事情,就是 prepare 的简写啰!那么他的工作事项主要有:
1. 进行软件的补丁 (patch) 等相关工作;
2. 寻找软件所需要的目录是否已经存在?确认用的!
3. 事先建立你的软件所需要的目录,或者事先需要进行的任务;
4. 如果待安装的 Linux 系统内已经有安装的时候可能会被覆盖掉的文件时,那么就必需要进行备份(backup)的工作了!
在本案例中,你会发现程序会使用 patch 去进行补丁的动作啦!所以程序的源码才会更新到最新啊!
%build:build 就是建立啊!所以当然啰,这个段落就是在谈怎么 make 编译成为可执行的程序啰! 你会发现在此部分的程序代码方面,就是 ./configure, make 等项目哩!一般来说,如果你会使用 SRPM 来进行重新编译的行为, 通常就是要重新 ./configure 并给予新的参数设定!于是这部份就可能会修改到!
%install: 编译完成 (build) 之后,就是要安装啦!安装就是写在这里,也就是类似 Tarball 里面的 make install的意思啰!
%files: 这个软件安装的文件都需要写到这里来,当然包括了目录喔!所以连同目录请一起写到这个段落当中!以备查验呢!^_^ ! 此外,你也可以指定每个文件的类型,包括文件档 (%doc 后面接的) 与 配置文件 (%config 后面接的) 等等。
%changelog: 这个项目主要则是在记录这个软件曾经的更新纪录啰!星号 (*) 后面应该要以时间,修改者, email与软件版本来作为说明, 减号 (-) 后面则是你要作的详细说明啰! 在这部份initroot就新增了两行,内容如下:
%changelog
* Wed Sep 09 2015 INITroot Tsai <initroot@mail.initroot.idv.tw>- 4.2.6p5-20.initroot
- only rbuild this SRPM to RPM
* Tue Jun 23 2015 CentOS Sources <bugs@centos.org> - 4.2.6p5-19.el7.centos.1
- rebrand vendorzone
....(底下省略)....
rpm -q查询一堆信息时, 其实都是在这里写入的!让我们来了解一下如何将 SRPM编译出 RPM!

使用rpmbuild命令将/root/rpmbuild目录下的数据编译打包成RPM或SRPM:

              编译并同时生成RPM与SRPM文件:
              [root@study ~]# rpmbuild -ba ntp.spec
              仅编译成RPM文件:
              [root@study ~]# rpmbuild -bb ntp.spec
            
rpmbuild会执行如下步骤:
1. 进入到BUILD目录,即:/root/rpmbuild/BUILD目录;
2. 依照*.spec文件内的Name与Version创建生成目录,上例中rpmbuild会在BUILD目录中先删除ntp-4.2.6p5目录,再新建一个ntp-4.2.6p5目录,并进入该目录;
3. 在新建的目录里,对SOURCES目录下的来源文件,也就是*.spec里Source指定的那个文件,以tar进行解压缩, 即在/root/rpmbuild/BUILD/ntp-4.2.6p5当中,将/root/rpmbuild/SOURCES/ntp-*等等多个源码文件进行解压缩;
4. 开始 %build 及 %install 的设定与编译!
5. 最后将完成打包的文件给他放置到该放置的地方去,如果你的系统是 x86_64 的话,那么最后编译成功的 *.x86_64.rpm文件就会被放置在 /root/rpmbuild/RPMS/x86_64! 如果是 noarch 那就是 /root/rpmbuild/RPMS/noarch目录!
最后的结果数据会放置在RPMS目录!想要同时打包RPM与SRPM,执行rpmbuild -ba ntp.spec:
              [root@study ~]# cd /root/rpmbuild/SPECS 
              [root@study SPECS]# rpmbuild -ba ntp.spec 
              .....(前面省略).....
              Wrote: /root/rpmbuild/SRPMS/ntp-4.2.6p5-20.initroot.src.rpm
              Wrote: /root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-20.initroot.x86_64.rpm
              Wrote: /root/rpmbuild/RPMS/noarch/ntp-perl-4.2.6p5-20.initroot.noarch.rpm
              Wrote: /root/rpmbuild/RPMS/x86_64/ntpdate-4.2.6p5-20.initroot.x86_64.rpm
              Wrote: /root/rpmbuild/RPMS/x86_64/sntp-4.2.6p5-20.initroot.x86_64.rpm
              Wrote: /root/rpmbuild/RPMS/noarch/ntp-doc-4.2.6p5-20.initroot.noarch.rpm
              Wrote: /root/rpmbuild/RPMS/x86_64/ntp-debuginfo-4.2.6p5-20.initroot.x86_64.rpm
              Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.xZh6yz 
              + umask 022 
              + cd /root/rpmbuild/BUILD 
              + cd ntp-4.2.6p5 
              + /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/ntp-4.2.6p5-20.initroot.x86_64 
              + exit 0 
              [root@study SPECS]# find /root/rpmbuild -name 'ntp*rpm' 
              /root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-20.initroot.x86_64.rpm
              /root/rpmbuild/RPMS/x86_64/ntpdate-4.2.6p5-20.initroot.x86_64.rpm
              /root/rpmbuild/RPMS/x86_64/ntp-debuginfo-4.2.6p5-20.initroot.x86_64.rpm
              /root/rpmbuild/RPMS/noarch/ntp-perl-4.2.6p5-20.initroot.noarch.rpm
              /root/rpmbuild/RPMS/noarch/ntp-doc-4.2.6p5-20.initroot.noarch.rpm
              /root/rpmbuild/SRPMS/ntp-4.2.6p5-20.initroot.src.rpm
            
上面分别是RPM与SRPM的文件! initroot的软件出现了! 有些文件软件与硬件等级无关(单纯的文件),所以会发现ntp-doc-4.2.6p5-20.initroot.noarch.rpm是noarch!

打包发布自己的软件

回到顶部

假设我们自己开发了一款软件,现在要打包发布给用户安装.现在我们将这个程序加上Makefile, 打包成main-0.1-1.x86_64.rpm. 假设目前我手头有两个文件,分别是源码tarball文件,和用于升级的patch文件:
main-0.1.tar.gz放在 /root/rpmbuild/SOURCES/
main_0.1_to_0.2_patch 放在 /root/rpmbuild/SOURCES/
main.spec 自行撰写放在 /root/rpmbuild/SPECS/

              [root@study ~]# cd /root/rpmbuild/SOURCES
              [root@study SOURCES]# wget http://linux.initroot.org/linux_basic/0520source/main-0.1.tgz 
              [root@study SOURCES]# wget http://linux.initroot.org/linux_basic/0520source/main_0.1_to_0.2.patch 
              [root@study SOURCES]# ll main* 
              -rw-r--r--. 1 root root 703 Sep 4 14:47 main-0.1.tgz
              -rw-r--r--. 1 root root 1538 Sep 4 14:51 main_0.1_to_0.2.patch 
            
接下来新建编辑spec文件,*.spec配置文件是所有RPM制作里面最重要的环节,必须要仔细的设置,CentOS 7.x会主动的将必要的设定参数列出来喔!
              [root@study ~]# cd /root/rpmbuild/SPECS
              [root@study SPECS]# vim main.spec
              Name: main 
              Version: 0.1 
              Release: 1%{?dist} 
              Summary: Shows sin and cos value. 
              Group: Scientific Support 
              License: GPLv2 
              URL: http://linux.initroot.org/ 
              Source0: main-0.1.tgz   # 这两个文件名要正确喔!
              Patch0: main_0.1_to_0.2.patch 
              %description 
              This package will let you input your name and calculate sin cos value. 

              %prep 
              %setup -q 
              %patch0 -p1 # 要用来作为 patch 的动作!

              %build      
              make clean main # 编译就好!不要安装!

              %install 
              mkdir -p %{buildroot}/usr/local/bin 
              install -m 755 main %{buildroot}/usr/local/bin #这才是顺利的安装行为! 

              %files 
              /usr/local/bin/main 
              
              %changelog 
              * Wed Sep 09 2015 INITroot Tsai <initroot@mail.initroot.idv.tw> 0.2
              - build the program
            
spec文件创建好后,就可以编译打包成为RPM与SRPM了:
              [root@study SPECS]# rpmbuild -ba main.spec
              .....(前面省略).....
              Wrote: /root/rpmbuild/SRPMS/main-0.1-1.el7.centos.src.rpm
              Wrote: /root/rpmbuild/RPMS/x86_64/main-0.1-1.el7.centos.x86_64.rpm
              Wrote: /root/rpmbuild/RPMS/x86_64/main-debuginfo-0.1-1.el7.centos.x86_64.rpm
            
这样RPM文件就打包好了,接下来我们安装测试一下:
              安装/测试/实际查询:
              [root@study ~]# yum install
              /root/rpmbuild/RPMS/x86_64/main-0.1-1.el7.centos.x86_64.rpm
              [root@study ~]# rpm -ql main
              /usr/local/bin/main
              [root@study ~]# rpm -qi main
              Name : main
              Version : 0.1
              Release :
              1.el7.centos
              Architecture: x86_64
              Install Date: Wed 09 Sep 2015 04:29:08 PM CST
              Group : Scientific Support
              Size : 7200
              License : GPLv2
              Signature : (none)
              Source RPM : main-0.1-1.el7.centos.src.rpm
              Build Date : Wed 09 Sep 2015 04:27:29 PM CST
              Build Host : study.centos.initroot
              Relocations : (not relocatable)
              URL : http://linux.initroot.org/
              Summary : Shows sin and cos value.
              Description : This package will let you input your name and calculate sin cos value.
            
用很简单的方式,就可以将自己的软件或程序打包发布了!

总结

回到顶部

软件包管理器提供软件查询,安装,升级,卸载等功能,软件开发商只需将自己开发的软件编译好,打包成特殊格式的安装包文件并发布。 用户安装软件变得简单,常见的软件包管理器有RPM与DPKG两大主流。

RPM全名是RedHat Package Manager,由Red Hat公司开发,流传甚广;
RPM类型的软件安装包含有经过编译后的binary program,可直接安装在用户操作系统上; RPM最大的问题为软件之间的依赖性问题,RPM对用户的安装环境要求严格,必须满足软件的依赖关系;
RPM除了将软件安装至用户的系统上之外,还会将该软件的版本、名称、文件与目录配置、系统需求等等记录到数据库(/var/lib/rpm)中,方便查询,升级和卸载等操作;
RPM可针对不同的cpu硬件等级优化编译,生成的安装包文件用扩展名 (i386, i586, i686, x86_64, noarch) 来区分;
SRPM为Source RPM,安装包内含的文件为Source code而非binary file,安装SRPM时还需要经过compile;
SRPM最大的优点就是可以让用户自行修改设定参数(makefile/configure的参数) ,以符合用户自己的Linux环境;
RPM软件的属性依赖问题,可以由yum,APT等工具解决。
CentOS使用的是yum机制。 yum服务器提供多个不同的软件库存放软件,以提供客户端分别管理软件类别。

通过EPEL安装NTFS文件系统所需要的软件:
o 目标:利用 EPEL 提供的软件搜寻是否有NTFS所需要的各项模块;
o 目标:Linux必须接上Internet;
o 需求:最好了解磁盘容量是否够用,以及如何启动服务等。
操作如下:
o 使用 yum --enablerepo=epel search ntfs 找出所需要的软件名称
o 再使用 yum --enablerepo=epel install ntfs-3g ntfsprogs 来安装即可!

如果你曾经修改过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
你认为强制安装之后,该软件是否可以正常执行?为什么?
一般来说,应该是不能执行的,因为该软件具有依赖属性的问题,某些时刻该软件的程序可能需要呼叫外部的函式库, 但函式库可能未安装,因此当然无法执行成功。
有些人使用 CentOS 7.x 安装在自己的 Atom CPU上面,却发现无法安装,在查询了该原版光盘的内容, 发现里面的文件名为 ***.x86_64.rpm 。
请问,无法安装的可能原因为何?
Atom 虽然也是属于 x86的架构,但是某些 atom 是属于 32 位的系统。但是 CentOS 7 已经仅发布 64 位的版本,所以当然 无法安装了!
请问我使用 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 去安装该软件看看。

本文由initroot编辑整理,转载请注明www.initroot.com