22.2 RPM软件管理程序-rpm
RPM 的使用其实不难,只要使用 rpm 这个指令即可!鸟哥最喜欢的就是 rpm 指令的查询功能了,可以让我很轻易的就知道某个系统有没有安装鸟哥要的软件呢!此外, 我们最好还是得要知道一下,到底 RPM 类型的文件他们是将软件的相关文件放置在哪里呢?还有,我们说的那个 RPM 的数据库又是放置在哪里呢?
Tips 事实上,下一小节要讲的 yum 就可以直接用来进行安装的动作,基本上 rpm 这个指令真的就只剩下查询与检验的功能啰! 所以,查询与检验还是要学的,至于安装,通过 yum 就好了!
22.2.1 RPM 默认安装的路径
一般来说,RPM 类型的文件在安装的时候,会先去读取文件内记载的设置参数内容,然后将该数据用来比对 Linux 系统的环境,以找出是否有属性相依的软件尚未安装的问题。例如 Openssh 这个连线软件需要通过 Openssl 这个加密软件的帮忙,所以得先安装 openssl 才能装 openssh 的意思。那你的环境如果没有 openssl , 你就无法安装 openssh 的意思啦。
若环境检查合格了,那么 RPM 文件就开始被安装到你的 Linux 系统上。安装完毕后,该软件相关的信息就会被写入 /var/lib/rpm/ 目录下的数据库文件中了。 上面这个目录内的数据很重要喔!因为未来如果我们有任何软件升级的需求,版本之间的比较就是来自于这个数据库, 而如果你想要查询系统已经安装的软件,也是从这里查询的!同时,目前的 RPM 也提供数码签章信息, 这些数码签章也是在这个目录内记录的呢!所以说,这个目录得要注意不要被删除了啊!
那么软件内的文件到底是放置到哪里去啊?当然与文件系统有关对吧!我们在[第五章的目录配置]谈过每个目录的意义, 这里再次的强调啰:
/usr/bin
一些可可执行文件案
/usr/lib
一些程序使用的动态函数库
/usr/share/doc
一些基本的软件使用手册与说明文档
/usr/share/man
一些 man page 文件
好了,下面我们就来针对每个 RPM 的相关指令来进行说明啰!
22.2.2 RPM 安装 (install)
因为安装软件是 root 的工作,因此你得要是 root 的身份才能够操作 rpm 这指令的。 用 rpm 来安装很简单啦!假设我要安装一个文件名为 rp-pppoe-3.11-5.el7.x86_64.rpm 的文件,那么我可以这样:(假设原版光盘已经放在 /mnt 下面了)
不过,这样的参数其实无法显示安装的进度,所以,通常我们会这样下达安装指令:
另外,如果我们在安装的过程当中发现问题,或者已经知道会发生的问题, 而还是“执意”要安装这个软件时,可以使用如下的参数“强制”安装上去:
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 的软件,你手边只有原版光盘,该如何是好?答:你可以通过挂载原版光盘来进行数据的查询与安装。请将原版光盘放入光驱,下面我们尝试将光盘挂载到 /mnt 当中, 并据以处理软件的下载啰:
挂载光盘,使用: mount /dev/sr0 /mnt
找出文件的实际路径:find /mnt -name 'pam-devel*'
测试此软件是否具有相依性: rpm -ivh pam-devel... --test
直接安装: rpm -ivh pam-devel...
卸载光盘: umount /mnt
在鸟哥的系统中,刚好这个软件并没有属性相依的问题,因此最后一个步骤可以顺利的进行下去呢!
22.2.3 RPM 升级与更新 (upgrade/freshen)
使用 RPM 来升级真是太简单了!就以 -Uvh 或 -Fvh 来升级即可,而 -Uvh 与 -Fvh 可以用的选项与参数,跟 install 是一样的。不过, -U 与 -F 的意义还是不太一样的,基本的差别是这样的:
-Uvh
后面接的软件即使没有安装过,则系统将予以直接安装; 若后面接的软件有安装过旧版,则系统自动更新至新版;
-Fvh
如果后面接的软件并未安装到你的 Linux 系统上,则该软件不会被安装;亦即只有已安装至你 Linux 系统内的软件会被“升级”!
由上面的说明来看,如果你想要大量的升级系统旧版本的软件时,使用 -Fvh 则是比较好的作法,因为没有安装的软件才不会被不小心安装进系统中。但是需要注意的是,如果你使用的是 -Fvh ,偏偏你的机器上尚无这一个软件,那么很抱歉,该软件并不会被安装在你的 Linux 主机上面,所以请重新以 ivh 来安装吧!
早期没有 yum 的环境下面,同时网络带宽也很糟糕的状况下,通常有的朋友在进行整个操作系统的旧版软件修补时,喜欢这么进行:
先到各发展商的 errata 网站或者是国内的 FTP 图像站捉下来最新的 RPM 文件;
使用 -Fvh 来将你的系统内曾安装过的软件进行修补与升级!(真是方便呀!)
所以,在不晓得 yum 功能的情况下,你依旧可以到 CentOS 的映设站台下载 updates 数据,然后利用上述的方法来一口气升级! 当然啰,升级也是可以利用 --nodeps/--force 等等的参数啦! 不过,现在既然有 yum 的机制在,这个笨方法当然也就不再需要了!
22.2.4 RPM 查询 (query)
RPM 在查询的时候,其实查询的地方是在 /var/lib/rpm/ 这个目录下的数据库文件啦!另外, RPM 也可以查询未安装的 RPM 文件内的信息喔!那如何去查询呢? 我们先来谈谈可用的选项有哪些?
在查询的部分,所有的参数之前都需要加上 -q 才是所谓的查询!查询主要分为两部分, 一个是查已安装到系统上面的的软件信息,这部份的信息都是由 /var/lib/rpm/ 所提供。另一个则是查某个 rpm 文件内容, 等于是由 RPM 文件内找出一些要写入数据库内的信息就是了,这部份就得要使用 -qp (p 是 package 的意思)。 那就来看看几个简单的范例吧!
常见的查询就是这些了!要特别说明的是,在查询本机上面的 RPM 软件相关信息时, 不需要加上版本的名称,只要加上软件名称即可!因为他会由 /var/lib/rpm 这个数据库里面去查询, 所以我们可以不需要加上版本名称。但是查询某个 RPM 文件就不同了,我们必须要列出整个文件的完整文件名才行~ 这一点朋友们常常会搞错。下面我们就来做几个简单的练习吧!
例题:
我想要知道我的系统当中,以 c 开头的软件有几个,如何实做?
我的 WWW 服务器为 Apache ,我知道他使用的 RPM 软件文件名为 httpd 。现在,我想要知道这个软件的所有配置文件放置在何处,可以怎么作?
承上题,如果查出来的设置文件已经被我改过,但是我忘记了曾经修改过哪些地方,所以想要直接重新安装一次该软件,该如何作?
如果我误砍了某个重要文件,例如 /etc/crontab,偏偏不晓得他属于哪一个软件,该怎么办?
答:
rpm -qa | grep ^c | wc -l
rpm -qc httpd
假设该软件在网络上的网址为: 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
虽然已经没有这个文件了,不过没有关系,因为 RPM 有记录在 /var/lib/rpm 当中的数据库啊!所以直接下达: rpm -qf /etc/crontab 就可以知道是那个软件啰!重新安装一次该软件即可!
22.2.5 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) 文件的创建时间已被改变
P :(caPabilities differ) 功能已经被改变
所以,如果当一个配置文件所有的信息都被更动过,那么他的显示就会是:
至于那个 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 文件时:
首先你必须要先安装原厂释出的公钥文件;
实际安装原厂的 RPM 软件时, rpm 指令会去读取 RPM 文件的签章信息,与本机系统内的签章信息比对,
若签章相同则予以安装,若找不到相关的签章信息时,则给予警告并且停止安装喔。
我们 CentOS 使用的数码签章系统为 GNU 计划的 GnuPG (GNU Privacy Guard, GPG)。 GPG 可以通过杂凑运算,算出独一无二的专属金钥系统或者是数码签章系统,有兴趣的朋友可以参考文末的延伸阅读, 去了解一下 GPG 加密的机制喔!这里我们仅简单的说明数码签章在 RPM 文件上的应用而已。 而根据上面的说明,我们也会知道首先必须要安装原厂释出的 GPG 数码签章的公钥文件啊!CentOS 的数码签章位于:
从上面的输出,你会知道该数码签章码其实仅是一个乱数而已,这个乱数对于数码签章有意义而已, 我们看不懂啦!那么这个文件如何安装呢?通过下面的方式来安装即可喔!
由于不同版本 GPG 金钥文件放置的位置可能不同,不过文件名大多是以 GPG-KEY 来说明的, 因此你可以简单的使用 locate 或 find 来找寻,如以下的方式来搜寻即可:
那安装完成之后,这个金钥的内容会以什么方式呈现呢?基本上都是使用 pubkey 作为软件的名称的! 那我们先列出金钥软件名称后,再以 -qi 的方式来查询看看该软件的信息为何:
重点就是最后面出现的那一串乱码啦!那可是作为数码签章非常重要的一环哩! 如果你忘记加上数码签章,很可能很多原版软件就不能让你安装啰~除非你利用 rpm 时选择略过数码签章的选项。
22.2.6 RPM 反安装与重建数据库 (erase/rebuilddb)
反安装就是将软件解除安装啦!要注意的是,“解安装的过程一定要由最上层往下解除”,以 rp-pppoe 为例,这一个软件主要是依据 ppp 这个软件来安装的,所以当你要解除 ppp 的时候,就必须要先解除 rp-pppoe 才行!否则就会发生结构上的问题啦!这个可以由建筑物来说明, 如果你要拆除五、六楼,那么当然要由六楼拆起,否则先拆的是第五楼时,那么上面的楼层难道会悬空?
移除的选项很简单,就通过 -e 即可移除。不过,很常发生软件属性相依导致无法移除某些软件的问题! 我们以下面的例子来说明:
从范例一我们知道 pam 所提供的函数库是让非常多其他软件使用的,因此你不能移除 pam ,除非将其他相依软件一口气也全部移除!你当然也能加 --nodeps 来强制移除, 不过,如此一来所有会用到 pam 函数库的软件,都将成为无法运行的程序,我想,你的主机也只好准备停机休假了吧! 至于范例二中,由于 pam-devel 是依附于 pam 的开发工具,你可以单独安装与单独移除啦!
由于 RPM 文件常常会安装/移除/升级等,某些动作或许可能会导致 RPM 数据库 /var/lib/rpm/ 内的文件破损。果真如此的话,那你该如何是好?别担心,我们可以使用 --rebuilddb 这个选项来重建一下数据库喔! 作法如下:
Last updated