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 15:33
下一篇 2016-06-01 15:33

相关推荐

  • 手动编译内核+busybox+dropbear+nginx

    我们需要先在宿主机上添加一个磁盘,然后,把这个磁盘做好分区和文件系统: fdisk /dev/sdb 创建第一个分区: n p 1 +512M 创建第二个分区: n p 2 +10G 保存退出: w 为分区提供文件系统: kpartx /dev/sdb 为分区提供文件系统: mke2fs -t ext4 /dev/sd…

    Linux干货 2015-09-24
  • 终于成为马帮的成员了

    终于成为马帮的成员了

    Linux干货 2016-09-18
  • 6.vim编辑器使用方法总结

    vi: visual interface,文本编辑器 vim: vi improved,vi的增强版 文本:ASCII,Unicode, 文本编辑器种类: 行编辑器:sed, 全屏编辑器:nano,vi vim:模式化的编辑器 基本模式: 编辑模式,也叫命令模式 输入模式 末行模式:内置的命令行接口 模式转换: 编辑模…

    Linux干货 2017-08-06
  • 第十九周作业

    1.描述tomcat的架构 tomcat服务器是一种Servlet/jsp容器,更实质性的说是Servlet容器,因为jsp最终还是被编译成servlet来执行的。而对于servlet来说,其最长见的用途是扩展java web服务器功能,为来自web客户的请求提供服务。它完全运行在java虚拟机上。由于它的运行在服务器端,因此他的运行不依赖于浏览器。 tom…

    2017-07-11
  • shell编程之数组及变量的多功能用法

    数组及变量的多功能用法   一、数组: 1、数组:存储多个元素的连续的内存空间,相当于多个变量的集合(变量:存储单个元素的内存空间)。 2、数组名和索引 索引:编号从0开始,属于数值索引 bash的数组支持稀疏格式(索引不连续) 注意:索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash4.0版本之后开始支持。 声明数组: decl…

    Linux干货 2016-08-26
  • LVM逻辑卷的缩减与删除,LVM逻辑卷快照,btrfs文件系统,网络管理

    逻辑卷缩减 缩减的时候要注意缩减的空间不要超过文件系统的空间,不然缩减的时候会损坏文件系统。 第一步要先取消挂载(必须) 第二部检查文件完整性(必须) e2fsck -f /dev/vg0/lv0 第三部文件系统缩减,先缩减文件系统. resize2fs /dev/vg0/lv0 10G  (缩减到剩下10G) 第四步逻辑卷组的缩减 lvreduc…

    Linux干货 2016-09-06

评论列表(2条)

  • stanley
    stanley 2016-06-01 15:34

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

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

      @stanley感谢老师