Linux程序包管理(一)RPM使用

Linux程序包管理


在早期我们使用源代码的方式安装软件时,都需要先把源程序代码编译成可执行的二进制应用程序,然后进行安装。意味着每次安装软件都需要经过 预处理 
–> 编译 –> 汇编–> 链接, 这个复杂的过程。为简化安装步骤,程序提供商就在特定的系统上面编译好相关程序的安装文件并进行打包,提供给人们下载,我们只需要根据自己的系统去下载相应的安装包进行安装即可,这里可以对比理解,windows和linux在程序包方面有类似的方面,都是由程序开发者将应用程序编译好打包供需要的人下载,不同的地方是windows平台应用程序的开发者是将应用程序编译打包成二进制格式的可执行程序,而linux平台应用程序开发者则是将应用程序编译打包成rpm格式的软件包。 
那么既然应用程序都被打包,肯定需要一样工具来管理程序包,这个工具就叫做程序包管理器.

什么是程序包管理器?

顾名思义“程序包管理器”,主要作用肯定是对软件程序包进行管理的一种工具,那么我们在学习的时候就这理解。在Linux上,程序包管理器是用于管理Linux下软件包的软件,其主要功能是:

将编译好的程序好的程序打包成一个文件或多个文件,可用于实现软件的安装、卸载升级、查询等功能。


常见的程序包管理器有哪些?

两大主流:

debian:deb,dpt。debian系。deb管理器,程序包以dpt结尾。
edhat:rpm,rpm。rhel系。 rpm管理器,程序包以rpm结尾。

程序包的组成部分以及安装之后的存放路径

– 二进制程序

存放路径:/bin,/sbin,/usr/bin,/usr/sbin,/usr/local/bin,/usr/local/sbin

– 库文件

存放路径:/lib64,/usr/lib64,/usr/local/lib64等

– 配置文件

存放路径:/etc或者conf目录中

– 帮助文件

存放路径:/usr/share/man,/usr/local/share/man等


rpm包命名方式

  • name-VERSION-release.arch.rpm 

    • VERSION:major.minor.release 依次是主版本号.次版本号.发行号 
        release.arch:rpm自身的发行号.平台编号

    • 常见的arch: 
        x86(32位):i386,i486,i586,i686 
        x86_64(64位):x64,x86_64,amd64 
      eg: 
        zsh-5.0.2-14.el7.x86_64.rpm 
         5.0.2:5(主版本号).0(次版本号).2(发行号) 
         14.el7.x86_64:14(rpm自身的发行号).el7(表示适用redhat 7).x86_64(适用64位操作系统)

    • 分包机制:对于一个程序来说,其可能有很多功能,包括常用功能和非常用功能,弱把所有的功能打包到一块儿,无疑程序包增大许多,一些普通用户无需使用的功能都需一并下载安装,无形之中造成了资源的浪费,所以,程序包在打包时就出现了分包机制,主要分为主包和支包。 
      eg: 
        zlib-1.2.7-15.el7.x86_64.rpm –>主包 
        zlib-devel-1.2.7-15.el7.x86_64.rpm –>支包 
        zlib-static-1.2.7-15.el7.x86_64.rpm –>支包


管理程序包的方式:

使用报管理器:rpm 
使用前端管理工具:yum,dnf


获取程序包的途径


CentOS系统上rpm命令管理程序包:

包括安装、卸载、升级、查询、校验、数据库维护


  • 安装: 
      rpm {-i|–install} [install-options] PACKAGE_FILE … 
         -v: verbose 
         -vv: 
         -h: 以#显示程序包管理执行进度;每个#表示2%的进度 
      rpm -ivh PACKAGE_FILE…

[root@Daniel Packages]# rpm -qa lshw
[root@Daniel Packages]# echo $?
0
[root@Daniel Packages]# rpm -ivh lshw-B.02.17-5.el7.x86_64.rpm 
准备中...                          ################################# [100%]
正在升级/安装...   1:lshw-B.02.17-5.el7               ################################# [100%]
[root@Daniel Packages]# rpm -qa lshw lshw-B.02.17-5.el7.x86_64
[root@Daniel Packages]# rpm -e lshw 
[root@Daniel Packages]# rpm -qa lshw 
[root@Daniel Packages]# echo $?
0
[root@Daniel Packages]#
     [install-options]
        --test: 测试安装,但不真正执行安装过程;dry run模式;
        --nodeps:忽略依赖关系;
        --replacepkgs: 重新安装;
        --nosignature: 不检查来源合法性;
        --nodigest:不检查包完整性;
        --noscipts:不执行程序包脚本片断;
    %pre: 安装前脚本; --nopre
    %post: 安装后脚本; --nopost
    %preun: 卸载前脚本; --nopreun
    %postun: 卸载后脚本;  --nopostun
[root@Daniel Packages]# rpm -ivh --test unixODBC-2.3.1-11.el7.x86_64.rpm 
准备中...                          ################################# [100%]
[root@Daniel Packages]# rpm -qa unixODBC
[root@Daniel Packages]# rpm -ivh --test unixODBC-2.3.1-11.el7.x86_64.rpm 
准备中...                          ################################# [100%]
[root@Daniel Packages]# rpm -qa unixODBC
[root@Daniel Packages]# rpm -ivh  unixODBC-2.3.1-11.el7.x86_64.rpm 
准备中...                          ################################# [100%]
正在升级/安装...   1:unixODBC-2.3.1-11.el7            ################################# [100%]
[root@Daniel Packages]# rpm -qa unixODBC-2.3.1-11.el7.x86_64
[root@Daniel Packages]#
  • 升级

     rpm {-U|–upgrade} [install-options] PACKAGE_FILE … 
     rpm {-F|–freshen} [install-options] PACKAGE_FILE … 
     upgrage:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则“安装”; 
     freeshen:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则不执行升级操作; 
      rpm -Uvh PACKAGE_FILE … 
      rpm -Fvh PACKAGE_FILE …

[root@Daniel Packages]# rpm -Uvh unixODBC-2.3.1-11.el7.x86_64.rpm 
准备中...                          ################################# [100%]
正在升级/安装...   1:unixODBC-2.3.1-11.el7            ################################# [100%]
[root@Daniel Packages]# rpm -fvh unixODBC-2.3.1-11.el7.x86_64.rpm 
rpm:--hash (-h) 选项只能在软件包安装和擦除时指定
[root@Daniel Packages]# rpm -Fvh unixODBC-2.3.1-11.el7.x86_64.rpm 
[root@Daniel Packages]# echo $?
0
[root@Daniel Packages]#
    --oldpackage:降级;
    --force: 强行升级;

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


  • 查询:

    rpm {-q|--query} [select-options] [query-options]
       [select-options]
            -a: 所有包
            -f: 查看指定的文件由哪个程序包安装生成
            -p /PATH/TO/PACKAGE_FILE:针对尚未安装的程序包文件做查询操作
            --whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供;
            --whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖;
        [query-options]
            --changelog:查询rpm包的changlog
            -c: 查询程序的配置文件
            -d: 查询程序的文档
            -i: information
            -l: 查看指定的程序包安装后生成的所有文件;
            --scripts:程序包自带的脚本片断
            -R: 查询指定的程序包所依赖的CAPABILITY;
            --provides: 列出指定程序包所提供的CAPABILITY;
        用法:
        -qi PACKAGE, -qf FILE, -qc PACKAGE, -ql PACKAGE, -qd PACKAGE
        -qpi PACKAGE_FILE, -qpl PACKAGE_FILE, ...
        -qa
[root@Daniel Packages]# rpm -qi time
Name        : time
Version     : 1.7
Release     : 45.el7
Architecture: x86_64
Install Date: 2016年02月21日 星期日 19时41分51秒
Group       : Applications/System
Size        : 47926
License     : GPLv2+
Signature   : RSA/SHA256, 2014年07月04日 星期五 13时33分47秒, Key ID 24c6a8a7f4a80eb5
Source RPM  : time-1.7-45.el7.src.rpm
Build Date  : 2014年06月12日 星期四 21时29分00秒
Build Host  : worker1.bsys.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem < 
Vendor      : CentOS
URL         :  
Summary     : A GNU utility for monitoring a program's use of system resources
Description :The GNU time utility runs another program, collects information aboutthe resources used by that program while it is running, and displaysthe results.

[root@Daniel Packages]# rpm -qf /etc/grub.d/
grub2-tools-2.02-0.29.el7.centos.x86_64
[root@Daniel Packages]# rpm -ql time 
/usr/bin/time/usr/share/doc/time-1.7
/usr/share/doc/time-1.7/AUTHORS
/usr/share/doc/time-1.7/COPYING
/usr/share/doc/time-1.7/ChangeLog
/usr/share/doc/time-1.7/NEWS
/usr/share/doc/time-1.7/README
/usr/share/info/time.info.gz

  • 卸载:

    rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts]
          [--notriggers] [--test] PACKAGE_NAME ...
            -e:表示擦除,卸载
            --allmatcher:表示所有匹配到的
            --nodeps:不依赖,表示仅卸载当前包
            --noscripts:卸载时不执行脚本
            --notriggers:卸载时不执行触发器
            --test:卸载测试,并不真正卸载
[root@Daniel Packages]# rpm -qa unixODBC
unixODBC-2.3.1-11.el7.x86_64
[root@Daniel Packages]# rpm -e --test unixODBC 
错误:依赖检测失败:    
libesoobS.so.2()(64bit) 被 (已安裝) 
unixODBC-devel-2.3.1-11.el7.x86_64 需要    
libmimerS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要    
libnn.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要    
libodbccr.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要    
libodbcdrvcfg1S.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要    
libodbcdrvcfg2S.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要    
libodbcminiS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要   
libodbcnnS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要    
libodbctxtS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要    
liboplodbcS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要    
liboraodbcS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要    
libsapdbS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要    
libtdsS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要    
libtemplate.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要    
unixODBC(x86-64) = 2.3.1-11.el7 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要
[root@Daniel Packages]# rpm -e --test unixODBC --nodeps
[root@Daniel Packages]# rpm -qa unixODBC
[root@Daniel Packages]# rpm -e unixODBC 
错误:依赖检测失败:    
libesoobS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要    
libmimerS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要    
libnn.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要    
libodbccr.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要    
libodbcdrvcfg1S.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要    
libodbcdrvcfg2S.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要    
libodbcminiS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要    
libodbcnnS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要    
libodbctxtS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要    
liboplodbcS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要    
liboraodbcS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要    
libsapdbS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要    
libtdsS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要    
libtemplate.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要    
unixODBC(x86-64) = 2.3.1-11.el7 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要
[root@Daniel Packages]# rpm -e unixODBC --nodeps
[root@Daniel Packages]# echo $?
0

  • 校验:

 rpm {-V|–verify} [select-options] [verify-options] 
  S file Size differs 
  M Mode differs (includes permissions and file type) 
  5 digest (formerly MD5 sum) differs 
  D Device major/minor number mismatch 
  L readLink(2) path mismatch 
  U User ownership differs 
  G Group ownership differs 
  T mTime differs 
  P caPabilities differ

 包来源合法性验正及完整性验正: 
 完整性验正:SHA256 
 来源合法性验正:RSA 
 公钥加密: 
 对称加密:加密、解密使用同一密钥; 
 非对称加密:密钥是成对儿的, 
 public key: 公钥,公开所有人 
 secret key: 私钥, 不能公开 
 导入所需要公钥: 
  rpm –import /PATH/FROM/GPG-PUBKEY-FILE 
CentOS 7发行版光盘提供的密钥文件:RPM-GPG-KEY-CentOS-7

原创文章,作者:Daniel-W,如若转载,请注明出处:http://www.178linux.com/17055

(2)
Daniel-WDaniel-W
上一篇 2016-06-01
下一篇 2016-06-01

相关推荐

  • 定时任务应用示例

    定时任务应用示例 1.每4小时执行一次对/etc目录的备份,备份至/backup目录中,保存的目录名为形如etc-201504020202 mkdir /backup crontab -e * */4 * * * cp -ar /etc/ /backup/etc-$(date +%Y%m%d%H%M) 2.每周2,4,6备份/var/log/messages…

    Linux干货 2017-08-06
  • 加密的应用

    加密的应用 一、实现对称加密 1、openssl enc man enc 算法:3des, aes, blowfish, twofish 加密操作:openssl enc -e -des3 -a -salt -in testfile -out testfile.cipher 解密操作:openssl enc  -d -des3 -a  -…

    Linux干货 2016-09-26
  • 马哥教育网络班22期+第1周课程练习 忍者乱太郎喻成

    1.计算机组成:  根据冯诺依曼的计算机结构分为四大块:控制器,运算器, 存储器,输入输出设备 控制器:对其他的组件进行控制 运算器:用于处理计算工作,不控制输入和输出 储存器:用于暂时或长期存储数据 输入输出:与外界进行交互 个人延伸: 我的理解这是一个在计算机研发之前的一个理论假象, 相对现在真实的计算机体系,这个分类会比较模糊。 运算器:cp…

    Linux干货 2016-08-15
  • 脚本进阶

    1、写一脚本,用ping命令测试192.168.1.1-192.168.1.10之间的所有主机的在线状态,在线的主机使用绿色表示,不在线的主机使用红色表示   2、如何给网络配置多个地址,有哪些方式   3、写一个脚本 (1)假设某目录(/etc/rc.d/rc3.d/)下分别有K开头的文件和S开头的文件若干 (2)显示所有以K开头的文件…

    2018-01-08
  • nginx+keepalived构建负载均衡代理服务器

    实验环境: 1、centos7.3 centos6.82、两台VS提供nginx代理和keepalived3、两台RS提供httpd服务并部署wordpress4、另外一台提供Mysql数据库服务 实验拓扑图: 拓扑图 实验步骤 1、在vs1(172.18.251.4)上配置,用yum安装keepalived和nginx yum install -y kee…

    Linux干货 2017-05-21
  • Linux设备驱动Hello World程序介绍

    by Valerie Henson07/05/2007 (译者注:本文的例子是只能在linux的2.6内核下使用的,2.6以上的内核,译者没有做过实验,2.4是要修改make文件才能运行。) 本文的出处:这里 自古以来,学习一门新编程语言的第一步就是写一个打印“hello world”的程序(可以看《hello world 集中营》这个帖子供罗列了300个“…

    Linux干货 2015-04-01

评论列表(2条)

  • stanley
    stanley 2016-06-01 15:34

    已置顶,欢迎加入免检家庭

    • Daniel-W
      Daniel-W 2016-06-01 22:11

      @stanley感谢老师