RPM 软件管理程序: rpm

RPM 的使用其实不难,只要使用 rpm 这个命令即可!我们最好还是得要知道一下,到底 RPM 类型的文件他们是将软件的相关文件放置在哪里?还有,我们说的那个 RPM 的数据库又是放置在哪里?


--------------------------------------------------------------------------------
1.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 文件 
--------------------------------------------------------------------------------
1.2 RPM 安装 (install)
因为安装软件是 root 的工作,因此你得要是 root 的身份才能够操作 rpm 这命令的。


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


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


[root@instructor ~]#  rpm -ivh package_name
选项与参数:
-i :install 的意思
-v :察看更细部的安装资讯画面
-h :以安装资讯列显示安装进度


范例一:安装 rp-pppoe-3.5-32.1.i386.rpm
[root@instructor ~]#  rpm -ivh rp-pppoe-3.5-32.1.i386.rpm
Preparing...     ####################################### [100%]
   1:rp-pppoe    ####################################### [100%] 




范例二、一口气安装两个以上的软件时:
[root@instructor ~]#  rpm -ivh a.i386.rpm b.i386.rpm *.rpm
# 后面直接接上更多的软件文件!




范例三、直接由网络上面的某个文件安装,以网址来安装:
[root@instructor ~]#  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 


--------------------------------------------------------------------------------
  1.3 RPM 升级与升级 (upgrade/freshen)
使用 RPM 来升级真是太简单了!就用 -Uvh 或 -Fvh 来升级即可,而 -Uvh 与 -Fvh 可以用的选项与参数,跟 install 是一样的。不过, -U 与 -F 的意义还是不太一样的,基本的差别是这样的:
-Uvh 后面接的软件即使没有安装过,则系统将予以直接安装; 若后面接的软件有安装过旧版,则系统自动升级至新版; 
-Fvh 如果后面接的软件并未安装到你的 Linux 系统上,则该软件不会被安装;亦即只有已安装至你 Linux 系统内的软件会被『升级』! 


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


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


先到各发展商的 errata 网站或者是国内的 FTP 映像站捉下来最新的 RPM 文件; 
使用 -Fvh 来将你的系统内曾安装过的软件进行修补与升级!(真是方便呀!) 
所以,在不晓得 yum 功能的情况下,你依旧可以到 CentOS 的映设站台下载 updates 数据,然后利用上述的方法来一口气升级!和安装一样,升级也是可以利用 --nodeps/--force 等等的参数!


--------------------------------------------------------------------------------
  1.4 RPM 查询 (query)
RPM 在查询的时候,其实查询的地方是在 /var/lib/rpm/ 这个目录下的数据库文件!另外, RPM 也可以查询未安装的 RPM 文件内的资讯!那如何去查询呢? 
我们先来谈谈可用的选项有哪些?
[root@instructor ~]#  rpm -qa                              <==已安装软件
[root@instructor ~]#  rpm -q[licdR] 已安装的软件名称       <==已安装软件
[root@instructor ~]#  rpm -qf 存在于系统上面的某个档名     <==已安装软件
[root@instructor ~]#  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@instructor ~]#  rpm -q logrotate
logrotate-3.7.4-8
[root@instructor ~]#  rpm -q logrotating
package logrotating is not installed
# 注意到,系统会去找是否有安装后面接的软件名称。注意:不必要加上版本!


范例二:列出上题当中,属于该软件所提供的所有目录与文件:
[root@instructor ~]#  rpm -ql logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf
....(以下省略)....
# 可以看出该软件到底提供了多少的文件与目录,也可以追踪软件的数据。




范例三:列出 logrotate 这个软件的相关说明数据:
[root@instructor ~]#  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@instructor ~]#  rpm -qc logrotate
[root@instructor ~]#  rpm -qd logrotate


范例五:若要成功安装 logrotate ,他还需要什么文件的帮忙?
[root@instructor ~]#  rpm -qR logrotate
/bin/sh
config(logrotate) = 3.7.4-8
libc.so.6
....(以下省略)....
# 由这里看起来,还需要很多文件的支持才行!


范例六:由上面的范例五,找出 /bin/sh 是哪个软件提供的?
[root@instructor ~]#  rpm -qf /bin/sh
bash-3.2-21.el5
# 这个功能在查询系统的某个文件属于哪一个软件所有的。


范例七:假设我有下载一个 RPM 文件,想要知道该文件的需求文件,该如何?
[root@instructor ~]#  rpm -qpR filename.i386.rpm
# 加上 -qpR ,找出该文件需求的数据!


常见的查询就是这些了!要特别说明的是,在查询本机上面的 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
就可以知道是那个软件!重新安装一次该软件即可! 
 
--------------------------------------------------------------------------------
1.5 RPM 验证与数码签章 (Verify/signature)


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


[root@instructor ~]#  rpm -Va
[root@instructor ~]#  rpm -V  已安装的软件名称
[root@instructor ~]#  rpm -Vp 某个 RPM 文件的档名
[root@instructor ~]#  rpm -Vf 在系统上面的某个文件
选项与参数:
-V  :后面加的是软件名称,若该软件所含的文件被更动过,才会列出来;
-Va :列出目前系统上面所有可能被更动过的文件;
-Vp :后面加的是文件名称,列出该软件内可能被更动过的文件;
-Vf :列出某个文件是否被更动过


范例一:列出你的 Linux 内的 logrotate 这个软件是否被更动过?
[root@instructor ~]#  rpm -V logrotate
# 如果没有出现任何信息,该软件所提供的文件没有被更动过。


范例二:查询一下,你的 /etc/crontab 是否有被更动过?
[root@instructor ~]#  rpm -Vf /etc/crontab
S.5....T  c /etc/crontab
# 因为有被更动过,所以会列出被更动过的资讯类型!


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




[root@instructor ~]#  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@instructor ~]#  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 被更动过, 那就得要特别特别小心!


--------------------------------------------------------------------------------




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


[root@instructor ~]#  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@instructor ~]#  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@instructor ~]#  rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5


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


[root@instructor ~]#  locate GPG-KEY
[root@instructor ~]#  find /etc -name '*GPG-KEY*'


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


[root@instructor ~]#  rpm -qa | grep pubkey
gpg-pubkey-e8562897-459f07a4
[root@instructor ~]#  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 <[email protected]>)
Description :
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: rpm-4.4.2 (beecrypt-4.1.2)
....(底下省略)....


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


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

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


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


# 1. 找出与 pam 有关的软件名称,并尝试移除 pam 这个软件:
[root@instructor ~]#  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@instructor ~]#  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@instructor ~]#  rpm -e pam-devel  <==不会出现任何信息!
[root@instructor ~]#  rpm -q pam-devel
package pam-devel is not installed


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


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




[root@instructor ~]#  rpm --rebuilddb   <==重建数据库
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章