无论我们使用哪种操作系统,仅使用操作系统自带的程序包一般都满足不了我们的使用需求,所以我们都需要安装程序。这篇博文我们来讲解一下在Linux操作系统中我们该如何安装程序。

   本篇文章会涉及rpm管理程序包、yum管理程序包、yum仓库的指定、自己编译源码安装程序、简要介绍一下该如何自己建立一个yum仓库给其他主机提供程序包。


一、rpm管理程序包  

(1)如何获取安装包 

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

http://mirrors.aliyun.com/

http://mirrors.163.com/

http://mirrors.sohu.com/

2)第三方组织:

(a)EPEL:社区组织

   http://mirrors.kernel.org/fedora-epel/

(b)非生产环境下使用的搜索引擎

http://pkgs.org 最好用

http://rpmfind.net

http://rpm.pbone.net  

 

(2)rpm管理程序包

提供的操作有:安装、升级、卸载、查询和校验、数据库维护

使用格式:rpm [OPTIONS] [PACKAGE_FILE]

概述: 

安装:-i,--install

卸载:-e,--erase

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

查询:-q,--query

校验:-V,-verify

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

  1)安装

     使用格式:rpm {-i|--install} [install-options] PACKAGE_FILE …   

                    通用选项:

-v:详细信息

-vv:更详细的信息输出

--quiet:尽量少的输出命令的提示信息,一般仅输出错误信息

    注:这里的通用选项对以下卸载等操作同样适用

    安装选项:

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

--test:只准备不安装,测试、检查和报告依赖关系和冲突信息等;

--nodeps:忽略依赖关系;不建议,因为安装了有可能使用不了;

           --replacepkgs:重新安装,一般改错了配置文件时可删掉配置文件,重新安装可恢复;

--nosignature:不检查包签名信息,不检查来源合法性;

--nodigest:不检查包完整性信息;

 --noscripts:不执行以下四类rpm自带的脚本;

--nopre:不执行安装过程开始之前运行的脚本;

--nopost:不执行安装过程完成之后运行的脚本;

--nopreun: 不执行卸载过程真正开始执行之前运行的脚本;

--nopostun:不执行卸载过程完成之后运行的脚本;


  2) 升级

    使用选项:rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...

           rpm {-F|--freshen} [install-options] PACKAGE_FILE ...

-U:升级或安装;

-F:仅升级,仅有指定要安装程序的老版本包时升级。

    升级选项:

                                              --oldpackage:降低版本;

                                              --force:强制升级;

     注意:1)不要对内核做升级操作;Linux支持多内核版本并存,因此,直接安装新版本内核即可

        (2)如果某源程序包的配置文件安装后曾被修改过,升级时,新版本程序提供的同一配置文件不会

         覆盖原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供;

  3)卸载

    使用格式:rpm {-e|--erase} [--nodeps] [--noscripts] [--test] PACKAGE_NAME ...

    卸载选项:     

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

--nodeps:忽略依赖关系;

--test:测试卸载,查看依赖关系。

 4)查询

    使用格式:rpm {-q|--query} [select-options] [query-options]

    挑选选项: 

PACKAGE_NAME查询指定的程序包是否已经安装及其版本。

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

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

-p, --package PACKAGE_FILE:用于对未安装的程序包执行查询操作(和query-options结合使用)。

--whatprovides CAPABILITY:查询指定的CAPABILITY(功能)有那个程序包生成

示例:    rpm - --whatprovides 'config(bash)'

--whatrequires CAPABILITY查询指定的CAPABILITY被那个包所依赖

    查询选项:

--changelog:查询rpm包的changelog;

-l, --list,列出一个包安装生成的所有文件列表。

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

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

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

--provides:查询指定程序包提供的所有CAPABILITY

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

--scripts:查看程序包自带的脚本片段的信息       

 5)校验

    使用格式:rpm {-V|--verify} [select-options] [verify-options]

    Linux中程序包管理_程序

    查询显示字段介绍:

       S file Size differs             #文件大小

       M Mode differs (includes permissions and file type)         #权限改变

       5 digest (formerly MD5 sum) differs      #MD5码改变

       D Device major/minor number mismatch     #主次设备不匹配

       L readLink(2) path mismatch      #readLink路径不匹配

       U User ownership differs       # 属主改变

       G Group ownership differs    # 属组改变

       T mTime differs    # 时间戳改变

       P caPabilities differ     #功能改变

 6)包合法性验证和完整性验证


Linux中程序包管理_rpm_02


 

来源合法性验证:

数字签名:包的制作者单向加密程序包的校验码,再用私钥加密程序包的校验码。

使用者用公钥可以解密即为来源合法。

完整性检验:

得出校验码,再把程序包单向加密之后比对,如一致则为完整性合法。

    

对于CentOS的发行版rpm而言,导入公钥即可

]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

 

验证:

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

2)手动验证: rpm -K  PACKAGE_NAME

 7)数据库管理

rpm管理数据库路径:/var/lib/rpm/

查询操作通过此处的数据库进行。

 

rpm数据库重建:

获取帮助:man 8 rpmdb (CentOS 7)

rpm {--initdb|--rebuilddb}:

--initdb:初始化数据库,当前无任何数据库可初始化创建一个新的;如果有

不执行任何操作;

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

二、yum管理程序包

            yum是rpm的前台管理程序,可以自动解决rpm无法解决的依赖关系,方便用户的程序包管理

    (1)yum的工作机制

                Linux中程序包管理_rpm_03

                


   首先在本地建立yum命令的仓库配置文件,而后向远程主机的yum仓库申请元数据文件,下载了元数据文件后,将元数据文件缓存在本地,之后安装程序包时可以先查询本地cache,查看依赖关系,之后看对比本地已下载的程序包,从yum仓库下载未下载的程序包至本地,先安装被依赖的程序包,之后安装所需程序包。安装完成后会删除下载的程序包以节约空间,但是缓存在本地的yum仓库元数据不会删除。

 

(2)建立yum仓库指向配置文件

    /etc/yum.repos.d/*.repo:此目录下的自定义文件为仓库的指向提供配置信息

    文件内容解释: 

  1. [repositoryid]        --------->此配置文件的唯一标识

  2. name=Some name for this repository  -------->名称

  3. baseurl=url://path/to/repository/  -------->yum仓库的位置指向

    1.       ftp://

    2.       http://

    3.       nfs://

    4.       file:///     -------->此处的最后一个/为根

  4.          enabled={1|0}  -------->是否启用此配置文件,1为启用,0为不启用

  5.          gpgcheck={1|0}  -------->是否执行校验,1为开启,0为不启用    

  6.          gpgkey=URL      -------->指明密钥文件

  7.          enablegroups={1|0}   -------->是否使用组来划分程序包

  8.          cost={1000}  -------->开销,默认为1000,当两个yum仓库中拥有同一资源,定                         义开销值来决定去哪一个yum仓库下载。 

注:此文件中的1、2、3、4、5必须给出,gpgcheck=1则第6项也必须给出。另外更多信息请执行

      man 5 yum.conf 查看

    另外:yum的repo配置文件中可用的变量:

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

                  $arch:平台

                  $basearch:基础平台

                  $YUM0-$YUM9: 提供的自定义变量(可在shell环境变量中设置)

示例:

[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

   tips:如何将光盘配置成yum仓库

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

#mount -r -t iso9660 /dev/cdrom /media/cdrom

       2  创建配置文件

[Base]
name="Centos cdrom repo"
baseurl=file:///media/
enable=0
gpgcheck=0

(3)yum命令

    1)显示仓库列表:

yum repolist [all | enabled | disabled]

Linux中程序包管理_rpm_04

    2)显示程序包:

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

 yum list available| updates|installed [glob_exp1] […]

Linux中程序包管理_remove_05

    3)安装程序包:

 yum install package1 [package2] [...]

Linux中程序包管理_Linux_06

    4)重新安装

reinstall package1 [package2] [...]

Linux中程序包管理_remove_07

    5)升级程序包:

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

    6)降级程序包:

downgrade package1 [package2] [...]

    7)检查可用升级:

check-update

Linux中程序包管理_yum_08

    8)卸载程序包:

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

注意:依赖于这个卸载的包的程序也会被卸载;

Linux中程序包管理_yum_09

    9)查看程序包信息

info [...]

Linux中程序包管理_程序_10

    10)查看指定的特性(CAPABILITY)(也可以是某文件)由那个程序提供


注:相当于 rpm -qf

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


Linux中程序包管理_Linux_11

    11)清理本地缓存:

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

Linux中程序包管理_remove_12

    12)生成缓存:

makecache

Linux中程序包管理_Linux_13

                                   

    13)搜索:

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

Linux中程序包管理_Linux_14

    14)查看指定程序包的依赖关系

deplist package1 [package2] [...]

Linux中程序包管理_install_15

    15)查看yum事务历史:

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

Linux中程序包管理_程序_16

    16)包组管理相关命令:

* groupinstall group1 [group2] [...]

           * groupupdate group1 [group2] [...]

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

           * groupremove group1 [group2] [...]

           * groupinfo group1 [...]

            用法同上

            Linux中程序包管理_install_17

 (4)自己建立一个yum仓库

    1)新建一个yum仓库目录,而后在此目录下新建一个Packages的目录,里面放入rpm包。

    2)之后在rpm包目录中执行createrepo --basedir=/tmp/myyumrepo/ ./

     此时会在/tmp/myyumrepo/在存在一个repodata目录

    Linux中程序包管理_install_18

    Linux中程序包管理_yum_19

    3)我们可以在/etc/yum.repo.d/下新建一个仓库指向文件,来验证我们新建的仓库是否可用。

        [myyumrepo]        
        name=myyumrepo
        baseurl=file:///tmp/myyumrepo/
        enabled=1
        gpgcheck=0

    Linux中程序包管理_install_20    

    注:1、关于校验问题可以自行使用md5单向加密程序包获得特征码,而后再使用私钥加密得到        key文件,之后在yum指向文件中指向这个key文件。

      2、如果想让其他人访问到自建的yum仓库,需建立文件服务器。此文对此不做太多涉及。

三、自己编译源码安装程序

  前提:1、系统内配置好了编译环境;

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

                                    CentOS 6:"Develoment Tools"和"Server Platform Develoment"

       CentOS 7:"Develoment Tools"

      2、下载源码包并解压

  (1)编译安装:

    这里以httpd的安装为示例

    1、configure脚本

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

 选项分类:

    安装路径设定:

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

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

 

注:./configure --help:获取其支持使用的选项

Linux中程序包管理_程序_21

    2、make

      Linux中程序包管理_程序_22    3、make install

    Linux中程序包管理_程序_23    4、查看httpd安装情况

    Linux中程序包管理_程序_24

(2)安装后的操作          

          1)导出二进制程序目录至PATH环境变量中;

    编辑文件/etc/profile.d/NAME.sh

    export PATH=/PATH/TO/BIN:$PATH

   2)导出库文件路径

    编辑/etc/ld.so.con.d/NAME.conf

    添加新的库文件所在目录至此文件

                  ldconfig [-v]

   3)导出头文件

    基于链接的方式实现:

    ln -sv

   4)导出帮助手册

    编辑/etc/man.config文件

    添加一个MANPATH指向自己编译安装的程序包的帮助手册目录


    注:此文示例均是在CentOS上做的测试。