Tips 事实上,下一小节要讲的 yum 就可以直接用来进行安装的动作,基本上 rpm 这个指令真的就只剩下查询与检验的功能啰! 所以,查询与检验还是要学的,至于安装,通过 yum 就好了!

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

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

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

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

    22.2.2 RPM 安装 (install)

    因为安装软件是 root 的工作,因此你得要是 root 的身份才能够操作 rpm 这指令的。 用 rpm 来安装很简单啦!假设我要安装一个文件名为 rp-pppoe-3.11-5.el7.x86_64.rpm 的文件,那么我可以这样:(假设原版光盘已经放在 /mnt 下面了)

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

    1. 选项与参数:
    2. -i install 的意思
    3. -v :察看更细部的安装信息画面
    4. -h :以安装信息列显示安装进度
    5. 范例一:安装原版光盘上的 rp-pppoe 软件
    6. [root@study ~]# rpm -ivh /mnt/Packages/rp-pppoe-3.11-5.el7.x86_64.rpm
    7. Preparing... ################################# [100%]
    8. Updating / installing...
    9. 1:rp-pppoe-3.11-5.el7 ################################# [100%]
    10. 范例二、一口气安装两个以上的软件时:
    11. [root@study ~]# rpm -ivh a.i386.rpm b.i386.rpm *.rpm
    12. # 后面直接接上许多的软件文件!
    13. 范例三、直接由网络上面的某个文件安装,以网址来安装:
    14. [root@study ~]# rpm -ivh http://website.name/path/pkgname.rpm

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

    rpm 安装时常用的选项与参数说明

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

    • 挂载光盘,使用: mount /dev/sr0 /mnt
    • 找出文件的实际路径:find /mnt -name 'pam-devel*'
    • 测试此软件是否具有相依性: rpm -ivh pam-devel… —test
    • 直接安装: rpm -ivh pam-devel…
    • 卸载光盘: umount /mnt
      在鸟哥的系统中,刚好这个软件并没有属性相依的问题,因此最后一个步骤可以顺利的进行下去呢!

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

    由上面的说明来看,如果你想要大量的升级系统旧版本的软件时,使用 -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 文件内的信息喔!那如何去查询呢? 我们先来谈谈可用的选项有哪些?

    1. [root@study ~]# rpm -qa <==已安装软件
    2. [root@study ~]# rpm -q[licdR] 已安装的软件名称 <==已安装软件
    3. [root@study ~]# rpm -qf 存在于系统上面的某个文件名 <==已安装软件
    4. [root@study ~]# rpm -qp[licdR] 未安装的某个文件名称 <==查阅RPM文件
    5. 选项与参数:
    6. 查询已安装软件的信息:
    7. -q :仅查询,后面接的软件名称是否有安装;
    8. -qa :列出所有的,已经安装在本机 Linux 系统上面的所有软件名称;
    9. -qi :列出该软件的详细信息 information),包含开发商、版本与说明等;
    10. -ql :列出该软件所有的文件与目录所在完整文件名 list);
    11. -qc :列出该软件的所有配置文件 (找出在 /etc/ 下面的文件名而已)
    12. -qd :列出该软件的所有说明文档 (找出与 man 有关的文件而已)
    13. -qR :列出与该软件有关的相依软件所含的文件 Required 的意思)
    14. -qf :由后面接的文件名称,找出该文件属于哪一个已安装的软件;
    15. -q --scripts:列出是否含有安装后需要执行的脚本档,可用以 debug 喔!
    16. 查询某个 RPM 文件内含有的信息:
    17. -qp[icdlR]:注意 -qp 后面接的所有参数以上面的说明一致。但用途仅在于找出
    18. 某个 RPM 文件内的信息,而非已安装的软件信息!注意!

    在查询的部分,所有的参数之前都需要加上 -q 才是所谓的查询!查询主要分为两部分, 一个是查已安装到系统上面的的软件信息,这部份的信息都是由 /var/lib/rpm/ 所提供。另一个则是查某个 rpm 文件内容, 等于是由 RPM 文件内找出一些要写入数据库内的信息就是了,这部份就得要使用 -qp (p 是 package 的意思)。 那就来看看几个简单的范例吧!

    1. 范例一:找出你的 Linux 是否有安装 logrotate 这个软件?
    2. [root@study ~]# rpm -q logrotate
    3. logrotate-3.8.6-4.el7.x86_64
    4. [root@study ~]# rpm -q logrotating
    5. package logrotating is not installed
    6. # 注意到,系统会去找是否有安装后面接的软件名称。注意,不必要加上版本喔!
    7. # 至于显示的结果,一看就知道有没有安装啦!
    8. 范例二:列出上题当中,属于该软件所提供的所有目录与文件:
    9. [root@study ~]# rpm -ql logrotate
    10. /etc/cron.daily/logrotate
    11. /etc/logrotate.conf
    12. ....(以下省略)....
    13. # 可以看出该软件到底提供了多少的文件与目录,也可以追踪软件的数据。
    14. 范例三:列出 logrotate 这个软件的相关说明数据:
    15. [root@study ~]# rpm -qi logrotate
    16. Name : logrotate # 软件名称
    17. Version : 3.8.6 # 软件的版本
    18. Release : 4.el7 # 释出的版本
    19. Install Date: Mon 04 May 2015 05:52:36 PM CST # 这个软件安装到本系统的时间
    20. Group : System Environment/Base # 软件是放再哪一个软件群组中
    21. Size : 102451 # 软件的大小
    22. License : GPL+ # 释出的授权方式
    23. Signature : RSA/SHA256, Fri 04 Jul 2014 11:34:56 AM CST, Key ID 24c6a8a7f4a80eb5
    24. Source RPM : logrotate-3.8.6-4.el7.src.rpm # 这就是 SRPM 的文件名
    25. Build Date : Tue 10 Jun 2014 05:58:02 AM CST # 软件编译打包的时间
    26. Build Host : worker1.bsys.centos.org # 在哪一部主机上面编译的
    27. Relocations : not relocatable
    28. Packager : CentOS BuildSystem <http://bugs.centos.org>
    29. Vendor : CentOS
    30. URL : https://fedorahosted.org/logrotate/
    31. Summary : Rotates, compresses, removes and mails system log files
    32. Description : # 这个是详细的描述!
    33. The logrotate utility is designed to simplify the administration of
    34. log files on a system which generates a lot of log files. Logrotate
    35. allows for the automatic rotation compression, removal and mailing of
    36. log files. Logrotate can be set to handle a log file daily, weekly,
    37. monthly or when the log file gets to a certain size. Normally,
    38. logrotate runs as a daily cron job.
    39. Install the logrotate package if you need a utility to deal with the
    40. log files on your system.
    41. # 列出该软件的 information (信息),里面的信息可多着呢,包括了软件名称、
    42. # 版本、开发商、SRPM文件名称、打包次数、简单说明信息、软件打包者、
    43. # 安装日期等等!如果想要详细的知道该软件的数据,用这个参数来了解一下
    44. 范例四:分别仅找出 logrotate 的配置文件与说明文档
    45. [root@study ~]# rpm -qc logrotate
    46. [root@study ~]# rpm -qd logrotate
    47. 范例五:若要成功安装 logrotate ,他还需要什么文件的帮忙?
    48. [root@study ~]# rpm -qR logrotate
    49. /bin/sh
    50. configlogrotate = 3.8.6-4.el7
    51. coreutils >= 5.92
    52. ....(以下省略)....
    53. # 由这里看起来,呵呵~还需要很多文件的支持才行喔!
    54. 范例六:由上面的范例五,找出 /bin/sh 是那个软件提供的?
    55. [root@study ~]# rpm -qf /bin/sh
    56. bash-4.2.46-12.el7.x86_64
    57. # 这个参数后面接的可是“文件”呐!不像前面都是接软件喔!
    58. # 这个功能在查询系统的某个文件属于哪一个软件所有的。
    59. 范例七:假设我有下载一个 RPM 文件,想要知道该文件的需求文件,该如何?
    60. [root@study ~]# rpm -qpR filename.i386.rpm
    61. # 加上 -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 —replacepkgs
    • 虽然已经没有这个文件了,不过没有关系,因为 RPM 有记录在 /var/lib/rpm 当中的数据库啊!所以直接下达:rpm -qf /etc/crontab就可以知道是那个软件啰!重新安装一次该软件即可!

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

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

    1. [root@study ~]# rpm -ql logrotate
    2. /etc/cron.daily/logrotate
    3. /etc/logrotate.conf
    4. /etc/logrotate.d
    5. /usr/sbin/logrotate
    6. /usr/share/doc/logrotate-3.8.6
    7. /usr/share/doc/logrotate-3.8.6/CHANGES
    8. /usr/share/doc/logrotate-3.8.6/COPYING
    9. /usr/share/man/man8/logrotate.8.gz
    10. /var/lib/logrotate.status
    11. # 呵呵!共有 10 个文件啊!请修改 /etc/logrotate.conf 内的 rotate 变成 5
    12. ..5....T. c /etc/logrotate.conf
    • 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) 功能已经被改变
      所以,如果当一个配置文件所有的信息都被更动过,那么他的显示就会是:
    1. SM5DLUGTP c filename

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

    • c :配置文件 (config file)
    • d :文件数据文件 (documentation)
    • g :鬼文件~通常是该文件不被某个软件所包含,较少发生!(ghost file)
    • l :授权文件 (license file)
    • r :读我文件 (read me)
      经过验证的功能,你就可以知道那个文件被更动过。那么如果该文件的变更是“预期中的”, 那么就没有什么大问题,但是如果该文件是“非预期的”,那么是否被入侵了呢?呵呵!得注意注意啰! 一般来说,配置文件 (configure) 被更动过是很正常的,万一你的 binary program 被更动过呢? 那就得要特别特别小心啊!

    鸟哥的图示

    Tips 虽说家丑不可外扬,不过有件事情还是跟大家分享一下的好。鸟哥之前的主机曾经由于安装一套软件,导致被攻击成为跳板。 会发现的原因是系统中只要出现 *.patch 的扩展名时,使用 ls -l 就是显示不出来该文件名 (该文件名确实存在)。 找了好久,用了好多工具都找不出问题,最终利用 rpm -Va 找出来,原来好多 binary program 被更动过,连 init 都被恶搞!此时,赶紧重新安装 Linux 并移除那套软件,之后就比较正常了。所以说,这个 rpm -Va 是个好功能喔!

    • 数码签章 (digital signature)
      谈完了软件的验证后,不知道你有没有发现一个问题,那就是,验证只能验证软件内的信息与 /var/lib/rpm/ 里面的数据库信息而已,如果该软件文件所提供的数据本身就有问题,那你使用验证的手段也无法确定该软件的正确性啊! 那如何解决呢?在 Tarball 与文件的验证方面,我们可以使用前一章谈到的 md5 指纹码来检查, 不过,连指纹码也可能会被窜改的嘛!那怎办?没关系,我们可以通过数码签章来检验软件的来源的!

    就像你自己的签名一样,我们的软件开发商原厂所推出的软件也会有一个厂商自己的签章系统! 只是这个签章被数码化了而已。厂商可以数码签章系统产生一个专属于该软件的签章,并将该签章的公钥 (public key) 释出。 当你要安装一个 RPM 文件时:

    • 首先你必须要先安装原厂释出的公钥文件;
    • 实际安装原厂的 RPM 软件时, rpm 指令会去读取 RPM 文件的签章信息,与本机系统内的签章信息比对,
    • 若签章相同则予以安装,若找不到相关的签章信息时,则给予警告并且停止安装喔。
      我们 CentOS 使用的数码签章系统为 GNU 计划的 GnuPG (GNU Privacy Guard, GPG)[1]。 GPG 可以通过杂凑运算,算出独一无二的专属金钥系统或者是数码签章系统,有兴趣的朋友可以参考文末的延伸阅读, 去了解一下 GPG 加密的机制喔!这里我们仅简单的说明数码签章在 RPM 文件上的应用而已。 而根据上面的说明,我们也会知道首先必须要安装原厂释出的 GPG 数码签章的公钥文件啊!CentOS 的数码签章位于:
    1. [root@study ~]# ll /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    2. -rw-r--r--. 1 root root 1690 Apr 1 06:27 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    3. [root@study ~]# cat /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    4. -----BEGIN PGP PUBLIC KEY BLOCK-----
    5. Version: GnuPG v1.4.5 GNU/Linux
    6. mQINBFOn/0sBEADLDyZ+DQHkcTHDQSE0a0B2iYAEXwpPvs67cJ4tmhe/iMOyVMh9
    7. ....(中间省略)....
    8. -----END PGP PUBLIC KEY BLOCK-----

    从上面的输出,你会知道该数码签章码其实仅是一个乱数而已,这个乱数对于数码签章有意义而已, 我们看不懂啦!那么这个文件如何安装呢?通过下面的方式来安装即可喔!

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

    1. [root@study ~]# locate GPG-KEY
    2. [root@study ~]# find /etc -name '*GPG-KEY*'

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

    1. [root@study ~]# rpm -qa | grep pubkey
    2. gpg-pubkey-f4a80eb5-53a7ff4b
    3. [root@study ~]# rpm -qi gpg-pubkey-f4a80eb5-53a7ff4b
    4. Name : gpg-pubkey
    5. Version : f4a80eb5
    6. Release : 53a7ff4b
    7. Architecture: none
    8. Install Date: Fri 04 Sep 2015 11:30:46 AM CST
    9. Group : Public Keys
    10. Size : 0
    11. License : pubkey
    12. Signature : none
    13. Source RPM : none
    14. Build Date : Mon 23 Jun 2014 06:19:55 PM CST
    15. Build Host : localhost
    16. Relocations : not relocatable
    17. Packager : CentOS-7 Key CentOS 7 Official Signing Key <security@centos.org>
    18. Summary : gpgCentOS-7 Key CentOS 7 Official Signing Key <security@centos.org>)
    19. Description :
    20. -----BEGIN PGP PUBLIC KEY BLOCK-----
    21. Version: rpm-4.11.1 NSS-3
    22. ....(下面省略)....

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

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

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

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

    1. # 1\. 找出与 pam 有关的软件名称,并尝试移除 pam 这个软件:
    2. [root@study ~]# rpm -qa | grep pam
    3. fprintd-pam-0.5.0-4.0.el7_0.x86_64
    4. pam-1.1.8-12.el7.x86_64
    5. gnome-keyring-pam-3.8.2-10.el7.x86_64
    6. pam-devel-1.1.8-12.el7.x86_64
    7. pam_krb5-2.4.8-4.el7.x86_64
    8. [root@study ~]# rpm -e pam
    9. error: Failed dependencies: <==这里提到的是相依性的问题
    10. libpam.so.0()(64bit is needed by installed systemd-libs-208-20.el7.x86_64
    11. libpam.so.0()(64bit is needed by installed libpwquality-1.2.3-4.el7.x86_64
    12. ....(以下省略)....
    13. # 2\. 若仅移除 pam-devel 这个之前范例安装上的软件呢?
    14. [root@study ~]# rpm -e pam-devel <==不会出现任何讯息!
    15. [root@study ~]# rpm -q pam-devel

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