系统管理之程序包管理(一) rpm详解

系统管理之程序包管理(1):

    程序包管理是运维人员的基本工作素质之一。在操作系统上,不断的安装,卸载,配置应用程序包,让不同程序包运行提供不同的服务;利用某种工具完成某些操作的过程。这就要求运维工作人员熟悉安装,管理应用程序包。 在linux上,程序包主要有两种:tar,rpm包。


一、程序包概述:


  • 系统接口

      API:Application Program Interface  应用编程接口

      ABI:APPlication Binary Interface 应用二进制接口

      不同操作系统,API兼容,ABI不一定相同(windows与linux不兼容)

        Unix-like:(程序后缀名的区别)

          ELF

        windows:

          exe;msl


  • 跨平台程序

     平台不同,二进制程序的类型不同,借助库级别的虚拟化;运行跨系统的二进制程序

       linux:WinE

       windows:cywin


  • 开发语言分类

     系统级开发语言:C/C++  go : httpd,vsftpd,nginx

     应用级开发语言:JAVA/python/perl/ruby/PHP/go: 

          java:hadoop ,hbase,(jvm虚拟机) j虚拟机 c/c++研发

          python:openstack   (pvm虚拟机)

          perl:   (rvm解释器)

     复杂应用程序糅合不同级别开发语言,系统级语言写程序核心,应用级辅助类的工具程序


  • 语言程序格式

    C/C++程序格式:

        源代码:文本格式的程序代码

         编译开发环境:编译器,头文件,开发库

         二进制程序:文本格式的程序代码–>编译器–>二进制程序(二进制程序,库文件,配置文件,帮助文件)

    java/python程序格式:

      源代码:编译成能够在其虚拟机(jvm/pvm)运行的格式;

           开发环境:编译器,开发库,

      二进制格式:文本格式的程序代码–>编译器–>二进制程序(二进制程序,库文件,配置文件,帮助文件)


  • 项目构建工具:

       借助配置文档,自动决定程序包的编译顺序,依赖关系

      依赖于开发环境

             c/c++:make 

             java:maven

          


二、程序包管理器概论:


 

  • 程序包的构建过程:

        源代码–>目标二进制格式–>把(二进制程序,库文件,配置文件,帮助文件)组织成为一个或几个包文件;

  

  • 程序包管理器类型:

        deblan: dpt(命令dpkg) 程序包以“.deb”为后缀

        redhat: redhat package manager:rpm(命令rpm) 程序包以“.rpm””为后缀

        Su.S.E: rpm包,(命令rpm) 与redhat的rpm包的路径格式不兼容

        Gentoo:ports

        ArchLinux: 轻量级Linux 


  • 程序包命名格式

    源代码:

            name-VERSION.tar.gz

            VERSION:major.minor.release(主版本号.次版本号.发行号)

             例:mysql-5.0.2.tar.gz

    rpm包:

           name-VERSION-release.arch.rpm

           VERSION:major.minor.release(主版本号.次版本号.发行号)

           release.arch:rpm包的发行号.操作系统的平台架构类型

           release.os: 操作系统类型 (rhat,centos,el7)

          arch:i386,X64,ppc,noarch(适用全部平台,java编写)

             例:redis-3.0.2-1.centos7.x64.rpm

    拆包:拆除多余功能的包,按需安装程序包内的包,分主包和子包

          主 包:name-VEESION-release.arch.rpm

                 php-5.4.16-36.el7_1.x86_64.rpm

          子包:name-function-CERSION-release.arch.rpm

              php-bcmath-5.4.16-36.el7_1.x86_64.rpm

  • 程序包依赖关系

       包之间:可能存在依赖关系,甚至循环依赖

         x,y,z

          x–>y,z

             y–>a,b,c

               c–>D    

     安装某个主包,必须安装主包依赖的副包

     解决依赖关系,使用rpm前端工具

  • 库文件:    

       ldd命令    查看软件包的库依赖性

      查看二进制程序所依赖的库文件:

         ldd /PATH/TO/BINARY_FILE

      管理及查看本机装载的库文件:

         ldconfig 

         /sbin/ldconfig -p: 显示本机已经缓存的所有可用库文件名及文件路径映射关系

      配置文件: /etc/ld.so.conf, /etc/ld.so.conf.d/*.conf

      缓存文件: /etc/ld.so.cache

  • 程序包前端工具

     yum:rhel系列上 rpm包管理器的前端工具

     agt-get(apt-cache):deb包管理器的前端工具

     zypper:suse的rpm管理器前段工具

     dnf: Fedora 22+系统上rpm包管理器的前端工具

  • 程序包管理器介绍

    功能:将编译好的应用程序的各组成文件打包成一个或几个程序包文件,从而更方便的实现 安装,卸载,查询,校验功能

      1.程序包的组成清单(每个程序包都独立实现)

        文件清单

         程序包的元数据(名称,版本,依赖性,描述)

        安装或卸载时运行的脚本

     2.数据库(公共)

       存储程序包的名称和版本

       依赖关系

       功能说明

       包安装生成后的各文件的文件路径及校验码信息;

      注意:/var/lib/rpm/  centos程序库的存放位置


  • 获取程序包的途径

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

          http://mirrors.aliyun.com/

          http://mirrors.sohu.com

          http://mirrors.163.com

     (2)项目的官方站点

           http://www.zabbix.com

     (3)第三方组织 社区组织维护

          Fedora-EPEL:

           Rpmforge:RHEL推荐,包很全

     (4)搜索引擎:不安全

           http://pkgs.org

            http://rpmfind.net/

           http://rpm.pbone.net/

            http://sourceforge.net/

     (5)自已动手,丰衣足食  

      

       建议:对网上下载的程序包进行md5校验,检查其完整性,合法性

      来源合法性:

      程序包的完整性;


三、centos7系统上rpm命令管理程序包:


安装,升级卸载,查询和校验,数据库维护

   


rpm命令

    rpm [OPTIONS] [PACKAGE_FILE]

     安装:-i,–install

    升级:-U,–update,–freshen

    卸载:-e,–erase

    查询:-q

    校验:-V

    数据库维护:–builddb,–initdb

    

  • 安装:

    rpm {-i|–install} [install-options] PACKAGE_FILE…

    rpm -ivh PACKAGE_FILE..

      GENERAL OPTIONS:

          -v:详细信息

          -VV:更详细的输出

      [install-options]:

          -h:hash marks 输出进度条;每个#表示2%的进度

          –test:测试安装,检查并报告依赖关系及冲突消息,并不真正安装程序

          –nodeps:忽略依赖关系,强制安装 ,但程序不一定能使用 不建议

          –replacepkgs重新安装

           —replacefiles  重新安装,忽略重复文件

           –nosignature:不检查报名签名信息,不检查来源合法性

          –nodigest:不检查包的完整性信息 (校验 MD5) 

          –justdb:更新数据库,但不重新安装

           –noscripts 不执行全部程序包脚本

             注意:rpm可以自带脚本

                  脚本分四类:(特定的脚本的参数,可以单独选择)

                  preinstall:安装过程开始之前运行的脚本,%pre –nopre

                  postinstall:安装过程完成之后运行的脚本 $post –nopost

                  preuninstall:卸载过程真正开始前运行的脚本 $preun –nopreun

                  postuninstall:卸载过程中运行的脚本 $postun –nopreun

    

    

  • 升级:原文件丢失

    rpm {-U|–upgrade} [install-options] PACKAGE_FILE..

    rpm {-F|-freshen} [install-options] PACKAGE_FILE..

       [PTIONS]

        -U:有旧版本升级或原程序不存在执行安装

        -F:只执行升级

         rpm -Uvh PACKAGE_FILE..

          rpm -Fvh PACKAGE_FILE.

     [install-options]:

        –oldpackage:降级安装旧版本 

        –force:强制;新版本的程序包不满足老版本的依赖关系 ,强制安装或强制升级,忽略依赖关系,也可配合rpm -ivh选项

     注意:

        (1)不要对内核kernel做升级操作 linux支持多内核并存,因此,直接安装新版本内核即可

      (2)如果某原程序包的配置文件安装后曾被修改过,升级时,新版本的程序提供的同一个配置文件不会覆盖原有版本的配置文件,而是把新版本的配置文件重名命为(FILEname.rpmnew)后提供

  • 卸载:

     rpm {-e|–erase} [–allmatches] [–nodeps] [–noscripts][–notriggers] [–test] PACKAGE_NAME …

        –allmatches:卸载所有匹配指定名称的程序包的各版本

        –nodeps:强制忽略依赖关系

        –test:测试卸载:dry run模式

  • 查询:

    rpm {-q|–query} [select-options] [query-options] PACKAGE_NAME …

      

     select-options:

        PACKAGE_NAME :查询指定程序包是否安装及安装信息

         -a:所有已安装的程序包列表

        -f:查询指定的文件由那个程序包安装

        -g:查询指定包组中包含哪些包

        -p:对未安装的程序包执行查询操作;

        –whatprovides CAPABILITY:查询指定的CAPABILITY由那个程序包提供;

        –whatrequires CAPABILITY:查询指定的CAPABILITY被那个程序包所依赖;

     query-options:

          –changelog:查询rpm包的changlog

          -l:rpm包生成的所有文件列表

          -i:查询程序包相关的信息,版本号,大小,所属包组等等

        -c:查询指定的程序包提供的配置文件

        -d:查询指定的程序包提供的帮助文档

        –provides:列出指定的程序包提供的所有的CAPABILITY. 在确定–whatprovides CAPABILITY 

        -R:查询指定程序包的依赖关系

        –scripts:查询指定程序包自带的脚本片段

        哪个包所依赖
            rpm2cpio 包文件|cpio –itv 预览包内文件
             rpm2cpio 包文件|cpio –id “ *.conf” 释放包内文件

  

       用法:

        -ql ,-qd,-qc,-qi,-qa PACKAGE_NAME

        -qp{i,c,d,f} PACKAGE_FILE :未安装程序的详细信息

  • 校验:

     rpm {-V|–verify} [select-options] [verify-options]  程序名

      只要改变服务下的任意文件,使用-V校验,都可看到修改信息 

        例:修改httpd的配置文件,校验httpd服务    

            [root@wen-7 ~]# rpm -qc httpd        
            /etc/httpd/conf.d/autoindex.conf
            /etc/httpd/conf.d/userdi
            .......
            [root@wen-7 ~]# vim /etc/sysconfig/httpd[
            root@wen-7 ~]# rpm -V httpd
            S.5....T.  c /etc/httpd/conf/httpd.conf
            S.5....T.  c /etc/sysconfig/httpd		

    

        显示信息的含义:

         S file Size differs     文件大小

         M Mode differs (includes permissions and file type) 权限    

         5 digest (formerly MD5 sum) differs MD5

         D Device major/minor number mismatc  主次设备号不配备

         L readLink(2) path mismatch  路径不匹配

         U User ownership differs  属主匹配

         G Group ownership differs       属组比匹配

         T mTime differs  时间戳改变

         P caPabilities differ

 

  • 数据库重建:

    rpm管理器数据库路径:/var/lib/rpm/  该目录严重保护,全额备份

    查询操作:通过此处的数据库进行;

     NAME

       rpmdb – RPM Database Tool

      SYNOPSIS

      rpm {–initdb|–rebuilddb} [-v] [–dbpath DIRECTORY] [–root DIRECTORY]

        –initdb:初始化数据库,当前无任何数据库可初始化创建一个新的,当前有时,不执行任何操作

        –rebuilddb:重新构建,通过读取当前系统上所有已经安装过的程序包进行重新创建(不管如何,直接重建)

          例:

         [root@wen-7 ~]# mkdir /tmp/rpm
         [root@wen-7 ~]# rpm --initdb --dbpath=/tmp/rpm/
         [root@wen-7 ~]# ls /tmp/rpm/
         Basenames     __db.001  __db.003  Group       Name          Packages     Requirename  Sigmd5
         Conflictname  __db.002  Dirnames  Installtid  Obsoletename  Providename  Sha1header   Triggername
         [root@wen-7 ~]# rpm --initdb --dbpath=/tmp/rpm/
         [root@wen-7 ~]# ls /tmp/rpm/
         Basenames     __db.001  __db.003  Group       Name          Packages     Requirename  Sigmd5
         Conflictname  __db.002  Dirnames  Installtid  Obsoletename  Providename  Sha1header   Triggername
         [root@wen-7 ~]# rpm --rebuilddb --dbpath=/tmp/rpm/
         [root@wen-7 ~]# ls /tmp/rpm/
         Basenames     Dirnames  Installtid  Obsoletename  Providename  Sha1header  Triggername
        Conflictname  Group     Name        Packages      Requirename  Sigmd5

  • 程序包 来源合法性和完整性验证:

    来源合法性验证:RSA

    完整性验证:SHA256

    公钥加密:
        对称加密:加密、解密使用同一密钥;
        非对称加密:密钥是成对儿的
        public key: 公钥,公开所有人
        secret key: 私钥, 不能公开

    获取并导入信任的包制作者的公钥:

        rpm -K|checksig rpmfile 检查包的完整性和签名
        rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
        CentOS 7发行版光盘提供: RPM-GPG-KEY-CentOS-7
        rpm -qa gpg-pubkey

      对于Centos发行版来说:rpm-import /etc/pki/rpm-gpg/RPM-GPG-KEY-centos-7

    验正:

     (1)安装此组织签名的程序时,会自动执行验证

     (2)手动验证:rpm- k PACEAGE-FILE

实战:

1.某程序的某文件被破坏,为了保留原来其他文件的配置,只恢复单个文件.

[root@wen-7 ~]#rpm -q  --whatprovides zsh             查看指定功能所依赖的包(针对文件丢失情况,不知道文件名称)
zsh-4.3.10-9.el6.x86_64
[root@wen-7 ~]# rpm -qf /usr/share/zsh       或查看某个文件所依赖的包 (针对文件未丢失,仅损坏)
systemd-219-19.el7.x86_64
pulseaudio-6.0-7.el7.x86_64
zsh-4.3.10-9.el6.x86_64
[root@wen-7 ~]# cp zsh-4.3.10-7.el6.x86_64.rpm  ~              #复制包文件
root@wen-7 ~]# rpm2cpio zsh-4.3.10-7.el6.x86_64.rpm | cpio -itv    #查看包内文件
[root@wen-7 ~]# rpm2cpio zsh-4.3.10-7.el6.x86_64.rpm | cpio -id /usr/share/zsh      # 提取包内的某个文件,至当前目录
[root@wen-7 ~]# ll usr/share/                                       #查看提取出的文件,
总用量 0 
drwxr-xr-x 3 root root  23 8月  21 14:52 doc
drwxr-xr-x 2 root root 124 8月  21 14:52 info
drwxr-xr-x 3 root root  17 8月  21 14:52 man
drwxr-xr-x 4 root root  40 8月  21 14:52 zsh
[root@wen-7 share]# cp -r zsh /usr/share/         #复制文件至原来位置(即提取出的文件的路径)
[root@wen-7 share]# ll /usr/share/zsh             # 查看原来位置的文件是否复制成功
总用量 0
drwxr-xr-x 4 root root 36 8月  21 14:56 4.3.10
drwxr-xr-x 2 root root  6 8月  21 14:56 site-functions

2.安装程序包

[root@wen-7 base]# rpm -ivh zsh-html-4.3.10-7.el6.x86_64.rpm               -ivh :安装程序,显示详细信息,并显示进度条
警告:zsh-html-4.3.10-7.el6.x86_64.rpm: 头V3 RSA/SHA1 Signature, 密钥 ID c105b9de: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:zsh-html-4.3.10-7.el6            ################################# [100%]
[root@wen-7 base]# rpm -qi zsh-html                               #查询程序包的相关信息
Name        : zsh-html
Version     : 4.3.10
Release     : 7.el6
Architecture: x86_64
Install Date: 2016年08月21日 星期日 15时01分03秒

[root@wen-7 base]# rpm -ivh --test zd1211-firmware-1.4-4.el6.noarch.rpm          --test : 测试安装 测试安装情况,不真正安装
警告:zd1211-firmware-1.4-4.el6.noarch.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID c105b9de: NOKEY
准备中...                          ################################# [100%]
[root@wen-7 base]# rpm -qi zd1211-firmware
未安装软件包 zd1211-firmware 

[root@wen-7 base]# rpm -ivh --test zd1211-firmware-1.4-4.el6.noarch.rpm 
警告:zd1211-firmware-1.4-4.el6.noarch.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID c105b9de: NOKEY
准备中...                          ################################# [100%]
[root@wen-7 base]# rpm -qi zd1211-firmware
未安装软件包 zd1211-firmware 
[root@wen-7 base]# rpm -ivh --nosignature  zd1211-firmware-1.4-4.el6.noarch.rpm         --nosigbature: 不检查包的来源合法性,无头V3 RSA/SHA256 
准备中...                          ################################# [100%]
正在升级/安装...
   1:zd1211-firmware-1.4-4.el6        ################################# [100%]

3.升级程序包

[root@wen-7 base]# rpm -U zlib-1.2.3-29.el6.x86_64.rpm    升级某程序包,程序包不存在则执行安装
[root@wen-7 base]# rpm -U   --force zlib-1.2.3-29.el6.x86_64.rpm  强制升级 ,不关心依赖关系,(可能强制升级单个程序包.但不能使用)

[root@wen-7 base]# rpm -U   --oldpackage --force zlib-1.2.3-29.el6.x86_64.rpm       :强制降级某程序包,安装旧版本 可以不强制

4.卸载程序包

[root@wen-7 base]# rpm -e zsh     命令加上程序包名 直接卸载
[root@wen-7 base]# rpm -qi zsh
未安装软件包 zsh 


[root@wen-7 base]# rpm -e zlib         不能直接卸载有依赖关系的程序包
错误:依赖检测失败:
	libz.so.1()(64bit) 被 (已安裝) libxml2-2.9.1-5.el7_1.2.x86_64 需要
	libz.so.1()(64bit) 被 (已安裝) info-5.1-4.el7.x86_64 需要
	libz.so.1()(64bit) 被 (已安裝) libpng-2:1.5.13-5.el7.x86_64 需要
	libz.so.1()(64bit) 被 (已安裝) librevenge-0.0.2-2.el7.x86_64 需要
[root@wen-7 base]# rpm -e --nodeps zlib  如果想卸载某个有依赖关系的程序包,需使用--nodeps 选项,强制卸载某程序包,但不建议使用,会破坏某工具的使用

[root@wen-7 base]# rpm -e --test --nodeps zlib   测试卸载 ,不真实卸载

[root@wen-7 base]# rpm -e --allmatches   zlib    卸载所有匹配指定名称的程序包的各版本

   

回顾:

 rpm命令实现程序管理:

         安装:-ivh –nodepsd,–replacepkgs

         卸载:-e,–nodeps

         升级:-Uvh,-Fvh –nodeps,–oldpackage

         查询:-q,-qa,-qf,-qi,-qd,-qc,-q –scripts,-q –changlog,-q –provides,-q –requires

         校验:-v

         导入GPG密钥:–import,-K,–nodigest,–nosignature

         数据库重建:–initdb ,–redilddb

 以上是对程序包管理的概论和对rpm命令的总结,依据此文档可以Centos6.8或7.2系统做练习,熟悉rpm的系列命令。下节将介绍程序包管理之Yum工具的介绍,欢迎阅读,参考。

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

(0)
wencxwencx
上一篇 2016-08-21
下一篇 2016-08-21

相关推荐

  • Linux bash中命令执行状态返回值

    Linux bash中命令执行状态返回值 在操作系统中,命令的执行后输出的内容为命令执行结果输出,而这个命令本身是否执行成功,它是通过命令执行状态返回值来标识的。 常用的值: 0 表示命令执行成功非0 表示命令执行失败 bash中获取命令执行状态返回值的方法 在刚执行完一条指令后,使用echo $?取得上一条指令的命令执行状态返回值,示例如下:  …

    Linux干货 2016-11-06
  • Linux中命令的分类,hash缓存表与别名

        命令的分类:     在Linnux中,平常工作用的是字符界面。Linux输入命令后,shell接收命令通过系统调用把命令送入内核中执行。    *shell中的可执行命令分为两类        1.内部命令:为shell自带命令,利用某种形式在开机后…

    Linux干货 2017-07-15
  • 进程和计划任务

    进程概念 内核的功用:进程管理,文件系统,网络功能,内存管理,驱动程序,安全功能等 Process:运行中的程序的一个副本,是被载入内存的一个指令集和     进程ID(Process ID,PID)号码被用来标记各个进程     UID,GID和SELinux语境决定对文件系统…

    Linux干货 2016-09-13
  • Linux安全和openssl、gpg加密

                     Linux安全和openssl、gpg加密 本章内容: 安全机制 对称加密 不对称加密 散列算法 PKI和CA openssl 证书管理 gpg   加密需要: 不加密的流量易受攻击性 密码/数据嗅探 数据操作 验证操作 相当…

    系统运维 2016-10-09
  • RAID解说

    RAID(RedundantArrays of Inexpensive Disks,RAID),又叫独立的磁盘阵列。有“价格便宜具有冗余能力的磁盘阵列”之意。原理是利用数组方式来作磁盘组,配合数据分散排列的设计,提升数据的安全性。磁盘阵列是由很多价格较便宜的磁盘,组合成一个容量巨大的磁盘组,利用个别磁盘提供数据所产生加成效果提升整个磁盘系统效能。利用这项技术…

    2017-03-14
  • iptables/netfilter入门

      iptables是Linux中的重要组件,它是对报文进行过滤,在2001年的1月Linux 2.4内核发布以来,就已经是Linux的一部分了。     现在的iptbales已经成为了功能很大的防火墙,具备了专有的商业防火墙的大多数的功能了。 1、防火墙简介 2、iptables/netfilter简介 …

    Linux干货 2017-01-31