Linux基础知识 ·

Linux软件管理

[隐藏]

Linux界量大主流软件包机制:

  • dpkg
    这个机制最早是由 Debian Linux 社群所开发出来的,通过 dpkg 的机制, Debian 提供的软件就能够简单的安装起来,同时还能提供安装后的软件信息,实在非常不错。 只要是衍生于 Debian 的其他 Linux distributions 大多使用 dpkg 这个机制来管理软件的, 包括 B2D, Ubuntu 等等。
  • RPM
    这个机制最早是由 Red Hat 这家公司开发出来的,后来实在很好用,因此很多 distributions 就使用这个机制来作为软件安装的管理方式。包括 Fedora, CentOS, SuSE 等等知名的开发商都是用这咚咚。

dpkg/rpm 这些机制或多或少都会有软件属性相依的问题,为了解决这些问题,基于这些软件包基础又衍生出了线上管理机制,将软件依赖关系做成列表,安装的时候自动根据依赖关系安装所需依赖环境,通过这个机制,我们可以方便的安装已编译好的各种软件了。

在 dpkg 管理机制上就开发出 APT 的线上升级机制,RPM 则依开发商的不同,有 Red Hat 系统的 yum , SuSE 系统的 Yast Online Update (YOU), Mandriva 的 urpmi 软件等。

什么是 RPM 与 SRPM

RPM 全名是 RedHat Package Manager 简称则为 RPM。

  1. 已经编译完成并且打包完毕,所以软件传输与安装上很方便 (不需要再重新编译)。
  2. 软件的信息都已经记录在 Linux 主机的数据库上,很方便查询、升级与反安装。
  3. 软件文件安装的环境必须与打包时的环境需求一致或相当。
  4. 需要满足软件的相依属性需求。
  5. 反安装时需要特别小心,最底层的软件不可先移除,否则可能造成整个系统的问题!

SRPM 全名 Source RPM

  1. 相对RPM增加了源码。
  2. 若是当前机器与编译好的RPM不兼容,则可自行编译。
  3. SRPM 的扩展名是以 ***.src.rpm。

什么是 i386, i586, i686, noarch, x86_64

编译好的软件包通常会以一定的规范来命名,其名称中主要是以“-”来隔开各个部分,这样子可以很清楚的发现该软件的名称、 版本信息、打包次数与操作的硬件平台!

从左到右,其命名规范为:

  • 软件名称
    当然就是每一个软件的名称了!
  • 版本信息
    每一次升级版本就需要有一个版本的信息,否则如何知道这一版是新是旧?这里通常又分为主版本跟次版本。以上面为例,主版本为 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 方面的软件。

RPM 的优点

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

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

RPM 自动解决依赖关系的方式: YUM 线上升级

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

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

RPM 默认安装的路径

一般来说,RPM 类型的文件在安装的时候,会先去读取文件内记载的配置参数内容,然后将该数据用来比对 Linux 系统的环境,以找出是否有属性相依的软件尚未安装的问题。

若环境检查合格了,那么 RPM 文件就开始被安装到你的 Linux 系统上。安装完毕后,该软件相关的信息就会被写入/var/lib/rpm/ 目录下的数据库文件中了。

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

RPM 安装 (install)

一般安装使用rpm -ivh 软件包 ,不过还有以下常用选项:

--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 升级与升级 (upgrade/freshen)

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

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

RPM 查询 (query)

RPM 在查询的时候,其实查询的地方是在 /var/lib/rpm/ 这个目录下的数据库文件。

RPM 验证与数码签章 (Verify/signature)

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

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

你会发现在文件名之前有个 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) 文件的创建时间已被改变

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

至于那个 c 代表的是『 Config file 』的意思,也就是文件的类型,文件类型有底下这几类:

  • c :配置文件 (config file)
  • d :文件数据文件 (documentation)
  • g :鬼文件~通常是该文件不被某个软件所包含,较少发生!(ghost file)
  • l :授权文件 (license file)
  • r :读我文件 (read me)

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


  • 数码签章 (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 的数码签章位于:

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

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

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

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

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

参与评论