码迷,mamicode.com
首页 > 其他好文 > 详细

CentOS程序包管理器rpm、yum以及程序包编译安装详解

时间:2016-05-06 19:43:52      阅读:576      评论:0      收藏:0      [点我收藏+]

标签:centos rpm yum 编译安装

一、程序包管理器RPM和Yum简介

程序包管理器:将编译好的应用程序的各组成文件打包成一个或几个程序包文件,可以更方便地实现程序包的安装、升级、卸载和查询等管理操作。


rpm软件包管理器(RPM Package Manager):rpm包存在依赖关系,依赖关系复杂,安装时间很长,虽然可以忽略依赖关系,但是可能会导致程序包安装后无法正常使用。


yum程序包管理器( Yellow dog Updater, Modified):yum是基于RPM包管理,自动解决程序包间的依赖关系。根据配置文件的资源地址找到远程服务器主机,服务器先会把程序包仓库元数据发送给本地,存储在cache;当有yum请求时,本地主机首先会通过cache中的程序包仓库元数据分析所需安装程序的依赖关系,然后查询本地,把剩余所需的程序包列出,从服务器下载所需程序包文件到本地;然后再开始安装程序,安装完成后自动删除本地已安装的程序包文件,但保留程序包仓库元数据,之后每次发生yum请求时,本地主机会向服务器请求程序包元数据校验码,判断存储在本地的元数据是否发生变化,如发生变化会重新下载。


注意:如果yum在安装程序的过程中终止,重新启动无法解决,无法判断程序是否安装成功。dnf可以解决此问题(在此不做详解)。


二、rpm程序包管理器详解

获取程序包的途径:

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

        http://mirrors.aliyun.com

        http://mirrors.sohu.com

        http://mirrors.163.com

    (2)项目的官方站点

    (3)第三方组织:

        (a)EPEL

        (b)搜索引擎

            http://pkgs.org

            http://rpmfind.net

            http://rpm.pbone.net

    (4)自动动手生成

注:在使用程序包之前建议先检查其来源合法性和完整性。


rpm命令:rpm  [OPTIONS] [PACKAGE_FILE]

    安装:-i,--install

    升级:-U,--update, -F, --freshen

    卸载:-e,--erase

    查询:-q,--query

    校验:-V,--verify

    数据库维护:--builddb,--initdb


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

          常用安装命令组合:rpm  -ivh PACKAGE_FILE ...

         技术分享

        GENERAL OPTIONS(通用选项):

            -vverbose,详细信息

            -vv:更详细的输出

 

[install-options]

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

--test:测试安装,检查并报告依赖关系和冲突消息等;

技术分享    --nodeps:忽略依赖关系,不建议使用;

            --replacepkgs:重新安装;

--nosignature:安装过程中不检查包签名信息,不检查来源合法性;

            --nodigest:安装过程中不检查包完整性信息;

--noscripts:禁运行rpm自带的脚本

    注:rpm可以自带脚本,脚本共有四类:

           Preinstall%pre):安装过程开始之前运行的脚本,禁运行:--nopre

           Postinstall(%post):安装过程完成之后运行的脚本,禁运行:--nopost

           Preuninstall(%preun):卸载过程真正开始执行之前运行的脚本,禁运行:--nopreun

                         Postuninstall(%postun):卸载过程完成之后运行的脚本,禁运行:--nopostun

                                                                

升级:rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...:升级或安装

      rpm {-F|--freshen} [install-options] PACKAGE_FILE ...:仅升级


常用升级命令组合:rpm  -Uvh PACKAGE_FILE ...

                            rpm  -Fvh PACKAGE_FILE ...

技术分享


        升级时使用的选项与安装的选项通用,除此外还有它自己特有的选项:

            --oldpackage:降级;

--force:强制升级;


    注意:

            (1) 不要对内核做升级操作;Linux支持多内核版本并存,如需要使用新版本内核,直接安装新版本内核即可;

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

                                                  

卸载:rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test]PACKAGE_NAME ...

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

            --nodeps:忽略依赖关系

            --test:测试卸载,dry run模式

 

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

    常用查询命令组合:

        对已安装的包进行查询:

            -qi  PACKAGE:查询程序包的相关信息

              技术分享

            -qf  FILE:查询指定的文件由哪个程序包安装所生成的

          技术分享

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

          技术分享

            -ql  PACKAGE:程序安装生成的所有文件列表

            -qd  PACKAGE:查询指定的程序包提供的文档

                           

对未安装的包进行查询:

    -qpi  PACKAGE_FILE: 查询程序包的相关信息

    -qpl PACKAGE_FILE:查询程序包安装后会生成的所有文件列表

    -qpc PACKAGE_FILE:查询程序包安装后会生成的配置文件

 

        [select-options]

            PACKAGE_NAME:查询指定的程序包是否已经安装,并显示其版本;

          技术分享

            -a,--all:查询所有已经安装过的包;

            -f  FILE:查询指定的文件由哪个程序包安装所生成的;

            -p,--package PACKAGE_FILE:用于实现对未安装的程序包执行查询操作;

            --whatprovidesCAPABILITY:查询指定的CAPABILITY由哪个程序包提供;

          技术分享

            --whatrequiresCAPABILITY:查询指定的CAPABILITY被哪个包所依赖;

          技术分享

        

        [query-options]

            --changelog:查询rpm包的changlog(修改日志);

            -l,--list:程序安装生成的所有文件列表;

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

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

            -d,--docfiles:查询指定的程序包提供的文档;

            --provides:列出指定的程序包提供的所有的CAPABILITY

           技术分享

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

技术分享

--scripts:查看程序包自带的脚本片断;


校验:rpm {-V|--verify} [select-options] [verify-options]

    技术分享

    校验操作时没有任何信息反馈,表示该程序包安装后未被修改。

   

    技术分享

校验操作时有信息反馈,表示该程序包安装后被修改过。

其中每个字符所表示的意义:

    Sfile Size differs(文件大小发生了改变);

MMode differs (includes permissions and file type)(文件权限发生了改变);

5digest (formerly MD5 sum) differsMD发生了改变);

DDevice major/minor number mismatch(主次设备号发生了改变);

LreadLink(2) path mismatch readLink路径发生了改变);

UUser ownership differs(属主发生了改变);       

GGroup ownership differs(属组发生了改变);

TmTime differs(最近一次修改时间的时间戳发生了改变);

PcaPabilities differCAPABILITIES发生了改变)。 


程序包来源合法性和完整性验正过程简述:

    1.程序包制作者首先通过使用单向加密算法生成特征码;

    2.然后用私钥加密特征码生成该程序包的数字签名;

    3.使用者先用制作者公钥解密特征码,来验证程序包来源的合法性;

    4.然后使用相同的单向加密算法产生特征码,与程序包自带的特征码进行对比,以此来验证程序包的完整性。


获取并导入信任的包制作者的密钥:对于CentOS发行版来说, CentOS7为例,rpm安装后系统会自动把秘钥复制到此路径:rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

   

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

   (2) 手动验正:rpm -K PACKAGE_FILE

 

数据库重建:

    rpm管理器数据库路径:/var/lib/rpm/,查询操作都是通过查询此处的数据库进行的。

    

    获取帮助:

        CentOS6man rpm

        CentOS7man rpmdb


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

        --initdb:初始化数据库,当前无任何数据库可实始化创建一个新的;如果已有数据库则不执行任何操作;

        --rebuilddb:重新构建,通过读取当前系统上所有已经安装过的程序包进行重新创建;


三、yum程序包管理器详解

yum repository(yum repo):存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录下:repodata)。


yum客户端:

    配置文件:

        /etc/yum.conf:为yum命令提供配置,为所有仓库提供公共配置(man yum.conf可以查看详细说明)。

            [main]

            cachedir=/var/cache/yum/$basearch/$releasever

            keepcache=0                本地缓存文件使用完后是否保存

            debuglevel=2               yum安装完程序包后的调试级别

            logfile=/var/log/yum.log

            exactarch=1                在安装程序包时是否进行精确平台匹配

            obsoletes=1        

            gpgcheck=1                 安装程序包时是否检查其合法性和完整性

            plugins=1                  是否支持插件

            installonly_limit=5        允许一批同时安装程序包的数量

            bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum

            distroverpkg=centos-release


        /etc/yum.repos.d/*.repo:为指定的仓库提供配置,方便管理

            仓库指向的定义:

            [repositoryID]

            name=Some name for this repository

            baseurl=url://path/to/repository/            仓库访问路径,可指明多个url

            enabled={1|0}                                是否启用此仓库,不写默认启用

            gpgcheck={1|0}                               对此仓库程序包安装时是否检查合法性和完整性

            gpgkey=URL                                   指明秘钥文件的访问路径

            enablegroups={1|0}                           是否支持在此仓库上使用组批量管理程序包

            failovermethod={roundrobin|priority}         故障转移方法

            当有多个baseurl时使用,默认为roundrobin(随机挑选)

            cost=                                        指明该仓库开销,默认为1000


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]

        * check

        * help [command]


    显示仓库列表:

    repolist [all|enabled|disabled]

        技术分享

 技术分享

    显示程序包:

        list:# yum list [all | glob_exp1] [glob_exp2] [...]

            # yum list {available|installed|updates} [glob_exp1] [...]

        例:

         ~]# yum list php*


    安装程序包:

        install package1 [package2] [...]

        reinstall package1 [package2] [...]  (重新安装)

        例:

         ~]# yum install gcc

    

    升级程序包:

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

        downgrade package1 [package2] [...] (降级)

        例:

         ~]# yum update gcc

    

    检查可用升级:

        check-update

        例:

         ~]# yum check-update gcc

   

    卸载程序包:

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

        例:

         ~]# yum remove gcc


        注意:卸载程序包时,会把依赖于该程序包的程序都卸载了。

   

    查看程序包information:

        info [...]

        例:

         ~]# yum info gcc

    

    查看指定的特性(可以是某文件)是由哪个程序包所提供:

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

        例:

         ~]# yum provides /bin/ls

    

    清理本地缓存:

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

        例:

         ~]# yum clean all

    

    构建缓存:

    makecache

   

    搜索:

    search string1 [string2] [...]:以指定的关键字搜索程序包名及摘要信息

        例:

         ~]# yum search bash

    

    查看指定包所依赖的capabilities:

    deplist package1 [package2] [...]

        例:

         ~]# yum deplist gcc

    

    查看yum事务历史:

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

        例:

         ~]# yum history

   

    安装及升级本地程序包:

         localinstall rpmfile1 [rpmfile2] [...]

         localupdate rpmfile1 [rpmfile2] [...]

    注意:使用install也可以完成安装。

    

    包组管理的相关命令:

        grouplist [hidden] [groupwildcard] [...]        查看包组

        groupinstall group1 [group2] [...]              安装包组

        groupupdate group1 [group2] [...]               升级包组

        groupremove group1 [group2] [...]               移除包组

        groupinfo group1 [...]                          查看包组信息

        例:

         ~]# yum groupinstall "Development Tools"


如何使用光盘当作本地yum仓库:

    (1) 挂载光盘至某目录,例如/media/cdrom

    ~]# mount -r /dev/cdrom /media/cdrom

    (2) 创建配置文件

    [CentOS7]

    name=

    baseurl=file:///media/cdrom

    gpgcheck=

   

yum的命令行选项:

    --nogpgcheck:禁止进行gpg check;

    -y:自动回答为“yes”;

    -q:静默模式;

    --disablerepo=repoidglob:临时禁用此处指定的repo;

    --enablerepo=repoidglob:临时启用此处指定的repo;

    --noplugins:禁用所有插件;


yum的repo配置文件中可用的变量:通过使用变量可是一个配置文件适用于多种场景。

    $releasever: 当前OS的发行版的主版本号;

    $arch: 平台;

    $basearch:基础平台;

    $YUM0-$YUM9


创建yum仓库:

    createrepo [options] <directory>


四、程序包编译安装详解

    testapp-VERSION-release.src.rpm --> 安装后,使用rpmbuild命令制作成二进制格式的rpm包,而后再安装

    

    源代码 --> 预处理 --> 编译(gcc) --> 汇编 --> 链接 --> 执行

    

源代码组织格式:多文件,文件中的代码之间可能存在跨文件依赖关系。

        

开源程序源代码的获取途径:

    官方自建站点:apache.org (ASF)

                  mariadb.org

                  ...


    代码托管站点:SourceForge

                  Github.com

                  code.google.com

           

如何编译C源代码:

    前提:提供开发工具及开发环境

        开发工具:make, gcc等

        开发环境:开发库,头文件

        glibc:标准库

        通过“包组”提供开发组件

        CentOS 6的group: "Development Tools", "Server Platform Development",

        

    第一步:configure脚本(通过autoconf结合一个配置文件生成configure脚本)

        (1) 通过选项传递参数,指定启用特性、安装路径等;执行时会参考用户的指定以及Makefile.in文件(通过automake生成Makefile.in文件)生成makefile;

            选项:指定安装位置、指定启用的特性

            --help: 获取其支持使用的选项

                

            选项分类:

                安装路径设定:

                    --prefix=/PATH/TO/SOMEWHERE: 指定默认安装位置;默认为/usr/local/

                    --sysconfdir=/PATH/TO/SOMEWHERE:配置文件安装位置;

                    

                Optional Features: 可选特性

                    --disable-FEATURE

                    --enable-FEATURE[=ARG]


                Optional Packages: 可选包

                    --with-PACKAGE[=ARG]

                    --without-PACKAGE

            

        (2) 检查所依赖到的外部环境;


    第二步:make,根据makefile文件,构建应用程序;


    第三步:make install


注:建议在安装前查看INSTALL,README文档。

    

安装后的配置:

    (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。

CentOS程序包管理器rpm、yum以及程序包编译安装详解

标签:centos rpm yum 编译安装

原文地址:http://11291941.blog.51cto.com/11281941/1770828

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!