Linux程序包管理

程序包管理器:
功能:将编译好的应用程序的各组成文件打包成一个人或n个程序文件,从而更贱方便地实现程序包的安装,升级,卸载和查询等管理操作。

        debian:dpt,dpkg.".deb"
        redhat:redhat package manager,rpm,".rpm"
        s.u.s.e:rpm,".rpm"
        Gentoo:ports
RPM的优点:
          由于RPM是通过预先编译并打包成为RPM文件格式后,再加以安装的一种方式,并且还能够进行数据库的记载。所以RPM有以下优点:
          (1)RPM内涵已经编译过的程序与配置档等数据,可以让使用者免除重新编译的困扰
      (2)RPM在被安装之前,会先检查系统的硬盘容量,操作系统版本等,可避免文件被错误安装
      (3)RPM文件本身提供软件版本的资讯,依赖性软件名称,软件用途说明,软件所含文件等资讯
      (4)RPM管理的方式使用数据库记录(/var/lib/rpm/)RPM文件的相关参数,便于升级,移除,查询与验证
  • 获取程序包的途径:
    1.系统发行版的光盘或者官方的文件服务器(或者镜像站点)
    http://mirrors.aliyun.com
    http://mirrors.sohu.com
    http://mirrors.163.com
    2.项目的官方站点
    3.第三方组织:
    EPEL,搜索引擎:http://pkgs.org,rpm.phone.net..
    4.自己动手,丰衣足食
    * Centos系统上rpm命令管理程序包:
    安装,升级,卸载,查询和检验,数据库维护

    1.rpm命令:rpm [OPTIONS] PACKAGE_FILE
       安装:rpm {-i|--install} [install-options] PACKAGE_FILE ...
                升级:rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
                卸载:rpm {-e|--erase} [--allmatches]  [--nodeps] [--test] PACKAGE_NAME ...
                查询:rpm {-q|--query} [select-options] [query-options]
                检验:rpm {-V|--verify} [select-options] [verify-options]
                数据库维护:rpm {--initdb|--rebuilddb}[-v][--dbpath DIRECTORY]

    2.安装:rpm {-i|--install} [install-options] PACKAGE_FILE ...

    GENERAL OPTIONS:
                               -v:verbose,详细信息
                               -vv:更详细输出
                [install-options]:
                         -h:hash marks:输出进度条,每个#表示2%的进度
                        --test:测试安装,检查并报告依赖关系及冲突消息等
                        --nodeps:忽略依赖关系(不建议使用)
                        --replacepkgs:重新安装
                        --nosignature:不检查来源合法性,不检查包签名信息
                        --nodigest:不检查完整性
                        --noscripts:不自带脚本
                         注意:rpm可以自带脚本:
                                   (1):preinstall:安装过程开始之前运行的脚本:%pre
                                    (2)postinstall:安装之后运行的脚本:%post
                                    (3)preuninstall:卸载过程真正开始执行之前运行脚本:%preun
                                    (4)postuninstall::卸载过程真正开始执行之后运行脚本:%postun
                          常用组合命令:-ivh,-ivvh

    3.升级:

    rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
             -U:升级或安装
            rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
               -F:升级
              组合使用:-Uvh,-Fvh
                --test:不执行真正的安装过程,而仅报告依赖关系及冲突信息等
                --nodeps:忽略依赖关系,副作用是能安装成功,但未必能运行成功
                --oldpackage:降级到旧版本
                --force:强制升级
          注意:(1)不要对内核做升级操作,linux允许多内核版本,因此直接安装新版本内核
                    (2)如果某原程序包的配置文件安装后曾被修改过,升级时新版本的程序提供同一个配置文件不会覆盖原有的版本的配置文件,而是把新版本的配置文件重命名(加后缀.rpmnew)后保存.

    4.卸载:

    rpm {-e|--erase} [--allmatches]  [--nodeps][--test] PACKAGE_NAME ...
       简单用法:rpm -e PACKAGE_NAME ...
                             --nodeps:忽略依赖关系
                             --test:测试卸载:dry-run模式
                             --allmatches:如果一个程序包同时安装多个版本,则此选项一次全部卸载之;
                             注意:如果程序包的配置文件安装后曾被修改,卸载时,此文件通常不会被删除,而是被重命名(加后缀.rpmsave)后留存

    5.查询:rpm {-q|--query} [select-options] [query-options]

    [select-options]
                    -q PACKAGE_NAME:查询某包或某些包是否安装
                    -a,--all :查询已经安装的所有包;
                    -f ,--file,/PATH/TO/SOMEFILE:查询某文件是由个包安装生成
                    -p,--package PACKAGE_NAME:用于实现对未安装的程序包执行查询操作
                [query-options]
             --changelog:查询rpm包的changelog;
                 -l,--list:程序包安装生成所有文件列表
                 -i,--info:程序包相关的信息,版本号,大小,所属包,组等
                -c, --configfiles:查询指定的程序提供的配置文件
                -d, --docfiles:查询指定的程序提供的文档
                --provides:查询某包提供的capabilties
                -R, --requires:查询指定程序包所依赖关系
                --scripts:查询某包安装或卸载时执行脚本
                常用用法:
                 -qi PACKAGE_NAME:查询某包的相关信息
                  -ql PACKAGE_NAME:查询某包安装生成的文件列表
                 -qf PACKAGE_NAME:查询某文件是由个包安装生成
                  -qc  PACKAGE_NAME:查询某包安装完成后生成的所有配置文件
                  -qd  PACKAGE_NAME:查询某包安装完成后生成的所有帮助文件
                  -q --changelog  PACKAGE_NAME:查看某包制作时随版本变化的changelog信息
                    -qpi PACKAGE_FILE:查询尚未安装的包文件的相关信息,使用-p选项

    6.检验:rpm {-V|--verify} [select-options] [verify-options]
    查询包安装之后生成的文件是否发生了改变
    常用用法:rpm -V PACKAGE_NAME
    当没有输出结果时表示软件包完整Ok
    程序包的合法性验证:
    在软件安装之前我们最好是要对即将安装的软件进行合法性验证,这样可以检查出软件是否来源合法,内容合法等,在一定程度上避免一些由不安全的因素导致不安全的事件发生
    所谓来源合法是指:
    由我们信任的制作者提供;依赖于制作者的数字签名,签名是作者使用自己的私钥加密程序包的特性码进行的
    所谓内容合法是指:
    包未被二次修改;完整性校验成功,依赖于制作者提供的程序特征码
    验证方式:
    安装者用同样的特征码提取算法提取程序包的特征码,并与原作者提供的相比较
    验证其光盘中程序包的来源及完整性:
    先导入合法的KEY文件rpm --import /path/to/RPM-GPG-KEY-FILE

    例如:rpm --import RPM-GPG-KEY-Centos-6
        验证:rpm {-K|--checksig} PACKAGE_FILE
                   --nosignature:不检查来源合法性
                             --nodiget:不检查完整性

    7.创建rpm数据库:

    rpm {-initdb|--rebuilddb}[-v][--ddpath DIRECTORY]
                   -initdb:初始化数据库,即数据库完全不存时,可新建之
                   --rebuilddb:无论当前数据存在与否,都会直接重建此库,构建的数据库存放在/var/lib/rpm当中。

    * Centos系统上yum命令管理程序包:

      yum是通过分析RPM的标投数据后,根据各软件的依赖关系制作有依赖关系时的解决方案,然后可以自动处理软件的依赖性问题,以解决软件安装或移除与升级的问题

    1.yum的配置文件:
    主配置文件:/etc/yum.conf,为各仓库指向提供公共配置文件
    各仓库的定义:/etc/yum.repos.d/*.repo

    仓库定义参数:[repositoryid]:对于当前系统的yum来讲,此repositoryid用于唯一标识此repository指向,因此,其必唯一;
              name:此前仓库描述信息;
              baseurl:url://path/to/repositroy/
             #指明repository的访问路径,通常一个文件服务器上的输出的某repository
             #url支持的类型:
                  ftp服务:ftp://SERVER/PATH/REPOSITORY
                        http服务:http://SERVER/PATH/TO/REPOSITORY
                        本地目录:file:///PATH/TO/REPOSITORY
               enable={1|0} #此仓库是否可被使用
               gpgcheck={1|0} #是否对程序包做校验
               gpgkey=url://path/to/keyfile #指明gpgkey文件路径
               cost=   #指明当前repositrory的访问开销,默认为100

    2.yum命令的使用:

    yum [options] [command] [package ...]
    
    列出已经配置的所有可用仓库:yum repolist [all|enabled|disabled]:
    显示程序包:yum list [all|glob_exp1][glob_exp2]
                        yum list {available|updates|installed|extras|obsoletes}[glob-exp1][...]
                        yum grouplist [hidden][groupwildcard][...]
    安装/重新安装程序包:
                        yum  install/reinstall package1 [package2]
    升级/降级程序包:
                       yum update/downgrade package1 [package2]
    检查可用升级:
                      yum check-update
    程序包卸载:
                      yum remove|erase  package1 [package2]
    注意:所有依赖于正卸载的程序包的程序包也会被一并卸载
    查看程序包信息:
                     info [package]
    查看指定程序包特性(可以是某文件)是由哪个程序包所提供:
                     provides|whatprovides /PATH/TO/SOMEFILE
     清理本地缓存:
                    yum clean [packages|metadata|expires-cache|rpmdb|plugins|all]
      构建缓存:
                      yum makecache
        以指定关键字搜索程序包以及summary信息:
                    search KEYWORD
        查看指定包所依赖的capabilities:
                    deplist package1 [package2]
        查看yum各历史:
                   history [info|list|[package]
        包组管理相关命令:
                  列出所有的包组:yum grouplist
                            显示指定包组详情:yum groupinfo group1
                            安装:yum groupinstall group1
                            卸载:yum groupremove group1
                            升级:yum groupupdate group1
            注意:也可以直接用install,remove或update来管理包组,此时需要在组名前面加@符号,如:yum install @"Server Platform Development"
            yum命令的可用选项:
                   -y:自动回答为"yes"
                         --disablerepo=:临时禁用在配置文件中配置并启用的某repository;
                         --enablerepo=: 临时启用指定的某repo;
                         --nogpgcheck:禁止做包校验
              yum有一些内置变量:用于保存当前平台的信息,这些常用的变量有:
                      (1)$releaserver:当前OS发行版的主版本号;
                                 例如,对CentOS 6.6 x86_64,主版本号为6:
                        (2)$arch:平台
                                i386,i486
                        (3)$basearch:基础平台,例如i686,i486以及i386的基础平台同为i386
                            如:在yum的配置文件中定义的baseurl的路径为:
                                  baseurl=http://repo.xxx.com/centos/$releaserver/$basearch
                                        且当前系统为Centos 6.6 x86_64,因此实际的baseurl路径为:
                                        http://repo.xxx.com/centos/x86_64

    3.制作本地yum源

    第一种:使用发行版光盘作为yum repository
             (1)   挂载光盘至指定挂载点:
                         mount -r /dev/cdrom  /media/cdrom/
                    (2)/etc/yum.repos.d下新建以.repo的配置文件:
                                 [dvdbase]
                                 name=CentOS 7
                                 baseurl=file:///media/cdrom
                                 gpgcheck=0
                                 enable=1
            第二种:创建本地yum仓库
                    (1)在基于发行版安装createrepo程序包
                            (2)确定repository输出方式:
                                 (a)本地输出:提供一个放置rpm包的本地路径:file的形式
                                 (b)网络输出:提供一个文件服务器,配置好ftp服务或者http服务:
                                         ftp服务:
                                                   安装程序包:vsftpd
                                                         文件存放路径:/var/ftp/pub
                                                         启动服务:service  vsftpd start
                                                http服务:
                                                     安装程序包:httpd
                                                         文件存放位置:/var/www/html
                                                         启动服务:service httpd start
                                                注意:确保防火墙服务关闭
                                    (3)在准备好的目录中放置rpm程序包文件
                                         也可以通过cp命令将光盘中的程序包拷贝到以上输出目录中
                                    (4)对此目录运行createrepo命令即可:
                                         cd到以上输出目录执行createrepo命令即可

    * 源代码编译安装程序
    1.编译安装开发工具(包组)有:
    Development tools
    Server Platform Development
    Desktop Platform Development
    Debug Tools
    2.被依赖的程序包的开发组件:
    (1)编译安装被依赖的程序
    (2)安装相关程序的名称中包含devel子包
    3.编译人员的编译安装过程如下:

    (1)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
                    (2)运行make命令,完成项目构建
                    (3)运行make install命令,完成安装
                    注意:前两步只需要普通用户权限,建议使用普通用户身份进行,最好一步根据安装路径的指定,可能会用到管理权限.
        4.安装后的配置:
           ```

    (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