首页 > 代码库 > Linux下软件包管理

Linux下软件包管理

为什么要有软件包管理器?


     虽然使用源代码进行编译可以定制一些高级功能,但对于Linux发行商来说,管理软件不容易,而且不是每个使用Linux的用户都有能力进行编译安装,如果能够将软件预先在相同的硬件与操作系统上编译好在发行出发行版的话,就可以让相同的发行版具有完全一致的软件版本,再加上安装/删除/管理机制,从此对软件包的管理也就相对简单得多,所以就将源代码包按照对应的平台格式封装起来,并发行出来,发行出来的软件包,我们在红帽系列的系统上称之为 RPM;


两大主流的软件包管理器版本:

    RPMRPM是RedHat Package Manager(RedHat软件包管理工具)的缩写,是红帽研发出来的包管理器,但是其原始设计理念是开放式的,现在包括OpenLinux、S.u.S.E.以及Turbo Linux等众多Linux的分发版本都有采用RPM,进行软件包管理;   扩展名即 .rpm

    DPKG目前采用DPKG管理方式的主流操作系统主要有debian和ubuntu系列,扩展名即.ded。(因为本篇内容主要介绍RHEL系列的软件包管理器,所以不在此做过多说明)




一、RPM软件包管理器:


功能:简化在Redhat Linux 系列系统中发布、安装、升级和删除软件包的过程。
1、RPM软件包命名格式:
         name-version-release.architecture.rpm

        bash-4.1.2-29.el6.x86_64.rpm

                         .noarch  有时在架构段也会出现 noarch

                            注:noarch代表不依赖于某架构运行,而是依赖自己的虚拟环境,可跨平台运行;

         name:软件名;version:软件包的源码包版本;release:制作后的版本;architecture:软件包对应平台;

场景1:一个软件只有几个功能是常用的,有几个功能是开发相关的,几个是不常用的功能,所以没有必须安装一个软件包时,把它所有的功能全部安装上,在制作RPM包的时候就会出现一个软件存在多个软件包:

wKiom1SCul2R20bHAAEQI3vv8Ww681.jpg


RPM命令的使用格式:


        rpm  {-i|--install}   [install-options]      PACKAGE_FILE ....


  • -q 在系统中查询软件或查询指定 rpm 包的内容信息
    -a 代表所有软件包,通常与 -q 一起使用
    -i 在系统中安装软件
    -U 在系统中升级软件
    -e 在系统中卸载软件
    -h 会以 # 号为进度条显示 rpm 包的安装过程
    -v 详述安装过程(可以同时用多个v,v越多显示的内容越详细)
    -p 表明对 RPM 包进行查询,通常和其它参数同时使用,如:
    -qlp 查询某个 RPM 包中的所有文件列表
    -qip 查询某个 RPM 包的内容信息



[install-options]:

    --replacepkgs:重新安装

    --nodeps: 忽略依赖关系

    --force:强制安装

    --test: 测试安装,而不执行真正的安装过程;

    --oldpackage:降级安装   


RPM命令参数具体使用方法:




1、安装


    注:上面列出的具体参数有些需要组合使用,比如说 rpm -v packname.rpm 是没有意义的,必须要配合 rpm -ivh 使用才会有意义,下面一一举例:

# rpm -ivh zsh-4.3.10-9.el6.x86_64.rpm 
Preparing...                ########################################### [100%]
   1:zsh                    ########################################### [100%]

上面的命令即实现了最基本的软件包安装功能;




2、卸载


# rpm -ev   zsh  卸载一个指定的软件包


        --nodeps:卸载时忽略依赖关系

        --test:卸载测试,只是测试,并不真正卸载


        --noscripts:不执行卸载时的脚本

        --allmatches:把所有匹配到指定包名的软件包全部卸载

            注:如果软件包的配置文件在安装后被改动过,卸载时,此配置文件不会被删除,而是会被重命名为(原文件加.rpmsave后缀)并保留;




3、升级


升级即是用较高版本的软件包,替换较低版本软件包的过程:

 # rpm -Uvh packagename.rpm       指定一个高版本的软件包,替换当前系统上的包


 # rpm -U -ivh zsh-4.3.10-9.el6.x86_64.rpm    如果指定的软件包已经被安装,则升级安装

   

 # rpm -F -ivh zsh-4.3.10-9.el6.x86_64.rpm     如果指定的软件包没有被安装,则不安装该包

  




4、查询


# rpm -q bash   查询指定软件包
bash-4.1.2-29.el6.x86_64
# rpm -qa       查询本机所有已安装的软件包

# rpm -qa |grep bash  查询所有已安装的包,在通过管道传给grep过滤出所需的软件包,此时-a就显得特别重要
bash-4.1.2-29.el6.x86_64


# rpm -qf    /path/to/somefile   查询某文件由哪个软件包安装生成

# rpm -qpl  PACKAGE_FILE  查看指定的未安装包安装后会生成哪些文件

# rpm -qpi  PACKAGE_FILE  查询指定未安装包的详细信息、厂商、制作日期、版本等

# rpm -ql  PACKAGE_NAME  查询某包安装后生成的所有文件列表

# rpm -qc PACKAGE_NAME   查询某包安装后生成的所有配置文件列表

# rpm -qd PACKAGE_NAME   查询某包安装后生成的所有帮助文件列表

# rpm -q --changelog PACKAGE_NAME  查询某rpm包制作时随版本变化的changelog列表信息

# rpm -q --scripts PACKAGE_NAME    查询某包的卸载时执行的脚本





安装卸载脚本有四种:

   

        preinstall: 安装前执行的脚本

        postinstall: 安装后执行的脚本

        preuninstall: 卸载前执行的脚本

        postuninstall: 卸载后执行的脚本




5、校验


      包校验是比较自软件包中安装的文件信息和软件包中的原始文件的相同信息。 与其它校验相同,包校验将比较文件的长度、MD5校验和、许可、类型、文件属主和群组。

      使用 rpm -V 命令进行包校验。用户可以配合使用各个包选择选项 ,来列出校验包的查询结果。 简单地使用 rpm -V bash 可以校验 bash 包中原始安装时的所有文件。例如:


# rpm -Vf /bin/vi     校验包含特定文件的软件包

# rpm -Va                校验所有已安装的软件包

# rpm -Vp foo-1.0-1.i386.rpm   用 RPM 包文件校验已安装的软件包

 

     如果校验结果一切正常,将不会产生任何输出。如果有不一致的地方,会显示出来。 输出格式是8位长字符串, "c" 用以指配置文件,接着是文件名。8位长字符,每个代表一个文件属性与RPM数据库中记录的属性相比较的结果。"." (点) 表示测试通过。下面的字符代表某测试的失败:


5 -- MD5 校验和
S -- 文件长度
L -- 符号链接
T -- 文件修改日期
D -- 设备
U -- 用户
G -- 用户组
M -- 模式 (包含许可和文件类型)
? -- 不可读文件

     如果有信息输出, 就代表字母对应的内容被修改过;


      RPM包有一个问题,当你指定安装一个rpm包时,可能会出现一个RPM包依赖另一个RPM包才能安装,可能一个包会依赖好多包,所以异常麻烦,红帽为了解决这种依赖关系,将各种RPM包的依赖关系统一存放在一个数据库中,在需要安装软件包,先去查询这个数据库,找到对应的依赖关系,并会分清这些包安装的先后顺序,并安装它们,这种软件管理机制或软件管理器,我们就称之为 YUM;




 


二、Yum (Yellow dog Updater, Modified是一个在 RHEL 中的字符前端软件包管理器。基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装,可以处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。


1、yum repository: yum仓库  (由软件包和软件包的元数据组成)


    存储了众多rpm包,以及包的相关元数据的文件(放在repodata目录中)

    Yum可以通过网络服务接口连接到对应的通过文件服务器输出了很多文件的接口上去,使用客户端程序安装数据包时,Yum会自动通过配置文件中定义的yum服务器去检索服务器上是否存在该软件包,并通过网络下载到本地放在一个缓存目录中,并安装 ;

    yum在检查包的时候,必须要能发现包和包的依赖关系;  yum 在使用时,要先向仓库将这个元数据下载下来,包含了哪些包,包的版本号等,每一个包提供的文件列表,每个包的依赖关系;而后在安装程序包时,只需要在本地仓库中检查有没有这个包即可; 也会检查本地有哪些程序被它所依赖到;还有本地依赖,但是本地没有的,一并从服务器上下载下来;

    注意:仓库是有开销的,开销越小越先使用,如果多个仓库有同一个程序,它会找一个最新版的;

    整个过程都会先分析本地所有仓库的元数据,包装完以后下载下来的包就会被清空,但是元数据不会被清空;


yum 所支持的服务器输出格式:

        http://        ftp://        nfs://        file://



yum客户端:

配置文件:指向仓库的位置列表以及各种配置信息;每个yum客户可以有多个可用的yum仓库;


由两部分组成:

    主配置文件:

            /etc/yum.conf

            /etc/yum.repos.d/*.rep


仓库文件格式:/etc/yum.repo.d/


[REPO_ID]  repoID 应该是全局唯一的;

name=REPO description     仓库名

baseurl=ftp://172.16.0.1/pub/CentOS6/   仓库位置

enabled={1|0}        此仓库是否启用

gpgcheck={1|0}        是否进行校验

gpgkey=ftp://172.16.0.1/pub/CentOS6/gpg-key    如果进行校验,需要指定公钥的存放位置

repodata   对应的元数据文件所在的目录;




yum命令:

    yum [options] [command] [package ...]


       command is one of:

        * install package1 [package2] [...]   

        * update [package1] [package2] [...]

        * update-to [package1] [package2] [...]

        * check-update

        * upgrade [package1] [package2] [...]

        * upgrade-to [package1] [package2] [...]

        * distribution-synchronization [package1] [package2] [...]

        * remove | erase package1 [package2] [...]

        * list [...]

        * info [...]

        * provides | whatprovides feature1 [feature2] [...]

        * clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]

        * makecache

        * groupinstall group1 [group2] [...]

        * groupupdate group1 [group2] [...]

        * grouplist [hidden] [groupwildcard] [...]

        * groupremove group1 [group2] [...]

        * groupinfo group1 [...]

        * search string1 [string2] [...]

        * shell [filename]

        * resolvedep dep1 [dep2] [...]

        * localinstall rpmfile1 [rpmfile2] [...]

           (maintained for legacy reasons only - use install)

        * localupdate rpmfile1 [rpmfile2] [...]

           (maintained for legacy reasons only - use update)

        * reinstall package1 [package2] [...]

        * downgrade package1 [package2] [...]

        * deplist package1 [package2] [...]

        * repolist [all|enabled|disabled]

        * version [ all | installed | available | group-* | nogroups* | grouplist | groupinfo ]

        * history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]

        * load-transaction [txfile]

        * check


yum仓库相关的命令:


列出所有可用仓库:

     

   # yum repolist


列出所有程序包:

      

  
# yum list {all|installed|available}


列出所有包组:  


    # yum grouplist


缓存管理:


      # yum clean {all|packages}
        # yum makecache


安装:    


   yum install PACKAGE_NAME ...


安装指定的版本的程序:   


  yum install PACKAGE-VERSION


重装指定的程序包:

       

 yum reinstall PACKAGE_NAME ...


升级:

        yum update PACKAGE_NAME


如果有多个版本的升级包可用,且仅期望升级到指定版本:

     

   yum update PACKAGE-VERSION


降级:

 

   yum downgrade PACKAGE_NAME


检查可用升级:

     

  yum check-update


卸载:

 

      yum erase|remove PACKAGE_NAME   依赖于此程序包的其它包,会被一并卸载;


查询:

        yum list

     

查询指定包信息:

   yum info PACKAGE_NAME

     

根据关键字模糊查询包名或包的sumary信息包含此KEYWORD的相关列表:

   yum search KEYWORD:


查询指定文件是由哪个包安装的:

       

 yum provides|whatprovides /path/to/somefile


显示所有包组:

yum grouplist

       

 显示某包组的相关信息:       

yum groupinfo "GROUP_NAME"


安装包组:

   

    
yum groupinstall "GROUP_NAME"    或    yum install @GROUP_NAME


        

卸载包组:

       

yum groupremove "GROUP_NAME"
 yum remove @"GROUP_NAME"

 升级包组:

        
yum groupupdate "GROUP_NAME"


yum命令还可用安装本地rpm包文件:

yum localinstall /path/to/rpm_package_file ...


       

选项:

--enablerepo=      临时启用指定repo源


--disablerepo=     临时关闭指定repo源

注意:优先级高于/etc/yum.repos.d/*.repo配置文件中定义的属性;   -y: 自动回答为yes


--nogpgcheck      不进行完整性检测 

本文出自 “那些颠沛留离的日子。” 博客,请务必保留此出处http://linuxzj.blog.51cto.com/6160158/1587066

Linux下软件包管理