引 入


  • rpm,是Red Hat Package Manager的缩写,也就是Red Hat的软件管理包,目前主要在Red Hat系的发行版和其他一些如SUSE,Mandriva等主流发行版中被采用。

  •  rpm包里面主要包含可执行的二进制程序文件,相关配置文件和文档文件。当然,也会有其他的特定版本文件,来说明一个软件包的依赖关系。其实依赖关系不是Linux特有的东西,例如windows上运行3D游戏时,他可能也会提示要安装Direct 9等依赖软件,复杂的软件都难免会有依赖,很多时候这也是按功能分模块所导致。

  • 繁多的依赖可能会给我们用rpm来管理安装软件带来极大的不便,这也是后面yum出现的一个最主要的原因,但yum其实也只就是一个rpm的前端管理工具,yum管理离不开rpm,有些时候用rpm也会比yum更便利,作为一个Linux程序员或Linux维护者,了解掌握rpm是必要的。


一、RPM包管理的用途:


  1. 支持本地对软件包进行安装,更新和卸载等操作,当然也支持网络在线的安装和更新;

  2. 通过RPM包管理能知道软件包包含哪些文件,也能知道系统中的某个文件属于哪个软件包;

  3. 可以查询系统中的软件包是否安装以及其版本;

  4. 作为开发者可以把自己的程序打包为RPM 包发布;

  5. 软件包签名GPG和MD5的导入、验证和签名发布;

  6. 依赖性的检查,查看是否有软件包由于不兼容而扰乱了系统。


二、获取程序包的途径:


  1. 系统发行版的光盘或官方的文件服务器(或镜像站点);

         http://mirrors.aliyun.com, 

         http://mirrors.sohu.com,

         http://mirrors.163.com

  2. 项目的官方站点;

  3. 第三方组织:

        (a) EPEL

        (b) 搜索引擎

        http://pkgs.org

                http://rpmfind.net 

                http://rpm.pbone.net 


三、RPM 的使用者权限:


  • root用户:RPM软件的安装、更新和卸载等所有操作权限;

  • 普通用户:默认只有查询功能,其他操作需要被赋权。

 

四、RPM 常用命令基本学习:


通用选项:

各模式通用的选项:
       --quiet   :仅仅输出错误信息;
       -v    :verbose,详细信息;
       -vv  :输出详细的调试信息。

安装和升级:

安装:
        rpm {-i|--install} [install-options] PACKAGE_FILE ...
        PACKAGE_FILE  可以是本地rpm包,也可以是一个远程ftp或http的URL。
        [install-options]
            -h:hash marks输出进度条;每个#表示2%的进度;
            --test:测试安装,检查并报告依赖关系及冲突消息等;
            --nodeps:忽略依赖关系;不建议;
            --replacepkgs:重新安装;
            --nosignature:不检查包签名信息,不检查来源合法性;
            --nodigest:不检查包完整性信息;
升级:
        rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
          或
        rpm {-F|--freshen} [install-options] PACKAGE_FILE ...

升级基本用法跟安装差不多,不过需要注意两点:
    注意:(1) 不要对内核做升级操作;Linux支持多内核版本并存,因此,直接安装新版本内核;
          (2) 如果某原程序包的配置文件安装后曾被修改过,升级时,新版本的程序提供的同一个配置文件不会覆 盖原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供;


卸载和查询:

卸载:
        rpm {-e|--erase} [--allmatches] [--nodeps] [--test] PACKAGE_NAME ...
            --allmatches:卸载所有匹配指定名称的程序包的各版本;
            --nodeps:忽略依赖关系,强制卸载;
            --test:测试卸载,并不真的卸载,一般配合-vv选项在debug的时候使用。
查询:
        rpm {-q|--query} [select-options] [query-options]
        [select-options]
            PACKAGE_NAME:查询已经安装过得软件包。
            -a, --all:查询所有已经安装过的包.
            -f, --file:查询指定的文件属于哪个程序包。
            -p, --package PACKAGE_FILE:用于实现对未安装的程序包执行查询操作。
        [query-options]
            --changelog:查询rpm包的changlog;
            -c, --configfiles:查询指定的程序包提供的配置文件;
            -d, --docfiles:查询指定的程序包提供的文档;
            -l, --list:程序安装生成的所有文件列表;
            -i, --info:程序包相关的名字,版本,描述等;
            -s, --state:显示包文件的状态,有normal, not installed, 和 replaced三种状态;
            --scripts:查看程序包自带的脚本片断;

校验: 这是一点大多数开发人员容易忽略的,但对于安全性要求严格的情况下,请务必做相关安全校验。

校验:     
        rpm {-V|--verify} [select-options] [verify-options]                  
        校验的出的文件类型 type :             
            c %config 配置文件
            d %doc 文档文件
            g %ghost 占位文件,也就是文件内容不包含在软件包有效内容里面
            l %license 许可证文件
            r %readme 说明文件
        文件属性:    
            S 大小不一致
            M 模式不一致(包括权限和文件类型)
            5 MD5校验和不一致
            D 主/次设备号不匹配
            L 路径不匹配
            U 属主不一致
            G 属组不一致
            T 修改时间不一致
            P 功能不一致


软件包管理之rpm_rpm

                      图:rpm 校验结果选项细节


五、例子展示: 以sudo的这个系统管理程序为例子,来实操一下上面的常用命令:


1、查询sudo是否安装:

rpm -q sudo

软件包管理之rpm_rpm_02



2、查看未安装的sudo的相关信息:

rpm -qpi sudo-1.8.6p7-13.el7.x86_64.rpm

软件包管理之rpm_rpm_03

3、安装sudo

PACKAGE_FILE为本地rpm包
rpm -ivh  sudo-1.8.6p7-13.el7.x86_64.rpm
  
PACKAGE_FILE为ftp或http的url
rpm -ivh  http://mirrors.aliyun.com/centos/7.1.1503/os/x86_64/Packages/sudo-1.8.6p7-13.el7.x86_64.rpm

软件包管理之rpm_rpm_04

从上面可以看到有warning警告,这是没做用户来源可靠性校验所致

4、导入信任的包制作者的密钥

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

5、卸载、再次安装sudo       软件包管理之rpm_rpm_05

可以看到这一次没有出现warning了。
6、 查看sudo提供的配置文件      
rpm -qc sudo

软件包管理之rpm_rpm_06

7、查看配置文件/etc/sudo.conf由属于哪个程序包 
rpm -qf /etc/sudo.conf

软件包管理之rpm_rpm_07



8、校验sudo软件的文件数据完整性

rpm -V sudo

软件包管理之rpm_rpm_08

可以看到,修改/etc/sudo.conf这个配置文件后,数据的大小,md5,修改的时间都变化了,而且改变的是一个配置文件。

9、安装sendmail,留下后文

rpm -ivh sendmail-8.14.7-4.el7.x86_64.rpm

软件包管理之rpm_rpm_09

可以发现sendmail因依赖promail而安装失败,这里可以先安装promail,当然也可以用yum,你懂得。


后  记


    rpm功能强大,灵活应用将是Linux运维人员的一大利器。不过由于依赖问题解决的不是很好,下一篇我们就来学习rpm的前端工具yum。

附:如对上面描述有疑问,期待与朋友您共同探讨。本人QQ:1084569767