linux软件包管理

linux软件包管理

简介

    在Linux系统中,软件包的安装和管理是很重要的知识,而linux/unix一个麻烦的地方就是软件安装程序比较麻烦和复杂,尤其是当所安装的软件包要处理较多的包依赖关系,这就更让人头疼了,最常见linux软件安装方式有三种:

    本文主要介绍Linux中RedHat或CentOS发行版的软件包管理。

一、软件包的表现形式:

(1)、软件的源代码,需要自己动手编译它。这种软件安装包通常是用gzip压缩过的tar包(后缀为.tar.gz)。
源码安装的好处是不会受到平台的限制,而且能够根据自己的系统和平台自己优化一些选项,所以这个是比较推荐的一种安装方式,缺点是对于软件的依赖关系只能靠自己的经验来解决了。
(2)软件的可执行程序,也是二进制软件包。
其实可以细分为rpm包与yum包安装。RPM为最常见的两类软件包管理工具,他们的安装的时候不要需要网络,只要下载下来在系统上安装即可。rpm包的使用容易受平台和系统的限制,所以要根据自己的linux的分支版本以及cpu平台等来决定下载和使用何种软件包。而且需要自己处理软件的依赖关系。
   redhat系列软件安装包通常被是一个RPM包(Redhat Linux Packet Manager,就是Redhat的包管理器),后缀是.rpm。
   二进制更方便的一种安装形式就是yum。这种方式的安装软件的时候需要联网,好处是能自动处理软件间的依赖关系,比较推荐。
   Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装. [百度百科]
(3)脚本安装,其实就是安装命令的堆积,当然也要对系统比较了解才能写出好的脚本,既可以包含yum这类,也可以使用rpm这类命令。如lnmp一键安装脚本。

二、软件软件安装:

      第一部分:搞定rpm

      RPM是Red Hat公司随Redhat Linux推出了一个软件包管理器,通过它能够更加轻松容易地实现软件的安装、卸载、升级、查询、校验、数据库维护。

   1.安装软件:
      命令:rpm {-i|–install} [install-options] PACKAGE_FILE …
      选项:-v: verbose表示显示附加信息 [可选]
            -h: 以#显示程序包管理执行进度;每个#表示2%的进度 [可选]
            -i:install 不能省略,表示安装
      [install-options]
         –-test: 测试安装,但不真正执行安装过程;dry run模式;
         –-nodeps:忽略依赖关系;(这样比较麻烦,而且通常无法使用)
         –-replacepkgs: 重新安装;
         –-nosignature: 不检查来源合法性;
         –-nodigest:不检查包完整性;
         –-noscipts:不执行程序包脚本片断;
            %pre: 安装前脚本; –nopre
            %post: 安装后脚本; –nopost
            %preun: 卸载前脚本; –nopreun
            %postun: 卸载后脚本;  –nopostun

   2.软件包升级:
      命令:rpm {-U|–upgrade} [install-options] PACKAGE_FILE …

       或  rpm {-F|–freshen} [install-options] PACKAGE_FILE …
            -U:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则“安装”;
            -F:安装有旧版程序包,则“升级”;如果不存在,则不执行升级操作;
                –-oldpackage:降级;
                –-force: 强行升级;

   3.卸载rpm包:
      命令:rpm {-e|–-erase} [–-nodeps] [–-noscripts] [–-notriggers] [–-test] PACKAGE_NAME …
      选项:-e: earse表示从系统中删除软件,软件包必须是已安装的软件包名称,不是软件包的文件名

   4.安装软件:
      命令:rpm {-q|–query} [select-options] [query-options]

      [select-options]
         –a: 所有包;
         –f: 查看指定文件是由哪个包安装生成;
         –p:不检查包完整性;
         –whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供;

         –whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供;

      [query-options]
         –c: 查询程序包的配置文件;
         –d: 查询程序包的帮助文档;
         –i:程序包的详细信息;

          –l:指定程序安装完成后生成的所有文件;

          -R:查询指定的程序包所依赖的CAPABILITY;

         –provides:列出指定程序包所提供的CAPABILITY;

    5.校验:
      
命令: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

     导入所需要公钥:

      命令:rpm –import /PATH/FROM/GPG-PUBKEY-FILE

       CentOS 7发行版光盘提供的密钥文件:RPM-GPG-KEY-CentOS-7

软件依赖关系: 

   由于开源的多态性,Linux 操作系统中的软件之间的依赖性关系处理一直令人感到头疼。如果 package_a 依赖于 package_b,那么在一个没有安装 package_b 的系统中,package_a 是不被系统推荐安装的,强制安装很可能会导致软件无法正常工作。基于以上 package_a 和 package_b 的关系,在一个干净的系统中 ( 未安装 package_a 或 package_b),欲安装 package_a,错误通常会表现为:

 [root@vm227 Packages]# rpm -ivh php-5.3.3-26.el6.x86_64.rpm 

 error: Failed dependencies: 

        httpd is needed by php-5.3.3-26.el6.x86_64 

        httpd is needed by php-5.3.3-26.el6.x86_64

        php-cli(x86-64) = 5.3.3-26.el6 is needed by php-5.3.3-26.el6.x86_64  

        php-common(x86-64) = 5.3.3-26.el6 is needed by php-5.3.3-26.el6.x86_64 

嵌套的依赖关系:

  如上示例为最理想的依赖关系,实际应用中往往最令人头疼的是 package_a 依赖于 package_b/c/d/e/f 等多个包 , 而 package_b/c/d/e/f 等包又依赖于 package_b1,b2,b3/c1,c2/d1,d2/e1,e2/f1,f2 等等 … … 为保证软件的正常使用,必须找到所有依赖包以及子依赖包并且安装。过多的依赖关系大大降低了 Linux 软件安装的用户友好性。所以针对此类问题,使用了更高级的包管理策略去解决 – Yum 。

      第二部分:搞定YUM

      YUM:RPM包的前端管理工具,解决包依赖性,可以在多个库中定位软件包。

   1.YUM命令的使用:
      命令:rpm {-i|–install} [install-options] PACKAGE_FILE …
      显示仓库列表:repolist [all|enabled|disabled]
            list:
            # yum list [all | glob_exp1] [glob_exp2] […]
               # yum list {available|installed|updates} [glob_exp1] […]
      安装程序包:
               # yum install package1 [package2] […]
      重新安装:
               # yum reinstall package1 [package2] […]  
         升级程序包:
               # yum update [package1] [package2] […]
         降级程序包:
               # yum downgrade package1 [package2] […]
         检查可用升级:
               # yum check-update
         卸载程序包:
               # yum remove | erase package1 [package2] […]
         查看程序包information:
               # yum info […]
         
查看指定的特性(可以是某文件)是由哪个程序包所提供:
               # yum provides | whatprovides feature1 [feature2] […]
         清理本地缓存:
               # yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
         构建缓存:

               # yum makecache

      搜索:以指定的关键字搜索程序包名及summary信息;

               # yum search string1 [string2] […]
          查看指定包所依赖的capabilities:
               # yum deplist package1 [package2] […]
          查看yum事务历史:
                 # yum history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
            包组管理的相关命令:
                   * groupinstall group1 [group2] […]
                   * groupupdate group1 [group2] […]
                   * grouplist [hidden] [groupwildcard] […]
                   * groupremove group1 [group2] […]
                   * groupinfo group1 […]

   2、配置额外YUM库(客户端):

        方法一:在/etc/yum.repos.d目录下新建.repo结尾的文件或者修改原有的repo文件,更方便的是直接下载第三方的yum源的配置文件,如网易163的源文件。

       方法二:用光盘搭建本地yum源,但是你会发现很多光盘包含的软件包都比较旧。        

    yum客户端:

            配置文件:

                /etc/yum.conf:为所有仓库提供公共配置

                /etc/yum.repos.d/*.repo:为仓库的指向提供配置

            仓库指向的定义:

                [repositoryID]

                name=Some name for this repository

                baseurl=url://path/to/repository/

                enabled={1|0}

                gpgcheck={1|0}

                gpgkey=URL

                enablegroups={1|0}

                failovermethod={roundrobin|priority}

                默认为:roundrobin,意为随机挑选;

                cost=1000(默认

第三部分:搞定linux源码安装

   程序包编译安装:
    源代码 –> 预处理 –> 编译(gcc) –> 汇编 –> 链接 –> 执行
    源代码组织格式:
    多文件:文件中的代码之间,很可能存在跨文件依赖关系;
        C、C++: make (configure –> Makefile.in –> makefile)
        java: maven
    C代码编译安装三步骤:
        ./configure:
            (1) 通过选项传递参数,指定启用特性、安装路径等;执行时会参考用户的指定以及Makefile.in文件生成makefile;
            (2) 检查依赖到的外部环境;
        make:
            根据makefile文件,构建应用程序;
        make install

    开发工具:
        autoconf: 生成configure脚本
        automake:生成Makefile.in

    建议:安装前查看INSTALL,README
    第一步:configure脚本
    选项:指定安装位置、指定启用的特性

    –help: 获取其支持使用的选项
    选项分类:
    安装路径设定:
    –prefix=/PATH/TO/SOMEWHERE: 指定默认安装位置;默认为/usr/local/
    –sysconfdir=/PATH/TO/SOMEWHERE:配置文件安装位置;

    System types:

    Optional Features: 可选特性
    –disable-FEATURE
    –enable-FEATURE[=ARG]

    Optional Packages: 可选包
    –with-PACKAGE[=ARG]
    –without-PACKAGE

    第二步:make

    第三步:make install

    安装后的配置:
    (1) 导出二进制程序目录至PATH环境变量中;
    编辑文件/etc/profile.d/NAME.sh
    export PATH=/PATH/TO/BIN:$PATH

    (2) 导出库文件路径
    编辑/etc/ld.so.conf.d/NAME.conf
    添加新的库文件所在目录至此文件中;

    让系统重新生成缓存:
    ldconfig [-v]

    (3) 导出头文件
    基于链接的方式实现:
    ln -sv

    (4) 导出帮助手册
    编辑/etc/man.config文件
    添加一个MANPATH

   如果遇到错误提示,也别急,通常是十分简单的问题:
      1)没有安装C或C++编译器;
      确诊方法:执行命令gcc(C++则为g++),提示找不到这个命令。
      解决方法:将Linux安装光盘mount上来,然后进入RPMS目录,执行命令:
      #rpm -ivh gcc* (哈哈,我们用到了第二种安装方式)
   2)没有安装make工具;
      确诊方法:执行命令make,提示找不到这个命令。
      解决方法:将Linux安装光盘mount上来,然后进入RPMS目录,执行命令:
      #rpm -ivh make*
   3)没有安装autoconf工具;
      确诊方法:执行命令make,提示找不到这个命令。
      解决方法:将Linux安装光盘mount上来,然后进入RPMS目录,执行命令:
      #rpm -ivh autoconf*
   4)缺少某些链接库;
      确诊方法:在make时,提示需要某些文件。
      解决方法:安装包含这个文件的包,这就需要积累了。
   5)软件依赖;
      这时候只有安装软件的依赖关系,按照先后顺序安装软件。

  第四部分:搞定bin文件安装

  1.以bin结尾的安装包,这种包类似于RPM包,安装也比较简单
  2.给文件加上可执行属性:chmod +x ******.bin
  3.执行命令:./******.bin
  4.ok:

总结

本文linux下,程序包的几种形式以及安装方法水平有限, 如果有错误及时指出;
作者:chrony 
感谢: MageEdu

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

(0)
上一篇 2016-05-05 10:07
下一篇 2016-05-05 13:53

相关推荐

  • 设计模式(一)工厂模式Factory(创建型)

      在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象。 在…

    Linux干货 2015-06-23
  • 设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)

    1.概述 在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,即将行为分布到各个对象中。 对于一个模块或者系统,可能由很多对象构成,而且这些对象之间可能存在相互的引用,在最坏的情况下,每一个对象都知道其他所有的对象,这无疑复杂化了对象之间的联系。虽然将一个系统分割成许多对象通常可以增强可复用性,但是对象…

    Linux干货 2015-07-20
  • Recycled和Recycler的故事

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://jeffyyko.blog.51cto.com/28563/156012      首先说明一下,这里不是英语课堂,本文也不是来辨析Recycled和Recycler这两个单词的含义。Recy…

    Linux干货 2015-03-25
  • 网络班23期学习宣言

    马哥Linux运维学院 学习宣言 亲爱的小伙伴:        欢迎大家报名马哥Linux运维网络学习班,跟随马哥学习Linux技术,成就Linux大牛之梦。在这里,我们不仅可以学习到最优秀的技术课程,还可以跟着追梦的小伙伴们一起学习、一起进步。 为了督促大家一直积极认真努力的学习,请各位同学在评论区写出你的学习宣言。…

    2016-09-05
  • 设计模式(五)适配器模式Adapter(结构型)

    1. 概述:          接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题。程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库的发展和进化。         例子1:iphone…

    Linux干货 2015-06-25
  • 常用文本处理命令练习

    1、列出当前系统上所有已经登录的的用户的用户名,注意同一用户登录多次,则只显示一次 [root@keyou ~]#  w -hs | cut -d' ' -f 1 | sort -u  gentoo …

    系统运维 2016-11-13