Linux程序包管理之二

  程序包管理的前端工具:

    CentOS系,yum,dnf


  yum:

    Yellowdog Updater Modified

    Yellowdog是一款发行版linux,使用rpm作为默认的程序包管理工具


    URL: yum定位软件仓库及仓库中程序包文件的主要标识方式;

    schema://[username@]hostname[:port][/PATH/TO/DOCUMENT][parameters][method]

    web站点:

      http/https

      http://www.163.com


    yum是C/S架构的模型,其中服务器也称为软件仓库(yum repository),客户端需要书写URL以指定服务器及程序包路径;


    在服务器上,软件仓库其实就是一个目录,在目录中包含了程序包文件及元数据文件;

    元数据文件统一的存放于repodata的目录中;也可以说,repodata目录所在的路径即为软件仓库的路径;


    createrepo命令:

      createrepo - Create repomd (xml-rpm-metadata) repository

      createrepo [options] <directory>

        <directory>:存放程序包的目录


    客户机的使用:

      yum程序包

      yum的主配置文件:/etc/yum.conf

        ini风格的配置信息模式:分段式配置内容

          [repositoryid]

          statements


      注意:所有的配置语句,其生效的范围是从一个[]开始,到下一个[]结束

    例如:

      [repo1]

      statements 


      [repo2]

      statements


      注意:

        1.repositoryid必须全局唯一

        2.repositoryid不能包括除了.和_之外的任何特殊字符,可以包含字母和数字,字母严格区分大小写机制;


    /etc/yum.conf文件的内容

[main]

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

keepcache=0

debuglevel=2

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


想要更加全面的信息,可以使用man 5 yum.conf获取;


# PUT YOUR REPOS HERE OR IN separate files named file.repo in /etc/yum.repos.d

  用户自定义的repository的指向信息,可以写在主配置文件中;也可以将用户自定义的repository的指向信息,以.repo为文件后缀名,并且存放于/etc/yum.repos.d目录中;

  主配置文件:

    /etc/yum.conf

    只提供yum仓库指向信息的公共配置内容;

    注意:该文件一般情况下,不进行任何修改;

  片段配置文件:

    /etc/yum.repos.d/*.repo

    每一个以.repo为后缀名的文件,即为一个仓库文件;这样的每个文件中可以配置指向一个或多个yum仓库;


    yum程序在查找yum仓库的时候,根据这些配置文件来查找的;每一次可能会找到多个yum仓库,从所有可以使用的仓库中查找最新版本的程序包并缓存到本地进行安装,升级等操作;


    同类的多个仓库被称为镜像;只要有一个可用即可;

    不同类的仓库也可以同时存在多个,yum可以同时使用这些仓库;


.repo文件该如何定义:

[repositoryid]

name=Full name of repository

baseurl=schema1://hostname/PATH/TO/REPODATA

        schema2://hostname/PATH/TO/REPODATA

        schema3://hostname/PATH/TO/REPODATA

        schema4://hostname/PATH/TO/REPODATA

  schema:

    http[s]、ftp、nfs:网络服务器指向

    file:本地服务器指向

#mirrorlist=mirror_url

enabled={0|1},0表示禁用此仓库指向,1表示启用;如果没有enabled语句,默认为启用状态;

gpgcheck={0|1},0表示不进行程序包认证,1表示认证;如果为1,需要指定认证所需要的公钥文件,需要使用gpgkey语句;

gpgkey=schema://hostname/PATH/TO/PUBLIC_KEY_FILE

  例子:gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$releasever


failovermethod={roundrobin|priority}

  故障倒换方法:

    roundrobin:随机查找,默认的方法;

    priority:按照顺序依次选择

enablegroups={1|0}

cost=num,默认所有仓库的开销值都是1000;


一般的repo指向内容:

[repoid]

name=

baseurl=

#mirrorlist=

enbaled=1

gpgcheck=0

#gpgkey=


yum命令的用法:

  yum - Yellowdog Updater Modified

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

    [options]:

      -y, --assumeyes:对于yum执行过程中与用户交互的问题,全部以yes回答

      -q, --quiet:安静模式,在某一次yum执行过程中,没有任何信息输出到stdout;

      --enablerepo=repoidglob

      --disablerepo=repoidglob

        在某一次yum执行过程中明确的规定启用或禁用某个repository指向;在使用了这样的选项之后,仓库指向文件中的enabled语句的作用将失效;

      --noplugins:

        在某一次yum执行过程中,明确指出不使用任何插件;

      --nogpgcheck:

        在某一次yum执行过程中,明确指出不验证程序包完整性,在仓库指向文件中的gpgcheck=1语句会失效;


    [command]

      command is one of:

        * install package1 [package2] [...]

          安装程序包

          注意:

            1.如果只是给出程序包名称,yum搜索所有仓库,并找到最新版本缓存安装;

            2.如果给出程序包的名称及版本,则查找安装指定版本的程序包;

            3.如果给出的程序包是完整的程序包名,则只是查找某一个程序包;

            4.程序包名称可以使用globbing,(* ? [] [^])


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

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

        * check-update

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

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

        * downgrade package1 [package2] [...]

          程序包升级或降级:

            程序包不同版本之间的更迭;


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

          卸载程序包:  


        * list [...]

            yum list LIST OPTIONS

            LIST OPTIONS:

              all: 显示所有的程序包,包括已经安装的和尚未安装但可用的;

                注意:

                  anaconda:CentOS系统的安装器,在安装操作系统的时候一并安装的程序包;

              installed:显示所有已经安装的程序包;

              available:显示所有尚未安装但可以安装的程序包;

              updates:显示所有可以升级更新的程序包;


        * info [...]

          yum info LIST OPTIONS

          LIST OPTIONS:

              all: 显示所有的程序包,包括已经安装的和尚未安装但可用的;

                注意:

                  anaconda:CentOS系统的安装器,在安装操作系统的时候一并安装的程序包;

              installed:显示所有已经安装的程序包;

              available:显示所有尚未安装但可以安装的程序包;

              updates:显示所有可以升级更新的程序包;


              name[globbing]


        * 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]

          给yum提供一个交互式命令的操作界面


        * localinstall rpmfile1 [rpmfile2] [...]

           (maintained for legacy reasons only - use install)

        * localupdate rpmfile1 [rpmfile2] [...]

           (maintained for legacy reasons only - use update)

          实现本地程序包安装,即:不依赖于软件仓库,直接对rpm格式包文件进行操作;

          这两个命令已经被停用,使用install和update取代;


        * reinstall package1 [package2] [...]

          重新安装


        * deplist package1 [package2] [...]

          显示每个程序包所有的依赖关系;


        * repolist [all|enabled|disabled]

          列表显示yum仓库的元数据信息

          在没有给出后面的参数的时候,默认为enabled;


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


        * history [info|list|packages-list|packages-info|summary|addon-

       info|redo|undo|rollback|new|sync|stats]

          查看yum事务的历史;

            安装、升级、卸载等操作的时候,yum会开启事务;


        * load-transaction [txfile]

          重新启动已经停止的事务;


        * check


        * help [command]


CentOS7中的yum命令:

  程序包组的管理命令:

    * groups [...]

      groups {install | remove | list | info | update}


      别名:groupinstall groupremove grouplist groupinfo groupudpate


    * autoremove [package1] [...]

      自动卸载:


    * repoinfo [all|enabled|disabled]


常用的第三方yum仓库,Fedora EPEL,

  到官方站点或镜像站点中,下载epel-release程序包,并且使用rpm命令安装至对应的Linux发行版本,在/etc/yum.repos.d目录中,会多出一个epel.repo的文件;更新repolist即可使用;


  要求Linux虚拟机能够连接互联网;


yum的repo配置文件中的变量:

  $releasever:当前操作系统的发行版本的主版本号;

    如:CentOS 7.2-1511,其发行版本的主版本号是7

        CentOS 6.7,其发行版本的主版本号是6


  $basearch:当前计算机所使用的基础平台架构类型;

    如:Intel兼容机

          i686

          x86_64

        apple计算机设备

          ppc

          ppc64


  $arch:平台架构类型

  $YUM0~$YUM9:yum内置的由用户自定义的10个变量;


为什么要用这些变量?

  服务器(repository, 仓库)必须能够提供所有的常有发行版本及平台相关的程序包;但是服务器无法预测任何一个客户端具体的版本使用情况;


  所以让用户自行选择:


  .repo

  baseurl=https://mirrors.aliyun.com/epel/7/x86_64


创建本地yum仓库:

  createrepo /PATH/TO/PACKAGES


  yum-config-manager --add-repo=URL


CentOS程序包管理器之编译安装

  为什么要进行源代码编译安装?

    1.对应的程序包并不能直接获取到;

    2.已经编译好的二进制中,尚不包含我们所需要的功能;

    3.已经编译好的二进制中,包含的功能太多,我们并不需要;


  源代码包有两种:

    由程序员直接打包的源代码:name-VERSION.tar.gz

    由第三方利用rpm工具制作的rpm源代码包:name-VERIONS-release.src.rpm

      /usr/src/name-VERIONS


  源代码的组织形式:

    1.多文件组成

    2.文件中的代码之间,甚至是不同文件的代码段之间都可能存在依赖关系;


  源代码的项目管理工具:

    C/C++项目管理工具:make

    Java项目管理工具:maven


  源代码 --> 预处理(预处理器,cpp) --> 编译(编译器,gcc) --> 汇编(汇编器) --> 链接(链接器) --> 用于执行操作的二进制文件


  针对于每个需要编译的源代码文件,都可能会有一个或多个被他依赖的文件或他所依赖的文件,这样的信息会被保存到一个配置文件中;这个配置文件会告诉我们:

    1.调用哪个预处理器,如何进行预处理;

    2.调用哪个编译器,如何进行编译;

    3.文件的编译顺序等等;


    这类文件一般是makefile,这样的makefile文件并不是事先存在的,也不是对所有用户的需求都一视同仁的;


    程序员可以使用专用的工具,来对于所有的源代码文件进行内容分析和抽取,构建出makefile文件,所有的makefile文件都有一个统一的模版——Makefile.in


    用户可以根据自己的需要,自行构建makefile文件,从而实现能够满足自己需求的编译过程


    帮助用户生成makefile文件的通常是一个名为configure的脚本文件;


    开发工具:

      autoconf:帮助用户生成configure脚本

      automake:帮助用户生成Makefile.in的模版文件


  建议:任何的源代码包,在解压缩之后,都会提供INSTALL或README的文档文件,我们在编译操作之前,最好先查阅此类文件的内容, 以确定编译过程;


开源程序的源代码的获取方式:

  1.官方自建的站点:

    apache.org(ASF)

    mariadb.org

    ...


  2.代码的托管站点

    SourceForge

    Github

    code.google.com


需要使用编译器:gcc (GNU C Complier)


开发环境的安装:

  CentOS7: 

  1.yum groups install "开发工具"

    yum groups install "Development Tools"


  CentOS6:

    yum groupinstall "Development Tools" "Server Platform Development"

    "Desktop Platform Development"



  2.yum install make automake autoconf gcc glibc qt ncurses


通常来讲,Linux系统中的编译安装程序的三大步骤:

  1.configure [options...]

  2.make

  3.make install


第一步:

  ./configure [options...] [VAR=VALUE]...

    常用选项分类:

      1.安装路径的设定:

        --prefix=/PATH/TO/SOMEWHERE

          指定默认的程序安装路径,如果不给该选项,默认路径/usr/local/

        --sysconfdir=DIR

          指定配置文件的安装路径


      2.系统类型:

      

      3.可选特性:

        --disable-FEATURE

          在编译过程中禁用某种特性或功能

        --enable-FEATURE[=ARG]

          在编译过程中启用某个特性或功能


      4.可选程序包:

        --with-PACKAGE[=ARG]

          在编译过程中,选择使用额外的程序包

        --without-PACKAGE

          在编译过程中,不使用额外的程序包


第二步:

  make


第三步:

  make install


编译收尾工作:

  /usr/local/apache2里面会包含bin, sbin, etc, lib, lib64, include, man, ...


  1.导出二进制文件:

    创建一个文件: /etc/profile.d/httpd.sh

      export PATH=/usr/local/apache2/bin:/usr/local/apache2/sbin:$PATH


  2.导出库文件:

    创建一个文件:/etc/ld.so.conf.d/httpd.conf

      /usr/local/apache2/lib64


    ldconfig [-v]


  3.导出头文件:

    在/usr/include目录中,为编译安装的软件创建头文件的符号链接:

      ln -sv /usr/local/apache2/include /usr/include/httpd


  4.导出帮助文件:

    CentOS6: /etc/man.config

    新添加一行:MANPATH=/usr/local/apache2/man


    CentOS7: /etc/man_db.conf

    新添加一行:MANPATH_MAP=/usr/local/apache2/bin /usr/local/apache2/man

举例安装httpd-2.4.18

  1.首先要解决开发工具环境;

    yum groupinstall "Development tools"


  2.使用适合httpd-2.4.18版本的apr及apr-util工具;

    安装apr工具

      ~]# tar xf apr-1.5.2.tar.bz2 -C /usr/src

      ~]# cd /usr/src/apr-1.5.2

      ~]# ./configure --prefix=/usr/local/apr-1.5.2

      ~]# make

      ~]# make install


    安装arp-util工具

      ~]# tar xf apr-util-1.5.4.tar.bz2 -C /usr/src

      ~]# cd /usr/src/apr-util-1.5.4

      ~]# ./configure --prefix=/usr/local/apr-util-1.5.4 --with-apr=/usr/local/apr-1.5.2

      ~]# make

      ~]# make install


  3.需要安装pcre-devel以满足httpd的正则表达式使用需求;

    yum -y install pcre-devel


编译安装httpd:

  ~]# tar xf httpd-2.4.18.tar.gz -C /usr/src

  ~]# cd /usr/src/httpd-2.4.18

  ~]# ./configure --with-apr=/usr/local/apr-1.5.2 --with-apr-util=/usr/local/apr-util-1.5.4

  ~]# make

  ~]# make install


收尾:

  1.导出二进制文件:

    vim /etc/profile.d/httpd.sh

    export PATH=/usr/local/apache2/bin:$PATH


    source /etc/profile.d/httpd.sh


  2.导出库文件:

    vim /etc/ld.so.conf.d/httpd-x86_64.conf

    /usr/local/apache2/modules


    ldconfig -v


  3.导出头文件:

    ln -sv /usr/local/apache2/include /usr/include/httpd


sed命令:

vim的末行命令(ex模式命令):


sed:Stream EDitor,流编辑器,以行为单位对一个或多个文件进行编辑处理;每一次sed都会处理给定文件中的一行内容。


在sed处理文本时,将正在处理的当前行存储到临时的缓冲区中,称为“模式空间”;用当前行去匹配给定的PATTERN,如果能匹配,则使用command编辑处理;如果不匹配,则默认输出至标准输出;然后继续处理下一行,直到文件的末尾。


默认情况下,sed的所有处理行为不会影响源文件的内容;


我们一般会使用sed命令来自动编辑一个或多个文件,简化对文件的循环操作;


sed命令:

  sed - stream editor for filtering and transforming text

  sed [OPTION]... 'script' [input-file]...

    常用选项:

      -n, --quiet, --silent:对于不能匹配模式的行,默认不输出到屏幕;

      -e script, --expression=script:多条件编辑;

      -f script-file, --file=script-file:从指定的script-file中读取脚本

        注意:script-file为一个能够定位到脚本文件的路径,最好为绝对路径

      -i[SUFFIX], --in-place[=SUFFIX]:原文件直接编辑操作;

      -r, --regexp-extended:使sed支持扩展正则表达式;


    script:

      'AddressesCommand'


      Addresses(地址定界):

        1.空地址:对所有文件的所有行进行处理;

        2.单地址:sed对于能够匹配该地址的那唯一一行进行处理;

          num:表示行号;

          /pattern/:能够匹配该模式的所有行;

          $:表示文档最后一行

        3.地址范围:

          addr1,addr2:从addr1开始到addr2结束的中间所有行;

            例如:2,8

          first~step:从first标记的行号开始,以step所代表的数字为步长;

            例如:1~2, 2~2

          addr1,+N:从addr1开始,包括addr1所在行,并继续向后计算N行;

            例如:2,+7相当于2,2+7

          addr1,~N:从addr1开始,包括addr1所在行,向后计算addr1*N行;

            例如:2,~5相当于2,2*5

          /pattern1/,/pattern2/:从被pattern1匹配的第一行开始计算,一直到被/pattern2/匹配到的第一行结束;


      Command(处理命令):

        =:显示被模式匹配的行的行号

          例如:sed -n '/^$/=' /etc/grub2.cfg

        a \text:在被模式匹配的行的后面追加text的内容,支持使用\n换行,从而实现多行追加;

        i \text:在被模式匹配的行的前面插入text的内容,支持使用\n换行,从而实现多行插入;

        c \text:将被模式匹配的行的修改为text的内容,支持使用\n换行,从而实现一行变多行;

        d:在模式空间中删除被模式匹配的行;这样的行不能再进行标准输出;

          注意:在使用d命令的时候,不宜使用-n选项;

        p:显示模式空间中被模式匹配的行;

          注意:在使用p命令的时候,通常会搭配-n选项;

        w filepath:将模式空间中被模式匹配的行,另存到filepath文件中;

        r filepath:将filepath文件的内容追加至模式空间中被模式匹配的行之后;

        !Command:在模式空间中被模式匹配的行,不执行Command命令;相反,未被模式匹配的行,参会执行Command命令

        s///:查找替换,分隔符可以任意更换,只要相同即可;

          s@@@, s###, s,,,

          s/pattern/text/[control]

          s@/etc/fstab@/etc/mtab@


          pattern:计划查找并替换的内容

          text:要替换的结果

          control:如何进行替换

            g:行内全部替换

            p:显示替换成功的行

            w filepath:将替换成功的行另存到filepath文件中;


          支持后向引用:

            s/\(string\)/&/

            s/\(string\)/\1/


      高级编辑命令:

        h: 把模式空间中的内容覆盖至保持空间中

        H:把模式空间中的内容追加至保持空间中

        g: 从保持空间取出数据覆盖至模式空间

        G:从保持空间取出内容追加至模式空间

        x: 把模式空间中的内容与保持空间中的内容进行互换

        n: 读取匹配到的行的下一行覆盖至模式空间

        N:追加匹配到的行的下一行至模式空间

        d: 删除模式空间中的行

        D:删除多行模式空间中的所有行


      示例:

        sed -n 'n;p' FILE

        sed '1!G;h;$!d' FILE

        sed '$!N;$!D' FILE

        sed '$!d' FILE

        sed ‘G’ FILE

        sed ‘g’ FILE

        sed ‘/^$/d;G’ FILE

        sed 'n;d' FILE

        sed -n '1!G;h;$p' FILE



grep:文本搜索

sed:文本编辑工具

awk:文件格式化工具