Linux程序包管理

  Linux的各个release版本开发商,在发布各种应用程序,以及一些团体发布应用程序时,通常会根据发布的程序所适应的开发语言,使用环境,预设参数等,事先编译完成一个可以在相应平台上安装的程序包供使用者直接使用,该程序包含有安装前(preinstall)操作系统环境检测的脚本,程序包中所有文件的相关信息,程序预定义的配置参数文件,程序运行时的解释器库文件,程序的二进制文件,以及程序安装后(postinstall)把相应信息写入程序管理平台的预设脚本,以方便于后续程序自身升级,卸载等,最终上述一个完整的程序包被release发布。


       针对此类发布的程序包目前常见有两种管理方式:

1、DPKG方式:主要由Debian系列的release版本使用,如Ubuntu;

2、RPM方式:主要由RedHat系列,如RHEL,CentOS,Fedora以及Slackware系列的S.u.S.E等等;

       此外由于程序包在preinstall时会根据脚本检查是否满足安装条件,例如安装本程序前需要预先存在其他一个或多个程序(程序的相互依赖性),如果满足则进行后续安装过程,如果不满足则退出安装过程;所以,为了简化方便程序包的安装,Linux的开发商同时提供了一种面向使用者的程序包管理的前端工具,目的就是为了解决程序的依赖性安装,以及程序的更新升级,卸载,查询等日常管理使用。针对上述两种方式分别使用1、apt-get工具;2、yum工具。


       RPM和SRPM区别

1、RPM(RedHat Packages Manager):是由Distribution厂商预先根据release版本已编译打包完成的程序包;

2、SRPM(Source RPM):是由Distribution厂商提供的未编译的,含有原始码的程序包;

Linux程序包管理 image.png

       程序包的命名定义格式

     Linux程序包管理 image.png

     Linux程序包管理   

程序名-主版本号.次版本号.修正号-release发布号.Distribution版本.arch架构(i386/i586/i686/x86_64等)


 YUM工具

由于RPM程序包在安装前会检查程序依赖性,如果不符合,则无法正常安装,此时,其前端工具YUM程序应运而生。YUM原理机制如下:

1、YUM服务器端,含有全部或者大部分RPM程序包,并生成所有程序包的清单列表(repository仓库清单);

2、客户端主机安装指定程序包时,首先根据RPM包中的preinstall脚本检查主机硬件以及OS内核是否满足安装环境要求,其次检查安装程序的其他软件依赖性要求,从YUM服务器下载程序包清单列表,对照依赖性要求检查主机是否满足,如果存在未安装的依赖性程序包软件,则向YUM服务器提交下载相应程序包的请求,并安装完成,通过依赖性检查后,正式安装指定的程序包,安装完成以后,把该程序包的相应信息记录在主机本地的RPM数据库中,供日后查询,升级,卸载等操作使用;

YUM服务器保存清单列表的路径:…./repodata/

Linux程序包管理 image.png

主机保存本地清单的路径:/var/cache/yum/

Linux程序包管理 image.png

主机RPM程序包管理数据库路径

Linux程序包管理 image.png

RPM管理程序

一、RPM安装

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

       -i:install 安装

       -v:verbose 详细过程信息

       -vv:更详细的过程信息,类似debug信息

       -h:hash 以hash进度条的方式显示安装进行,默认是2%一个进度步长

       –nodeps:忽略程序包依赖性检查

       –test:测试性安装,dry run模式,并非实际的真实安装

       –noscripts:安装时不执行预设置的脚本,更细化的脚本(禁用)

           –nopre

           –nopost

           –nopreun

           –nopostun

       –nosignature:忽略数字签名检查

       –justdb:RPM数据库破坏或者有错误存在,可以利用此选项来更新程序包在RPM数据库中的信息

      –percent:如果程序包是被打包压缩的形式提供,则此选项可以在安装时显示解包的进度百分比信息

      –force:强制安装,如果已存在相应文件或者程序包则覆盖安装,同时包含replacefiles以及replacepkgs两个选项功能

          –replacefiles:如果已存在需安装的文件,则直接覆盖原文件

          –replacepkgs:如果存在需安装的程序,则直接覆盖原程序

      –prefix NEWPATH:安装程序到指定的路径(而非程序包预先配置的默认路径)


二、RPM更新与升级

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

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

       upgrade:无则安装,有则更新

       freshen:无则错误,有则更新

           option可选项基本与install操作相同


三、RPM查询,如果是已经被安装过的程序包,实际就是查询/var/lib/rpm下的数据库;如果是尚未安装的程序包,则是查询repository仓库中的数据库

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

       -q:仅查询package_name指定的程序

       -qa:查询package_name指定的所有程序

       -qf:查询后面指定的file是属于哪个已经安装的程序

       -qi:列出查询程序的详细信息(information),包括Distribution,release,说明等等

       -ql:列出程序中完整的文件与目录信息(list)

       -qc:列出程序包的所有配置文件(configure files),主要就是/etc下的配置文件

       -qd:列出程序包的所有帮助文件(doc files)

       -qR:列出程序包相依赖性的程序文件(Requires)

       -q –scripts:列出程序包安装或者卸载进程指定的脚本

       -q –provides:列出程序包自身能提供的功能

       -qp[iflcdR….]:查询未安装的程序包


四、RPM验证与数字签名

       rpm {-V|–verify} [select-option] [verify-option] PACKAGE_NAME

       -V Package_Name:验证指定的程序包所包含的文件是否被改动过

       -Va 不加任何参数:验证所有可能被改动的程序包

       -Vp Package_File_Name:验证指定的程序包是否被改动过

       -Vf file_Name:验证指定的文件是否被改动过

 如果相应的程序或者文件发生改变,通过Verify验证后,会提示如下改变的参数:

Linux程序包管理 image.png

      S:size-文件大小

      M:Mode-文件类型或者文件的属性

      5:MD5-文件内容

      D:Device的Major/Minor改变

      L:Link路径改变

      U:owner改变

      G:group改变

      T:modify Time改变

      P:caPabilities功能改变


      c:configure文件

      d:document文件

      l:license文件

      r:read me文件

      g:ghost文件,鬼文件,通常指该文件不被某个程序所包含,较少见的一种情况

数字签名:

    GNU Privacy Guard(GPG)系统,使用不对称技术实现,RPM发布者拥有私钥,RPM使用者利用发布者提供的公钥来验证数字签名的有效性,并信任其发布的程序包;

数字签名验证步骤:

1、从正规途径获得发布者的公钥

途径:官网,授权镜像站点,DVD光盘等

2、导入(安装)公钥到本地主机操作系统

导入命令:rpm –import /PATH/……GPG-KEY…..(GPG-KEY关键字)

查询导入的公钥:rpm -qi | grep *pubkey*(pubkey关键字)

3、利用导入的公钥验证数字签名的有效性

4、通过数字签名验证,接受其发布的RPM程序包,执行后续的安装,升级等操作


五、RPM删除或者卸载

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

       RPM数据库重建:用户本地/var/lib/rpm下数据库的重建

       rpm –rebuilddb


YUM前端程序管理工具

一、安装与升级操作

       yum {install|update|upgrade} 

            -y:yes,安装时不需要交互式确认

            –installroot=/path:指定程序包安装的路径,而非默认的程序路径

            update  (空):后面未指定任何程序包或者文件,则升级更新当前所有已安装的程序包

            update PACKAGES_NAME:更新指定的程序包

            upgrade 除了更新升级已安装的程序包之外,连陈旧的淘汰程序包也升级

二、查询操作

       yum {list|info|search|provides|whatprovides}

           list:显示已安装的程序包信息,类似rpm -qa

           search:以某个程序包或者描述的关键字搜索程序包

           info:显示指定程序包的详细信息,类似rpm -qi

           provides:以文件为关键字搜索程序包,类似rpm -qf

           

三、删除卸载操作

       yum remove PACKAGES_NAME


四、YUM仓库

yum工具使用仓库清单方式找到所需的程序包,对于YUM服务而言,清单主要是指repodata目录中的数据,对于客户端主机而言,安装,升级,卸载程序包以后,会在本地/var/cache/yum目录下保存记录本地的程序包清单;

此外,如果使用rpm方式安装,升级,卸载程序包,会在主机/var/lib/rpm目录下生成一个rpm的数据库,供rpm方式进行程序包的管理(查询,升级,卸载等操作);

创建YUM仓库步骤:

1、在yum程序配置文件目录下,增加或者新建.repo后缀的仓库名录(可以在系统原有的repo仓库中新增或者完全新建一个.repo后缀的仓库)

Linux程序包管理image.png

2、通过vim编辑仓库清单配置文件

Linux程序包管理 image.png

3、清空主机原有仓库清单信息

Linux程序包管理 image.png

4、重新生成最新的清单

Linux程序包管理 image.png

image.png

Linux程序包管理 

Linux程序包管理

通过上述步骤配置,后续就可以直接通过YUM方式进行程序包的安装,升级,查询,卸载操作了,通过YUM方式很好的解决了程序包相互依赖性的问题,对于不需要额外自定义配置参数的程序包生成并安装的使用者大大方便了RPM程序包的管理操作。


有时候,源仓库的可靠性对系统而言是非常重要的,一般我们都使用官方或者可信任的第三方所提供的仓库镜像点进行在线方式的YUM管理使用,但是针对临时性的第三方或者自定义的仓库资源,我们可以采用临时启用生效的模式进行操作,例如,上文中我通过临时挂载DVD光盘方式制定了一个repo程序包仓库资源,如果不希望其永久生效的话,可以采用如下方式进行操作:

1、首先挂载DVD设备

Linux程序包管理 image.png

2、创建repo临时性的仓库资源配置文件

Linux程序包管理 image.png

Linux程序包管理 image.png

Linux程序包管理 image.png

3、临时使用时通过yum命令选项启用

Linux程序包管理 image.png


SRPM程序包如何使用

当我们从受信任的站点资源获得含有原始代码的SRPM程序包后,如何重新编译?

1、首先,通过受信任的站点资源下载src.rpm程序包


2、通过rpm -ivh xxxx.src.rpm解开程序包(并非实际意义上的安装),命令执行之后解开(安装)的路径默认是指向/root/rpmbuild

Linux程序包管理 image.png

一般在此路径下会存在如下几个目录,分别代表不同的含义

SOURCES:主要存放原始码的tar包,补丁包patch,以及config配置文件等

SPECS:主要存放程序包的相应信息文件

BUILD:主要存放源代码编译过程中生成的文件

RPMS:主要存放编译完成以后生成的.rpm程序包

SRPMS:主要存放编译完成以后生成的.srpm程序包


3、SPECS下的.spec文件主要是该程序包的详细信息文件

    

[root@localhost rpmbuild]# cat ~/rpmbuild/SPECS/cloud-utils-growpart.spec 

Name: cloud-utils-growpart

Version: 0.27

Release: 13%{?dist}

License: GPLv3

Group: System Environment/Base

Source0: https://launchpad.net/cloud-utils/trunk/%{version}/+download/cloud-utils-%{version}.tar.gz

URL: https://launchpad.net/cloud-utils

Source1: LICENSE


BuildArch: noarch


Summary: Script for growing a partition

Group: System Environment/Base

———上述说明此程序包的基本信息————–

Requires: gawk

Requires: util-linux

———此程序包的依赖性信息————

# gdisk is only required for resizing GPT partitions and depends on libicu

# (25MB). We don't make this a hard requirement to save some space in non-GPT

# systems.

#Requires: gdisk


# patches_base=0.27

Patch0001: 0001-suppress-partx-usage-error.patch

———-下面以%开始的分段落信息表示在编译过程中的处理脚本—————

%description

This package provides the growpart script for growing a partition. It is

primarily used in cloud images in conjunction with the dracut-modules-growroot

package to grow the root partition on first boot.


%prep

%setup -q -n cloud-utils-%{version}

%patch0001 -p1


%build


%install

cp %{SOURCE1} LICENSE


# Create the target directories

mkdir -p $RPM_BUILD_ROOT/%{_bindir}

mkdir -p $RPM_BUILD_ROOT/%{_mandir}/man1


# Install the growpart binary and man page

cp bin/growpart $RPM_BUILD_ROOT/%{_bindir}/

cp man/growpart.* $RPM_BUILD_ROOT/%{_mandir}/man1/

————该程序生成的文件—————

%files

%doc ChangeLog LICENSE

%{_bindir}/growpart

%doc %{_mandir}/man1/growpart.*

———–该程序的日志改变记录————

%changelog

* Tue Mar 18 2014 Lars Kellogg-Stedman <lars@redhat.com> – 0.27-13

– suppress partx usage error


* Tue Jan 14 2014 Lars Kellogg-Stedman <lars@redhat.com> – 0.27-11

– import into RHEL


[root@localhost rpmbuild]# 

4、编译过程

命令 rpmrebuild [ba|bb] xxxx.spec

            -ba:编译并同时生成rpm以及srpm程序包

            -bb:编译并仅生成rpm程序包

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

(0)
上一篇 2016-11-29 22:36
下一篇 2016-11-30 13:54

相关推荐

  • LVS调度方法

    lvs scheduler:     根据其调度时是否考虑后端主机的当前负载,可分为静态方法和动态方法     静态方法:仅根据算法本身进行调度:         RR:Round Ronin 轮询         WRR:Weighted…

    Linux干货 2017-01-10
  • 马哥教育网络班21期第11周课程练习

    1、详细描述一次加密通讯的过程,结合图示最佳。 发送方Bob:自上至下 1、生成数据 2、Bob用单向加密算法对数据提取特征码 3、Bob用自己的私钥加密特征码,并附加在数据后面 4、Bob使用对称加密算法生成临时会话密钥加密特征码和数据 5、Bob用Alice的公钥加密临时会话密钥,并附加在数据后 接收方Alice:自下至上 1、Alice收到Bob数据,…

    Linux干货 2016-10-31
  • FTP服务

        FTP是一个非常古老的协议,其主要的作用是用于文件的传输。FTP采用明文的方式传输,极其不安全,但在局域网等环境中使用还是比较方便的。 一、工作原理     FTP的工作方式分为主动模式与被动模式。     1、主动模式 &nbsp…

    Linux干货 2015-07-08
  • linux中用ACL实现灵活的权限管理

    ACL是什么?? ACL英文原意是Access Control List(访问控制列表).它能够实现灵活的权限管理,除了文件的所有者,所属组和其他人,设置相应的权限外,ACL允许你给任何用户或是用户组设置任何文件/目录的访问权限(注意的是有些不支持数字模式的权限给定) ACL有什么用?? 作为UGO权限管理的补充,acl有GUO办不到或者是难以办到的功能 &…

    Linux干货 2016-08-05
  • Shell脚本编程 流程控制—循环

    循环:重复执行所指定的代码片段,直到循环条件不满足,则退出循环 一、for循环     语法格式:     for 变量名 in 列表     do         循环体     done &nbs…

    Linux干货 2016-08-24
  • DNS从入门到管理(一)

    DNS从入门到管理(一) DNS概念 DNS三步法 反向解析 主从DNS服务器的实现 子域授权 智能DNS 压力测试与DNS排错 DNS概述 DNS(Domain NameSystem,域名系统),域名和IP地址相互映射的一个分布式数据库,通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析。而DNS的主要作用,就是域名解析,将主机名解析成IP地址。…

    Linux干货 2016-10-06