Linux软件安装管理(二):RPM命令管理

内容提要

  1. RPM包都在系统安装光盘中
  2. rpm包命名规则:httpd-2.2.15-15.el6.centos.1.i686.rpm
  3. rpm包的依赖性问题
  4. rpm包命令:安装-i;卸载-e;升级-U;查询-q,-qa,-qi,-qip,-ql,-qlp,-qf;校验 -V;rpm中提取文件。其中,安装卸载可以被yum取代。而yum没有查询、校验rpm包的功能

1.RPM包的来源

Linux的系统光盘DVD1中ISO中有软件的RPM包,只需在虚拟机光驱中选择这个DVD1,勾选连接选项,即给光驱通电。

给虚拟机光驱中加入DVD后,在linux系统中给光盘创建一个挂载点

mkdir /mnt/cdrom

输入挂载命令

mount /dev/sr0 /mnt/cdrom

然后打开文件夹cd /mnt/cdrom,再cd package/目录中可以看到好几千个RPM包。所有的RPM包在系统光盘中的package目录中。

2.RPM包命名规则

所有的RPM包都必须按照以下规则命名,看懂它有助于选择合适的软件包:

  • httpd-2.2.15-15.el6.centos.1.i686.rpm
    • 包名称,即软件名称httpd
    • 版本号2.2.15
    • 软件发布次数15
    • 适合的Linux平台el6.centos;el6指的是redhat的企业版
    • 适合的硬件平台i686;如果是x64表示只适合64位系统
    • 扩展名rpm

可见,rpm是针对特定平台编译的二进制包!rpm支持不同平台指的是针对不同平台发布不同的rpm。

3.RPM包的依赖性

  • 树形依赖
    • a→b→c,装a的时候需要装b,装b的时候需要装c
    • 先装c,再装b,最后装a
    • 依赖可以在光盘中找到,光盘中找依赖(package目录下自动补全)软后安装
  • 环形依赖
    • a→b→c→a
    • a\b\c三个包放在一起安装
    • 依赖可以在光盘中找到,光盘中找依赖(package目录下自动补全)软后安装
  • 模块依赖
    • .so.数字结尾的库文件
    • 在光盘中找不到,因为它是一个文件(函数),而不是软件包
    • 它其实是藏身在光盘中几千个RPM包的某一个包中的文件而已,只要把这个文件所在的包装上就行
    • 这个文件在哪个包中?登陆www.rpmfind.net中查询

报错提示:B依赖A,需要先装A

error:Failed dependencise: A is needed by B

yum在线安装可以解决rpm依赖性的问题,yum仓库里放了所有的软件在服务器上,只要能够访问服务器,使用yum命令安装,所有的依赖会自动解决。但是redhad将yum服务作为付费项目,centos的yum是免费的。

4.rpm包管理命令

安装和卸载时使用的包(全)名不同,注意区别:

  • 包全名:操作的包是没有安装的软件包时,使用包全名,包括路径
    • 即此时包只是一个文件
    • 比如安装包时、升级包时到这个文件的目录下或者用绝对路径+包名
  • 包名:操作已安装的软件包时,使用包名,即httpd
    • 比如卸载时、查询时,直接使用包名即可
    • 安装后的软件,软件名都会保存在/var/lib/rpm的数据库中

4.1 rpm安装命令 -i

  • rpm -ivh 包全名
  • 选项
    • -i(install)
    • -v (verbose)显示详细信息
    • -h (hash)显示进度
    • –nodeps 不检测依赖性,不推荐使用,因为不解决依赖软件安了也用不了

提示:安装的时候,会告诉你要依赖哪些rpm,依次装完这些软件即可;安装成功会提示两个100%,第一个是准备成功,第二个才是安装成功;rpm包进入光盘中的package中查找

虽然yum方便的解决了依赖,可以安装和卸载rpm包,但是yum没有查询和校验命令。今后可以用yum的安装和卸载命令取代rpm的安装和卸载,但是查询和校验依然用rpm的命令。

4.2 rpm升级命令 -U

  • rpm -Uvh 包全名
  • 选项
    • -U(upgrade)升级
    • -v (verbose)显示详细信息
    • -h (hash)显示进度

注意:

  • 新的升级包对系统来说也是完全陌生的包,必须用包全名;
  • 得有一个比当前版本更高版本的包,才会升级安装!比如安装了一个2.0版本的httpd软件,现在用更高版本的包httpd-2.2.15-15.el6.centos.1.i686.rpm进行升级安装
  • 版本相同不会安装,报A is already installed;没有安装过,则相当于安装命名

4.3 rpm卸载命令 -e

  • rpm -e 包名
  • 选项
    • -e(erase)卸载
    • –nodeps 不检测依赖性,不推荐使用,否则卸载不干净,依赖的软件都卸不掉!!

注意:

  • 使用包名即可
  • 卸载也要解决依赖性,卸载时的依赖性与安装时相反,依次卸载

rpm包为什么准备了卸载命令?

在安装rpm包的时候,没有指定安装位置,软件将会安装在系统默认的位置,即写这个rpm包的人认为软件装在哪最好,就会装在哪。会在系统中装的乱七八糟,手工删除要一个一个文件删很麻烦,所以有卸载命令更方便。

但是源码包安装没有卸载命令,因为源码包指定安装位置,直接删除安装的目录即可。

linux比windows稳定是因为linux不会产生垃圾文件,windows卸载软件常卸载不干净注册表中还有很多垃圾文件;linux不需要考虑这些,删除安装的位置文件即可,不会遗留垃圾文件。

4.4 rpm包查询方法 -q

yum只能实现安装、卸载,但是不能查询已经安装好的rpm包。常用命令如下

4.4.1 查询软件是否安装 -q:

  • rpm -q 包名
    • 查询包是否安装,使用包名即可,返回rpm包的命名
    • -q (query) 查询
  • rpm -qa
    • 查询所有已经安装的rpm包
    • -a (all)
    • rpm -qa | grep 关键字 返回含有关键字的已安装的rpm包(√推荐使用)

4.4.2 查询软件包的详细信息 -i:

  • rpm -qi (已安装的)包名

    • -i (information) 返回包的详细信息(写rpm包的作者写的详细信息)
  • rpm -qip (未安装的)包全名

    • -p (package) 查询未安装包信息

查询详细信息命令用的不多,但当软件出现问题时,可以通过查看URL官方网站去查找解决方法

4.4.3 查询包中文件安装位置 -l:

  • rpm -ql 包名
    • -l (list) 列表
    • 可以查看到软件的每个文件安装的详细位置,目录及其子目录;比如安装后的软件文件一般会分布在/etc配置文件中,/usr/lib函数库文件中,/var目录下
    • rpm包会将安装的到处都是,装在哪是写rpm包的人决定的,所以安装的乱七八糟
PRM包默认的安装位置 文件归类
/etc/ 配置文件安装目录
/usr/bin/ 可执行的命令安装目录
/usr/lib/ 程序所使用的函数库保存位置
/usr/share/doc/ 基本的软件使用手册保存位置
/usr/share/man/ 帮助文件保存位置
  • rpm -qlp 包全名
    • -l (list) 列表
    • -p (package)查询未安装包的信息
    • 查看未安装的包安装以后将会安装到哪里

4.4.4 查询系统文件属于哪个RPM包 -f

  • rpm -qf 系统文件名
    • -f (file) 查询系统文件属于哪个软件包

Linux系统和几乎所有的系统软件都是rpm包安装的,例如查找配置文件yum.conf属于哪个包

rpm -qf yum.conf

返回yum-3.2.29-30.el6.centos.noarch所属包名

但是,你自己创建的文件夹 touch aaa去查询rpm -qf aaa则会返回 file /root/aaa is not owned by any package.

只有通过rpm包安装产生的文件才能反向查询属于哪个rpm包。

4.4.5 查询软件包的依赖性 -R

  • rpm -qR 包名

    • -R (requires) 查询软件包的依赖性
  • rpm -qRp 包全名

    • -p (package) 查看未安装包的依赖性
    • 依赖包是在写这个rpm包的时候就依赖了,所以未安装也可以查询

查询出来的结果其实意义不大,结果中还包含了linux的标准shell即bash这样的依赖,所以返回的依赖会很多,可读性不强。还不如直接去装软件包,让他去报错误,提示还需要哪些依赖。

4.5 rpm包的校验

  • rpm -V 已安装的包名
    • -V (verify)校验指定rpm包中的文件

验证内容中的8个信息的具体内容如下:SM5DLUGT

  1. S 文件大小是否改变
  2. M 文件的类型或文件的权限(rwx)是否改变
  3. 5 文件的MD5校验和是否发生改变(可以看成文件内容是否改变)
  4. D 设备的主从代码是否改变
  5. L 文件路径是否改变
  6. U 文件的所属用户是否改变
  7. G 文件的所属组是否改变
  8. T 文件的修改时间是否改变

MD5校验和的作用是,下载完一个软件以后,利用MD5校验软件去检验这个下载的程序,然后拿你检验出的MD5校验码和官网的MD5校验码比较,如果一样则证明文件的完整性

文件类型校验:

  • c config file 配置文件
  • d documentation 普通文档
  • g ghost 鬼文件,很少见,说明该文件不应该被这个RPM包包含,出现这个可能被攻击
  • L license file 授权文件
  • r read me 描述文件

如果安装包未改变,校验以后则不返回任何东西。如果有改变,则返回以上信息。例如,给httpd的配置文件httpd.conf中注释部分加一点内容

# rpm -V httpd

返回:

S.5....T. c /etc/httpd/conf/httpd.conf

说明S\5\T这些项都被改变,c指的是一个正常的配置文件。如果自己从来没有动过这个文件,校验结果显示被修改了,可以怀疑有人偷偷修改过。

4.6 rpm包中文件提取

只要指导rpm包中有哪些文件,就可以通过以下命令提取文件,包中文件绝对路径就是默认安装的位置,见 4.4.3

  • rpm2cpio 包全名 | cpio -idv .包中文件绝对路径

两个命令的功能说明:

  • rpm2cpio 包全名

    • 将rpm包转换为cpio格式
  • cpio

    • 一个标准工具,用于创建软件档案文件和从档案文件中提取文件
    • 这个命令并不知道从哪里提取文件,所以一般使用管道符输入给cpio,或者用重定向,让cpio从这些文件中提取

cpio用重定向的使用格式为

  • cpio -idv < [文件|设备]
    • -i copy-in 模式,提取
    • -d 提取时自动新建目录
    • -v 显示提取过程
    • 利用管道符或者重定向得知从哪里提取数据
    • -idv 是提取的标准选项!

例如,系统命令ls是放在bin下的ls当中

whereis ls

返回

ls:/bin/ls

但是如果误操作,将/bin/ls文件删了,这时ls命令会消失。解决方法是再找一台linux,把这台linux上的/bin/ls拷贝过来只要版本一致就行。

如果没有另一台linux,则可以考虑通过rpm包提取文件的方法。包括linux系统在内的所有软件都是通过rpm包安装出来的,因此所有系统文件都在rpm包当中,可以从中提取出需要的系统文件。

第一步:了解到要提取的文件属于哪个包

rpm -qf /bin/ls

第二步:提取文件,从光盘中的某个rpm包中提取

rpm2cpio /mnt/cdrom/packages/coreutils-8.4-19.el6.i686.rpm |cpio -idv ./bin/ls

通过rpm2cpio命令,将/mnt/cdrom/packages/coreutils-8.4-19.el6.i686.rpm转换成cpio格式;通过管道符,cpio -idv 命令知道从前面的数据中提取文件,提取的文件就是./bin下的ls文件;. 表示把提取出的文件会保存在当前目录下。

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器