Linux软件包管理{rpm|yum|源码包}2015082901

时间:2022-12-04 08:12:01

CentOS软件包管理

 

Linux程序安装有三种方式:

1  二进制包安装

   a、RPM

   b、YUM

 

2  源码包安装

(1)二进制包管理:

RPM

CentOS上的二进制包为rpm格式,并且rpm软件包管理程序也叫做rpm(RPM is Package Manager)

 

RPM包管理方式的优点是:安装简单方便,因为软件已经编译完成打包完毕,安装只是个验证环境和解压的过程。此外通过RPM方式安装的软件,RPM工具都会记录软件的安装信息至数据库中(/var/lib/rpm),这样方便了软件日后的查询,升级和卸载

 

    RPM包的命名方式:name-VERSION-release.arch.rpm

        name:软件包名

        VERSION:格式为 主版本号.次版本号.发行版本号

        Release:软件发行版.有时候会包含系统版本号

        Arch:硬件平台

常见有: x86(32): i386,i486, i586, i686

           x86_64(64): x64,x86_64,amd64

         例如:php-fpm-5.4.16-23.el7_0.3.x86_64.rpm  

                  这里的php-fpm表示软件名,5.4.16表示版本号,23表示发行的次数,el7表示rhel7系统,x86_64表示硬件平台平台

        

 

由于软件的功能众多,不一定所有人都需要此软件的所有功能,若有的人只需要软件的极少一部分的功能,那么完全安装此软件会极大浪费系统空间,针对这一现象,软件开发过程中,开发者将软件包分成几部分组成,“主包”、多个“支包”和“测试包”3个部分。这样,部分用户安装主包便可满足需求;若需要额外的功能,只需针对功能安装相对应的支包即可。

         三类软件包的格式如下:

                           testapp-VERSION-ARCH.rpm:主包

                           testapp-devel-VERSION-ARCH.rpm:支包

                           testapp-testing-VERSION-ARHC.rpm      测试包

 

Tip:由于“组合小程序,完成复杂任务”为Linux的核心思想之一,所以Linux之上的很多软件包会出现有相互依赖的关系。

 

rpm包的获取方式:

(1) 系统发版的光盘或官方的服务器;  

(2) 项目官方站点

(3) 第三方组织:

Fedora-EPEL

(4) 自己制作

  软件包管理命令及常用选项:

             1、安装:

                        用法:rpm {-i|--install} [install-options] 软件包

                        常用选项:    -i | --install   安装

                                        -v| --verbose

                                        -vv  显示更详细的调试信息

                                        --test:测试安装,但不真正执行安装过程;dry run模式;

                                        --nodeps:忽略依赖关系;

                                        --replacepkgs:重新安装;

                                        --nosignature:不检查来源合法性;

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

                                        --noscripts:不执行程序包脚本片断;

                                                %pre:安装前脚本; --nopre

                                                %post:安装后脚本; --nopost

                                                %preun:卸载前脚本; --nopreun

                                                %postun:卸载后脚本;  --nopostun

        rpm命令的常用组合如下:

                                        安装:-ivh, --nodeps, --replacepkgs

                                        卸载:-e, --nodeps

                                        升级:-Uvh, -Fvh, --nodeps, --oldpackage

                                        查询:-q, -qa, -qf, -qi, -qd, -qc, -q --scripts, -q --changlog, -q --provides,-q --requires

                                        校验:-V

 

以下是一些关于以上命令的示例:

{vim-filesystem-7.4.160-1.el7.x86_64.rpm}为例:

例如:

[root@localhost Packages]# rpm -ivh vim-filesystem-7.4.160-1.el7.x86_64.rpm 
warning: vim-filesystem-7.4.160-1.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:vim-filesystem-2:7.4.160-1.el7   ################################# [100%]


 

顺利完成;前面提到过,程序包之间可能存在依赖关系,例如:

[root@localhost Packages]# rpm -ivh vim-X11-7.4.160-1.el7.x86_64.rpm warning: vim-X11-7.4.160-1.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEYerror: Failed dependencies:        gtk2 >= 2.6 is needed by vim-X11-2:7.4.160-1.el7.x86_64        hicolor-icon-theme is needed by vim-X11-2:7.4.160-1.el7.x86_64        libICE.so.6()(64bit) is needed by vim-X11-2:7.4.160-1.el7.x86_64        libSM.so.6()(64bit) is needed by vim-X11-2:7.4.160-1.el7.x86_64        libX11.so.6()(64bit) is needed by vim-X11-2:7.4.160-1.el7.x86_64        libXt.so.6()(64bit) is needed by vim-X11-2:7.4.160-1.el7.x86_64        libgdk-x11-2.0.so.0()(64bit) is needed by vim-X11-2:7.4.160-1.el7.x86_64        libgdk_pixbuf-2.0.so.0()(64bit) is needed by vim-X11-2:7.4.160-1.el7.x86_64        libgpm.so.2()(64bit) is needed by vim-X11-2:7.4.160-1.el7.x86_64        libgtk-x11-2.0.so.0()(64bit) is needed by vim-X11-2:7.4.160-1.el7.x86_64        libpango-1.0.so.0()(64bit) is needed by vim-X11-2:7.4.160-1.el7.x86_64        libperl.so()(64bit) is needed by vim-X11-2:7.4.160-1.el7.x86_64        perl(:MODULE_COMPAT_5.16.3) is needed by vim-X11-2:7.4.160-1.el7.x86_64        vim-common = 2:7.4.160-1.el7 is needed by vim-X11-2:7.4.160-1.el7.x86_64


 

此时,如果我们有必要忽略这些依赖关系,强制安装软件,可使用--nodeps,如下:

[root@localhost Packages]# rpm -ivh --nodeps vim-filesystem-7.4.160-1.el7.x86_64.rpm warning: vim-filesystem-7.4.160-1.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEYPreparing...                          ################################# [100%]        package vim-filesystem-2:7.4.160-1.el7.x86_64 is already installed

 

安装成功;软件包安装的时候,默认会自动检查包的来源合法性以及包的完整性,若我们没有导入秘钥信息,便会提示以上命令执行所输出的第一行warning:******************Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY,此时,如果我们能明确包的来源,不知名检查,可使用--nosignature --nodigest

例如:

[root@localhost Packages]# rpm -ivh --replacepkgs --nodigest --nosignature vim-filesystem-7.4.160-1.el7.x86_64.rpm       ##第一行的warning信息没有了Preparing...                          ################################# [100%]Updating / installing...   1:vim-filesystem-2:7.4.160-1.el7   ################################# [100%]


 

 

            2、卸载:用法和安装类似

              用法: rpm {-e|--erase} 软件名   ###此处注意,安装时后面所加的是包名,而卸载需要跟上软件名

             常用选项:    --nodeps   软件卸载时忽略依赖关系

                                                      若软件依赖正在运行或有用的软件,卸载时可使用此选项

                                    --noscripts    不执行卸载后脚本

 

          3、升级:

                用法:(a)  rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...

                                 表示若原程序存在,则执行升级安装,若不存在,则安装执行程序              

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

                                  表示若原程序存在,则执行升级安装,若不存在,则不执行任何操作

                常用选项:

    --oldpackage  降级,用旧版的rpm包替换新版本

    --force若存在不兼容,无法安装包,则--force强制安装

 

            4、查询

                用法:rpm {-q|--query} [select-options][query-options]

select-options    查询结果与程序包相关

-a --all  查询所有已安装的包

-f查询指定的文件由那个程序包安装生成

                            --whatprovides 查询指定功能(CAPABILITY)由哪个包安装生成

--whatrequires 查询指定的功能(CAPABILITY)被哪个包依赖

-p    /PATH/TO/PAKAGE_FILE 查询未安装的程序包

query-options查询结果和程序安装文件及功能相关

-l列出指定程序包安装生成的所有文件

 -R --requires查询指定程序包所依赖的CAPABILITYS

--provides列出指定程序包所提供的CAPABILITYS

--changelog查询rpm包制作的修改日志,不是程序的修改日志

         -c查询程序的配置文件

--conflict  查询冲突

-d查询程序包生成的文档

-i  --info查询程序的相关信息

-L只列出许可证信息

--scripts  查询程序安装/卸载时可能执行的脚本

 例如:

[root@localhost Packages]# rpm -q vim-filesystem    ##查询软件是否已安装vim-filesystem-7.4.160-1.el7.x86_64[root@localhost Packages]# rpm -qa                ##通过读取/var/lib/rpm中数据库,查询当前系统所有已安装的所有软件[root@localhost ~]# rpm -qf `which cat`      ##查询文件是由哪个软件包安装生成的coreutils-8.22-11.el7.x86_64[root@localhost ~]# rpm -q --whatprovides webserver  ##查询指定功能或文件由哪个包所提供httpd-2.4.6-31.el7.centos.x86_64[root@localhost ~]# rpm -q --provides httpd        ##列出指定程序或程序包所能提供的CAPABILITIESwebservermod_dav = 2.4.6-31.el7.centoshttpd-suexec = 2.4.6-31.el7.centoshttpd-mmn = 20120211httpd-mmn = 20120211x8664httpd-mmn = 20120211-x86-64httpd = 2.4.6-31.el7.centoshttpd(x86-64) = 2.4.6-31.el7.centos
[root@localhost ~]# rpm -qc httpd        ##查询指定程序的配置文件路径/etc/httpd/conf.d/autoindex.conf/etc/httpd/conf.d/userdir.conf/etc/httpd/conf.d/welcome.conf/etc/httpd/conf.modules.d/00-base.conf/etc/httpd/conf.modules.d/00-dav.conf/etc/httpd/conf.modules.d/00-lua.conf/etc/httpd/conf.modules.d/00-mpm.conf/etc/httpd/conf.modules.d/00-proxy.conf/etc/httpd/conf.modules.d/00-systemd.conf/etc/httpd/conf.modules.d/01-cgi.conf/etc/httpd/conf/httpd.conf/etc/httpd/conf/magic/etc/logrotate.d/httpd/etc/sysconfig/htcacheclean/etc/sysconfig/httpd[root@localhost ~]#
[root@localhost ~]# rpm -qi httpd            ##查询包或者程序的安装包信息Name        : httpdVersion     : 2.4.6Release     : 31.el7.centosArchitecture: x86_64Install Date: Sat 29 Aug 2015 01:55:13 PM EDTGroup       : System Environment/DaemonsSize        : 9810046License     : ASL 2.0Signature   : RSA/SHA256, Sat 14 Mar 2015 03:55:03 AM EDT, Key ID 24c6a8a7f4a80eb5Source RPM  : httpd-2.4.6-31.el7.centos.src.rpmBuild Date  : Thu 12 Mar 2015 11:09:17 AM EDTBuild Host  : worker1.bsys.centos.orgRelocations : (not relocatable)Packager    : CentOS BuildSystem <http://bugs.centos.org>Vendor      : CentOSURL         : http://httpd.apache.org/Summary     : Apache HTTP ServerDescription :The Apache HTTP Server is a powerful, efficient, and extensibleweb server.

 

**注意:若查询所指定的包或者程序未安装在系统上,则需要加 -p 选项


前面所提到过,rpm的查询功能是通过读取软件包的安装信息数据库--/var/lib/rpm ,若您不小心删除了此目录下除“Packages ”数据库文件以外的任何文件,该数据库都可通过命令进行修复:操作如下:

[root@localhost ~]# rm -rf /var/lib/rpm/Provide     ##删除数据库文件[root@localhost ~]# rm -rf /var/lib/rpm/Name      ##删除数据库文件[root@localhost ~]# rm -rf /var/lib/rpm/Sigmd5     ##删除数据库文件[root@localhost ~]# ls /var/lib/rpm/           Basenames     Filedigests  Obsoletename  Provideversion  RequireversionConflictname  Group        Packages      Pubkeys         Sha1headerDirnames      Installtid   Providename   Requirename     Triggername[root@localhost ~]# rpm --rebuilddb      ##重建数据库文件[root@localhost ~]# rpm --initdb            ##初始化rpm数据库[root@localhost ~]# ls /var/lib/rpm/        ##之前删除的文件又都回来了Basenames     __db.003     Group         Packages        Requirename     TriggernameConflictname  __db.004     Installtid    Providename     Requireversion__db.001      Dirnames     Name          Provideversion  Sha1header__db.002      Filedigests  Obsoletename  Pubkeys         Sigmd5

注:/var/lib/rpm目录下的Packages文件被误删,数据库将无法重建!!!

=========================================================


yum   ---  rpm的前端管理工具:

        上面提到过,rpm包管理器安装软件时,若软件所依赖于其他的包,则会自动停止软件的安装。此时,若想继续安装使用软件,要么手动安装回显的软件包依赖文件,要么使用--nodeps忽略软件的依赖关系继续执行安装。例如,安装gcc时的软件依赖关系回显:

[root@localhost Packages]# rpm -ivh gcc-4.8.3-9.el7.x86_64.rpm warning: gcc-4.8.3-9.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEYerror: Failed dependencies:        cpp = 4.8.3-9.el7 is needed by gcc-4.8.3-9.el7.x86_64        glibc-devel >= 2.2.90-12 is needed by gcc-4.8.3-9.el7.x86_64        libmpc.so.3()(64bit) is needed by gcc-4.8.3-9.el7.x86_64        libmpfr.so.4()(64bit) is needed by gcc-4.8.3-9.el7.x86_64

如上述所示,安装gcc依赖于其他的4个包,如果手工挨着个包去安装,会很麻烦,还有就是,万一在安装这依赖的几个包时,这几个包再有对其他的软件依赖,那就更麻烦了;如果忽略上述的依赖关系继续执行安装,那么软件安装完成后很可能就不能运行。

        因此,yum便是为解决上述两项难题而出现的。

            yum的缺陷:若安装过程中系统掉电,则yum在下次开机无法检测安装进度,导致安装无法继续进行    。

        Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的SHELL前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。

        yum安装软件所需步骤:

        1、去解析/etc/yum.repos.d下面所有以.repo结尾的配置文件(这些配置文件指定了yum服务器的地址)

        2、定期去"更新"yum服务器上的rpm包"清单",然后把"清单"下载保存到yum自己的cache里面

                            清单:保存了服务器上所有的rpm包名及包与包之间的依赖关系等。

            3、每次安装软件都会去cache目录下去找"清单",根据"清单"里的rpm包描述从而来确定安装包的名字,版本号,所需要的依赖包等

            4、最后再去yum服务器下载rpm包,调用rpm命令进行安装

            yum的命令格式:

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

                    常用命令:

               * list [...]显示

[all | glob_exp1] [glob_exp2] [...]

available [glob_exp1] [...]可用的但未安装的

installed        已安装的

update           只显示更新包

* install package1 [package2] [...]安装特定版本需指定版本号

                * update [package1] [package2] [...]更新

                * check-update检查更新

                * remove | erase package1 [package2] [...]  卸载程序包

                * info [...]类似 rpm-qi

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

查看指定特性(或文件)由哪个包所提供

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

清理本地缓存

                * makecache

生成缓存

*localinstalllocalupdate  ---> 直接使用install

                * reinstall package1 [package2] [...]

基于覆盖的方式重新安装

                * downgrade package1 [package2] [...]

降级

                * deplist package1 [package2] [...]显示指定包所依赖的capabilities

                * repolist [all|enabled|disabled]显示已有的仓库列表

命令示例如下:***RHEL系列的自带的yum源收费,所以得自行创建yum源配置文件,后面会谈到:

[root@localhost ~]# yum -y install gccLoaded plugins: fastestmirrorbase                                                            | 3.6 kB  00:00:0省略............................======================================================================================= Package                 Arch            Version                   Repository     Size=======================================================================================Installing: gcc                     x86_64          4.8.3-9.el7               base           16 MInstalling for dependencies: cpp                     x86_64          4.8.3-9.el7               base          5.9 M glibc-devel             x86_64          2.17-78.el7               base          1.0 M glibc-headers           x86_64          2.17-78.el7               base          656 k kernel-headers          x86_64          3.10.0-229.el7            base          2.3 M libmpc                  x86_64          1.0.1-3.el7               base           51 k mpfr                    x86_64          3.1.1-4.el7               base          203 k

由上述可以看到,之前执行rpm -ivh gcc时所回显的依赖包在这里yum全都自行安装了。

    yum仓库的建立:

        1、yum仓库可以是远程的ftp服务器,可以是http服务器,也可以是本地的某个镜像文件。

        2、仓库配置文件必须是在./etc/yum.repos.d/*.repo文件

   

                 a、本地镜像配置:

[c6-media]     ##仓库名,必须在所有仓库配置文件中唯一,不能重复name=CentOS-$releasever - Media   ##对仓库的功能说明baseurl=file:///media/CentOS/     ##指向镜像文件目录下有 repodata的目录        file:///media/cdrom/      ##路径可以多个,从上往下搜索rpm包        file:///media/cdrecorder/gpgcheck=0      ##是否检查包的来源合法性及完整性,0代表不检查,1代表检查enabled=1        ##是否启用此配置文件,0代表不启用,1代表启用##若gpgcheck启用,则需要手工指定gpgkey的路径---gpgkey=/PATH/TO/KEY

                b、远程ftp镜像配置

##其他部分与本地镜像相同,baseurl不同baseurl=ftp://********        ##指向远程服务器上有repodata的目录

                c、远程http仓库

##其他部分与本地镜像相同,baseurl不同baseurl=http://********        ##指向远程服务器上有repodata的目录

示例:配置本地yum仓库源:

##我将光盘文件挂载至/media/cdrom下[base]name=CentOS7 media sourcebaseurl=file:///media/cdromgpgcheck=0

######配置完yum配置文件需要先清空一下yum缓存:

yum clean all重新生成缓存:yum makecache

现在便可使用新指向的yum仓库了。



 另外,yum的repo配置文件中有几个可用的变量:

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

    $arch: 平台;

    $basearch:基础平台;

    $YUM0-$YUM9






 

 

2、源码包管理:

         Linux上的大多数软件都是开源的。开源软件基本都提供源码下载,源码安装的方式;源码安装的好处是用户可以自己定制软件功能,安装需要的模块,不需要的功能可以不用安装,此外,用户还可以自己选择安装路径,方便管理,卸载软件也很方便,只需删除对应的安装目录即可。没有windows所谓的注册表之说。另外,如果用户自己需要,还可以对源码包进行二次开发使用。


        源码包的安装步骤:

            1、下载源码包,一般是压缩包,解压至本地,并阅读README或INSTALL文档查询安装方法

                    执行./configure:

                                --help  查看可手工指定

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

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

                开源程序源代码的获取:

                    官方自建站点:

            apache.org (ASF)

            mariadb.org

            ...

            代码托管:

            SourceForge

            Github.com

            code.google.com

            2、执行make  -----根据生成的makefile文件,构建应用程序

            3、执行makeinstall   安装构建好的程序


编译C源代码:

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

    开发工具:make, gcc等

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

    glibc:标准库

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

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



下面,是一个编译安装程序的示例:编译安装apache

[root@localhost ~]# cd /usr/local/src/[root@localhost src]# lshttpd-2.2.31.tar.bz2[root@localhost src]# tar -xf httpd-2.2.31.tar.bz2  [root@localhost src]# lshttpd-2.2.31  httpd-2.2.31.tar.bz2[root@localhost src]# cd httpd-2.2.31[root@localhost httpd-2.2.31]#  ./configure --prefix=/usr/local/apache2[root@localhost httpd-2.2.31]# make********省略细节显示*********make[1]: Leaving directory `/usr/local/src/httpd-2.2.31'[root@localhost httpd-2.2.31]# make install[root@localhost ~]# /usr/local/apache2/bin/apachectl start    ##可以启动表示安装成功  httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName

下面,我们可以将自行安装的apache的二进制程序路径添加至环境变量:

##为避免与系统中原有的apache冲突,对编译安装的apachectl创建一个软连接[root@localhost bin]# ln -sv apachectl apachectl2[root@localhost apache2]# vim /etc/profile.d/apache2.sh    在文本中输入:export PATH=$PATH:/usr/local/apache2/bin

这样,我们便可直接在shell中执行apachectl2命令来启动/停止编译安装的apache了。




          如文档有任何不当之处,还请您在线指出,不甚感激