Linux的程序包管理,RPM,yum及编译安装简介

Linux的程序包管理,RPMyum及编译安装简介

 

Linux的程序包,指的是ELF格式的二进制应用程序文件所组成的软件包。它一般由二进制文件、库文件、软件配置文件及帮助文件等组成。而对这些包进行管理的工具,主流分为两种,在debian上,用的是apt-get管理deb包;在redhat上,主要用rpm作为软件包管理工具。在这里,我简单的介绍下rpm的使用(主要是apt我也不懂呀哈 J

 

RPM:原名是Redhat Package Manager,是Redhat为管理软件包而开发的一款软件,但后来主要是它越来越受欢迎,因而变成了事实上redhat系发行版的标准配置,redhat也不好意思独享了,于是后来改了个好玩的名字:RPM is Package Manager.歪果仁真会玩呀。

 

我们现在获取程序包的途径主要有几种:

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

国内的几个镜像站点:

  http://mirrors.aliyun.com

  http://mirrors.sohu.com

  http://mirrors.163.com

 

(2) 项目官方站点

比较大型的软件项目,一般会有自己的独立官方网站,上面会提供各种版本的RPM及源代码包供下载。
 

(3) 由第三方组织提供的下载:

Fedora-EPEL

搜索引擎:

http://pkgs.org

http://rpmfind.net

http://rpm.pbone.net

(4) 自己制作RPM
           

RPM的命令使用:

Rpm命令可对软件程序包进行安装、卸载、升级、查询、校验、数据库维护等功能,在此简单介绍几个常用命令:

RPM安装:

rpm {-i|–install} [install-options] PACKAGE_FILE …

 

一般我们会使用 rpm ivh rpm_file的命令进行安装,其中:

i: 安装

-v: verbose,详细信息

-h:安装进度显示,以#显示程序包管理执行进度;每个#表示2%的进度

比如,我在本机光盘的软件包里安装lftp程序包:

[root@nginx Packages]# rpm -ivh lftp-4.0.9-1.el6_5.1.x86_64.rpm

Preparing…                ########################################### [100%]

   1:lftp                  ########################################### [100%]

[root@nginx Packages]#

 

有时如果安装的软件包需要依赖其它软件,则会报错,此时需要先安装好依赖的软件包才能继续安装。当然,你作为管理员,享有特权,使用 –nodeps可以强制安装,不过不是不得而,不建议这样做,因为就算软件安装成功,亦可能会产生一些隐患。

另外,安装时亦有一大堆的安装选项,限于篇幅,这里不详细展开,大家可以man一下帮助了解一下。

[install-options]

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

–nodeps:忽略依赖关系;

–replacepkgs: 重新安装;

 

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

–nodigest:不检查包完整性;

 

–noscipts:不执行程序包脚本片断;

%pre: 安装前脚本; –nopre

%post: 安装后脚本; –nopost

%preun: 卸载前脚本; –nopreun

%postun: 卸载后脚本;  –nopostun

 

RPM升级:

rpm {-U|–upgrade} [install-options] PACKAGE_FILE …

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

 

一般我们会使用 rpm Uvh rpm_file的命令进行安装

–upgrage:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则“安装”;

–freeshen:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则不执行升级操作;

–oldpackage:降级;

–force: 强行升级;

 

RPM查询:

rpm {-q|–query} [select-options] [query-options]

 

[select-options]

-a: 所有包

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

 

-p /PATH/TO/PACKAGE_FILE:针对尚未安装的程序包文件做查询操作;

 

–whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供;

–whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖;

 

[query-options]

–changelog:查询rpm包的changlog

-c: 查询程序的配置文件

-d: 查询程序的文档

-i: information

-l: 查看指定的程序包安装后生成的所有文件;

–scripts:程序包自带的脚本片断

-R: 查询指定的程序包所依赖的CAPABILITY

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

 

查询操作我们常用会用到,一般是用 qa查询当前的安装包,用 qi查询特定的安装包的信息,例如:

 

查询当前主机上mysql相关软件的安装情况:

[root@nginx Packages]# rpm -qa  | grep mysql

mysql-libs-5.1.73-3.el6_5.x86_64

[root@nginx Packages]#

 

该命令查询到当前与mysql相关的只安装了一个软件包mysql-libs-5.1.73-3.el6_5.x86_64,然后,我们想进一步查询该软件包的详细信息:

 

 [root@nginx Packages]# rpm -qi mysql-libs-5.1.73-3.el6_5.x86_64

Name        : mysql-libs                   Relocations: (not relocatable)

Version     : 5.1.73                            Vendor: CentOS

Release     : 3.el6_5                       Build Date: Thu 13 Feb 2014 03:42:39 AM CST

Install Date: Fri 25 Dec 2015 06:00:10 AM CST      Build Host: c6b9.bsys.dev.centos.org

Group       : Applications/Databases        Source RPM: mysql-5.1.73-3.el6_5.src.rpm

Size        : 4244886                          License: GPLv2 with exceptions

Signature   : RSA/SHA1, Thu 13 Feb 2014 03:48:08 AM CST, Key ID 0946fca2c105b9de

Packager    : CentOS BuildSystem <http://bugs.centos.org>

URL         : http://www.mysql.com

Summary     : The shared libraries required for MySQL clients

Description :

The mysql-libs package provides the essential shared libraries for any

MySQL client program or interface. You will need to install this package

to use any other MySQL package or any clients that need to connect to a

MySQL server.

[root@nginx Packages]#

 

上面列出了mysql-libs的详细信息,包括软件名称,版本,数字签名等等。

 

RPM卸载:

rpm {-e|–erase} [–allmatches] [–nodeps] [–noscripts]

           [–notriggers] [–test] PACKAGE_NAME …

 

比如,我将上面安装lftp执行卸载:

 

[root@nginx tmp]# rpm -e lftp

[root@nginx tmp]#

 

没有出错信息,即是成功执行。当然,卸载时涉及到依赖关系,同样可以用nodeps强制进行卸载。

 

此外,还有包校验,检查来源合法性,导入公钥,重建数据库等,此处不再一一解释,有兴趣大家可以man一下。

 

接下来跟大家说说一个程序包管理利器 –YUM

    YumYellowdog Update Modifier的简写,这只小黄狗可是深得大家的喜爱,为什么呢?因为我们系统安装各种各样的软件包时,会检查相应各软件的依赖关系,这些依赖关系千丝万缕,复杂非常。如果光靠我们自己去解决这些依赖冲突,耗时耗力,简直是浪费青春呀。因而,就有了这款神器-yumYum的设计思想是可自动化地安装、卸载RPM包,收集管理RPM包的相关信息,检查依赖关系并自动对其进行处理,让用户能从依赖关系统中走出来,关注软件本身,而不是将精力浪费在对其进行安装上。

初学者常有个误解,以为yum是取代RPM的,有了yum就不用RPM了,其实yum只是rpm的前端,后端还是rpmyum只是帮助用户对rpm进行管理的工具,二者是互补关系,而不是互斥。

Yum采用c/s结构,前端是工具命令行界面,后端有个数据仓库的概念,也可称之为yum(yum repository: yum repo)。网上有很多的yum源可供使用,而我们也可以自已创建自己的yum仓库,以供使用。比如在公司内部,统一软件版本,自动化标准化安装服务器,同时亦能节省带宽,则可以事先将需要用到的RPM包下载下来,集中存放,然后再构建自己的yum仓库,以实现资源共享。Yum repo的创建方式多种多样,可以存放在ftp服务器中,也可以存放在web服务器中,NFS服务器中,甚至于放在本机的文件系统里。因而我们还可以将本地的安装光盘做成yum repo,以方便使用。

Centos默认已安装好yum,它的配置文件存放在 /etc/yum.conf /etc/yum.repos.d/*.repo 内,其中,yum.conf为所有仓库提供公共配置,yum.repos.d目录下的配置文件则为仓库的指向提供配置(注:文件名后缀一定要为repo才有效)。

下面是配置文件的几个主要的设置的含义:

 

仓库指向的定义:

[repositoryID]

name=Some name for this repository   //仓库名称

baseurl=url://path/to/repository/      //仓库路径,路径的形式有多种,可以是:

            ftp://

                http://

                nfs://

             file:///

也可以多条,每个地址路径写一行即可

            

enabled={1|0}   //是否启用此仓库,1为启用,0为停用

gpgcheck={1|0}  //是否进行gpg(GNU Private Guard)检验,以确定rpm包来源是有效和安全的

gpgkey=URL

enablegroups={1|0}

failovermethod={roundrobin|priority}   //默认为: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] […]

 

    安装程序包:

     install package1 [package2] […]

 

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

 

    升级程序包:

     update [package1] [package2] […]

 

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

 

    检查可用升级:

     check-update

 

    卸载程序包:

     remove | erase package1 [package2] […]

 

    查看程序包information

     info […]

 

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

     provides | whatprovides feature1 [feature2] […]

 

    清理本地缓存:

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

 

    构建缓存:

     makecache

 

    搜索:

     search string1 [string2] […]

 

     以指定的关键字搜索程序包名及summary信息;

 

    查看指定包所依赖的capabilities

     deplist package1 [package2] […]

 

    查看yum事务历史:

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

 

    安装及升级本地程序包:

* localinstall rpmfile1 [rpmfile2] […]

           (maintained for legacy reasons only – use install)

        * localupdate rpmfile1 [rpmfile2] […]

           (maintained for legacy reasons only – use update)

 

    包组管理的相关命令:

        * groupinstall group1 [group2] […]

        * groupupdate group1 [group2] […]

        * grouplist [hidden] [groupwildcard] […]

        * groupremove group1 [group2] […]

        * groupinfo group1 […]

 

 

创建yum仓库的命令为:

     createrepo [options] <directory> ,该命令会对所在目录的软件包进行扫描,生成元数据数据库,以供yum前端使用(就是前面提到的,自已创建yum)

 

下面举个栗子,说明如何将光盘里的RPM包设置成yum源:

 

首先,你要有光盘(挂载光盘)

[root@nginx media]# mount /dev/cdrom /media/cdrom/ -t iso9660 -r

[root@nginx media]#

[root@nginx /]# ls -lh /media/cdrom/

total 712K

-r–r–r–. 2 root root   14 Oct 24  2014 CentOS_BuildTag

dr-xr-xr-x. 3 root root 2.0K Oct 24  2014 EFI

-r–r–r–. 2 root root  212 Nov 28  2013 EULA

-r–r–r–. 2 root root  18K Nov 28  2013 GPL

dr-xr-xr-x. 3 root root 2.0K Oct 24  2014 images

dr-xr-xr-x. 2 root root 2.0K Oct 24  2014 isolinux

dr-xr-xr-x. 2 root root 670K Oct 24  2014 Packages

-r–r–r–. 2 root root 1.4K Oct 20  2014 RELEASE-NOTES-en-US.html

dr-xr-xr-x. 2 root root 4.0K Oct 24  2014 repodata

-r–r–r–. 2 root root 1.7K Nov 28  2013 RPM-GPG-KEY-CentOS-6

-r–r–r–. 2 root root 1.7K Nov 28  2013 RPM-GPG-KEY-CentOS-Debug-6

-r–r–r–. 2 root root 1.7K Nov 28  2013 RPM-GPG-KEY-CentOS-Security-6

-r–r–r–. 2 root root 1.7K Nov 28  2013 RPM-GPG-KEY-CentOS-Testing-6

-r–r–r–. 1 root root 3.4K Oct 24  2014 TRANS.TBL

 

可以看到,CentOS光盘的Packages目录,且已有repodata,已经事先写好了元数据定义了软件仓库,因而我们不用再运行createrepo来创建了。

 

然后,创建repo文件,配置yum

[root@nginx cdrom]# cd /etc/yum.repos.d/   #切换至 /etc/yum.repos.d目录下

[root@nginx yum.repos.d]#

[root@nginx yum.repos.d]# vi LocalCDROM.repo    #创建LocalCDROM的源

[LocalCDROM]

name=LocalCDROM RPM

baseurl=file:///media/cdrom                    #路径指向cdrom,注间,路径指向至元文件目录 repodata 的上一级路径即可

gpgcheck=0

enabled=1

 

保存退出

 

[root@nginx yum.repos.d]# yum repolist                  #查看当前的yum

                                                                           

repos.PNG 

(为展示效果,我临时将系统默认的yumCentOS-Base.repo文件改名成CentOS-Base.repo.bak,这样,就只剩下新创建的yumLocalCDROM )

 

[root@nginx yum.repos.d]# yum install telnet

 yuminstall.PNG

 

从图中可以看出,telnetrpm包的确是从刚才创建的LocalCDROM源中安装

 

附表是从网上收集的国内yum源列表,大家可以参考一下,创建适合自己的仓库:

 

 

1. 企业贡献:

    阿里:http://mirrors.aliyun.com/

搜狐:http://mirrors.sohu.com/

网易:http://mirrors.163.com/

 

2. 大学教学:

北京理工大学:

http://mirror.bit.edu.cn (IPv4 only)

http://mirror.bit6.edu.cn (IPv6 only)

北京交通大学:

http://mirror.bjtu.edu.cn (IPv4 only)

http://mirror6.bjtu.edu.cn (IPv6 only)

http://debian.bjtu.edu.cn (IPv4+IPv6)

兰州大学:http://mirror.lzu.edu.cn/

厦门大学:http://mirrors.xmu.edu.cn/

清华大学:

http://mirrors.tuna.tsinghua.edu.cn/ (IPv4+IPv6)

http://mirrors.6.tuna.tsinghua.edu.cn/ (IPv6 only)

http://mirrors.4.tuna.tsinghua.edu.cn/ (IPv4 only)

天津大学:http://mirror.tju.edu.cn/

中国科学技术大学:

http://mirrors.ustc.edu.cn/ (IPv4+IPv6)

http://mirrors4.ustc.edu.cn/

http://mirrors6.ustc.edu.cn/

东北大学:

http://mirror.neu.edu.cn/ (IPv4 only)

http://mirror.neu6.edu.cn/ (IPv6 only)

电子科技大学:http://ubuntu.uestc.edu.cn/

 

编译安装:

有些场景,光有RPM软件包,也未必能附合我们的需求,因为rpm包相对软件的版本而言,一般并非是最新版本,很多时候,软件编译的功能也未必能100%符合我们自身的需求,因而,我们就需要对软件源代码进行编译安装,以便软件可以100%定制为我们所用。

Linux上大多数软件都是用C语言开发,编译时可使用以下三招来打天下:

configure脚本配置 二make make install,其实就是先利用脚本指定一些参数,选项,指定软件启用的功能等,然后用make来调用各种编译器,将源代码编译成二进制程序,最后由install程序,将这些二进制代码copy到系统相应的地方中去。具体为:

第一步: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

 

      第二步:make

 

      第三步:make install

 

另外,编译安装完毕,还需要做些善后工作,以便让系统能正确识别新安装的软件的bin路径、库文件路径,头文件路径,man手册等。

 

安装后的配置:

      (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 /usr/local/apppath/include /usr/local/include/appname

 

      (4) 导出帮助手册

       编辑/etc/man.config文件

        添加一个MANPATH

 

下面再举个栗子,说明编译安装的过程:

 

编译安装Apache2.2.31

 

[root@nginx LAMP]# tar xf httpd-2.2.31.tar.bz2                    #解压

[root@nginx LAMP]# cd httpd-2.2.31                   

[root@nginx httpd-2.2.31]# ./configure –prefix=/usr/local/apache     #运行configure,演示简单起建,这里只指定一个prefix参数,实际上生产环境编译apache,还需要指定很多参数,这里略过

 

checking for chosen layout… Apache

checking for working mkdir -p… yes

checking build system type… x86_64-unknown-linux-gnu

checking host system type… x86_64-unknown-linux-gnu

checking target system type… x86_64-unknown-linux-gnu

 

Configuring Apache Portable Runtime library …

………………………… #中间一大段略过

config.status: creating include/ap_config_auto.h

config.status: include/ap_config_auto.h is unchanged

config.status: executing default commands

 configure.PNG

如无报错,则可继续运行make make install完成编译安装

 makeinstall.PNG

 

 apache.PNG

完成安装,继续完善设置:

1)增加path

[root@nginx apache]# vi /etc/profile.d/httpd.sh

    export PATH=/usr/local/apahce/bin;$PATH

 

2)导出库文件

[root@nginx apache]# vi /etc/ld.so.conf.d/httpd.conf

    /usr/local/apache/lib

[root@nginx ld.so.conf.d]# ldconfig

 ldconfig.PNG 

 

 

3)导出头文件
      [root@nginx local]# ln -sv /usr/local/apache/include/ /usr/local/include/apache

      `/usr/local/include/apache' -> `/usr/local/apache/include/'

4)导出帮助手册
    [root@nginx man]# vim /etc/man.config

    #增加一栏

    # Every automatically generated MANPATH includes these fields

#

MANPATH /usr/man

MANPATH /usr/share/man

MANPATH /usr/local/man

MANPATH /usr/local/share/man

MANPATH /usr/X11R6/man

MANPATH /usr/local/apache/man

man.PNG 

 

至此,apache编译完成。

测试软件正常否:

 

测试配置文件并启动

 apachestart.PNG

 

 

查看80端口

 ss.PNG

 

打开网页,It works!

itworks.PNG 

 

 

 

 

以上是我对rpmyum及编译安装的理解!作为初学者,我对linux的认识还是很肤浅,以上可能有不正确的地方,如有错漏,希望各位能指正,共同进步。


小斌斌

我的QQ153975050  

在此感谢马哥及马哥团队的所有人,在linux的道路上引领我一直前进!

                                                          2016-05-25

 

 

 

原创文章,作者:马哥Net19_小斌斌,如若转载,请注明出处:http://www.178linux.com/16559

(0)
马哥Net19_小斌斌马哥Net19_小斌斌
上一篇 2016-05-29
下一篇 2016-05-30

相关推荐

  • N25-第5周作业

    1、显示/boot/grub/grub.conf中以至少一个空白字符开头的行 [root@jizo ~]# grep -E '^[[:space:]]+.*' /boot/grub/gurb.conf 2、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,…

    Linux干货 2017-01-09
  • N24-vt.lee-学习宣言

    学习宣言:  好好学习 天天向上!!!  2016-10-26

    Linux干货 2016-10-26
  • redis主从复制(4)— client buffer

    1、 client buffer的设计 redis server以单进程的方式处理接收到的请求,而redis完成请求有些工作比较慢,比如网络IO和磁盘IO等比较慢的操作。redis为了提高处理客户端请求的响应时间,做了很多优化。比如网络io和磁盘io是异步完成、使用后台进程完成bgsave和bgrewriteaof工作,在server端为客户提供读buffe…

    Linux干货 2016-03-28
  • 在vsftp中实现基于pam_mysql的虚拟用户机制

    FTP简介 在介绍vsftp相关内容前,简单描述下FTP。FTP全称File Transfer Protocol,文件传输协议。它是一个C/S架构的协议,在Linux中其服务端实现主要有vsftpd,pureftpd,proftpd,Filezilla,本文主要介绍的是vsftp。客户端实现主要是ftp和lftp两种工具。其工作方式:主要分为两个层面的连接:…

    Linux干货 2017-01-07
  • shell编程之数组及环境变量

    数组 变量:存储单个元素的内存空间 数组:存储多个元素的连续的内存空间,相当于多个变量的 集合 索引:编号从0 声明数组: declare -a ARRAY_NAME declare -A ARRAY_NAME:关联数组 1.declare  -a menu  menu[0]=beef  menu[1]=chicken menu…

    Linux干货 2016-08-29

评论列表(2条)

  • stanley
    stanley 2016-05-29 15:24

    非常认真,样式上可以试下markdown

    • 马哥N19_小斌斌
      马哥N19_小斌斌 2016-05-31 18:29

      @stanley我在wps上写好贴上来的,不知道为什么一提交格式就变了