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

相关推荐

  • 构建NP和NMP

    实验一、构建NP (一)实验布置:两台虚拟机充当代理服务器和后端服务器,一台虚拟机充当客户端。 (二)实验目的:实现NP的搭建。 (三)实验图解: (四)实验步骤: 1、  在后端服务器安装php-fpm文件,修改PHP-FPM的配置文件,vim/etc/php-fpm.d/www.conf文件,如下: listen = 127.0.0.1:900…

    2017-05-07
  • SNAT,DNAT,端口转发

    利用iptables配置NAT

    2018-03-01
  • 基础命令

    1,对于Linux的实验环境我们要用到虚拟机,往往每次上线都要登录,这时候如果把用户设为自动登录就会方便许多,接下来就介绍下设置虚拟机的自动登录 , /etc/gdm/custom.conf 这个就是设置自动登录的一个配置文件,我们先来使用nano打开这个文件,如下 # GDM configuration storage 这是GDM的一个配置存储 [daem…

    2017-11-19
  • LVM

       本节主要为raid和LVM相关 一、作业 1、创建一个2G的文件系统,块大小为2048byte,预留1%可用空间,文件系统ext4,卷标为TEST,要求此分区开机后自动挂载至/test目录,且默认有acl挂载选项 2、写一个脚本,完成如下功能: (1) 列出当前系统识别到的所有磁盘设备 (2) 如磁盘数量为1,则显示其空间使用信息 …

    Linux干货 2016-08-30
  • 马哥教育网络班21期-第三周课程练习

    第三周课程练习 1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 [root@localhost ~]# who | cut -f1 -d' ' | uniq  root 2、取出最后登录到当前系统的用…

    Linux干货 2016-07-12
  • LVM 与快照

    LVM: Logical Volume Manager 概念 它就是通过将底层的物理硬盘抽象的封装起来,然后以逻辑卷的方式呈现给上层应用。 允许对卷进行方便操作的抽象层,包括重新设定 文件系统的大小  允许在多个物理设备间重新组织文件系统 • 将设备指定为物理卷 • 用一个或者多个物理卷来创建一个卷组 • 物理卷是用固…

    Linux干货 2016-09-05

评论列表(2条)

  • stanley
    stanley 2016-06-01 15:34

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

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

      @stanley感谢老师