首页 > 代码库 > Linux的程序安装和包管理

Linux的程序安装和包管理

一、源代码安装

    早期,Linux下的程序安装是一件非常讲究技巧和耐心的事情,因为大多数软件仅仅提供编译源码。安装软件需要编译下载到的源代码,并且安装的时候,要解决很多的依赖关系。因为Linux的设计原则就是由众多单一功能软件组成,所以很多软件,需要依赖系统或者其他第三方软件提供的功能(库)。软件依赖关系简单的还好对付,当软件依赖关系复杂甚至循环依赖等,就会给系统管理人员带来巨大的管理维护难度。

(一)源码安装的优缺点

提供源代码安装虽然困难,但是它也有优点,而这些优点是非源码编译方法不具备的。

源代码编译安装的优点:

  • 一份源码,四处编译

开发者只需要提供一份源代码,就可以在任何具备条件的编译环境下,本地编译安装,完全根据本机自身CPU特性度身定做的。这样编译出来的二进制程序,能最大发挥CPU的指令能力,使程序运行具有更高的效率。

  • 定制化安装

安装过程中,可以按照需求,设定选项参数进行安装

源代码编译安装的缺点:

  • 优点其实也就是缺点,源代码编译需要安装者有很多的知识、有很强的技能,甚至很好的耐心才能安装好一个软件。

  • 而且软件升级后,有可能导致依赖库的版本过低,或者依赖库升级,导致软件不能使用较新的库而运行失败。

  • 卸载时,如何能将安装时产生的文件删除干净,同时也要解决依赖关系,不能把其它软件正在使用的库卸载。

  • 运维时,对于批量安装,源代码编译方法就显得效率低下。

(二)举例

以安装nginx为例。nginx依赖pcre(Perl Compatible Regular Expressions),它是包括 perl 兼容的正则表达式库。

1、下载pcre-8.35.tar.bz2源代码并安装
 
[root@localhost pcre-8.35]# ./configure    
[root@localhost pcre-8.35]# make     
[root@localhost pcre-8.35]# make install     
Libraries have been installed in:     
   /usr/local/lib
 
2、去官网下载nginx-1.6.0.tar.gz,目前这个版本是稳定版。解压缩后,运行configure。
 
[root@localhost media]# ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf    
失败,提示没有安装zlib,这里需要安装的是zlib的开发库。编译安装需要安装库的开发包,一般分包名上会包含devel。安装的时候可能会提示需要公钥没有安装成功,可以使用--nogpgcheck选项。安装使用yum。
 
[root@localhost nginx-1.6.0]# yum install zlib-devel --nogpgcheck
 
3、开始nginx的安装
 
[root@localhost nginx-1.6.0]# ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf    
[root@localhost nginx-1.6.0]# make     
[root@localhost nginx-1.6.0]# make install
 
4、安装完成,开始测试一下,找到/usr/local/nginx/sbin/nginx,运行后报错了。
 
[root@localhost ~]# /usr/local/nginx/sbin/nginx    
/usr/local/nginx/sbin/nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory
 
5、提示很简单,就是找不到库了,库在/usr/local/lib/libpcre.so.1。
 
解决办法有两个:
 
1)符号链接
 
32位:[root@localhost pcre]# ln -s /usr/local/lib/libpcre.so.1 /lib    
64位:[root@localhost pcre]# ln -s /usr/local/lib/libpcre.so.1 /lib64
 
2)导出lib
 
[root@localhost ~]# cd /etc/ld.so.conf.d/
 
[root@localhost ld.so.conf.d]# vim nginx-x86_64.conf
 
建立一个文件nginx-x86_64.conf,在其中添加一行,/usr/local/lib,保存退出。    
[root@localhost ld.so.conf.d]# ldconfig –v
 
使用ldconfig命令重新读取配置文件

二、RPM安装

    为了解决源代码安装带来的问题,在生产环境中提高工作效率,就亟需一种方法或者工具来改善现状。

    首先出现的是早期Slackware中的打包文件,就是把文件简单打包压缩,解压时会放置在目标位置,优点类似Windows绿色软件安装。这种安装本质上基于压缩解压缩的简单管理方式,不能解决软件安装中的依赖关系问题,软件卸载也是问题。

    之后,著名的Linux发行版Debian上率先出现了一种软件包管理器dpkg(Debian Package Management)和其前端工具APT,它很好的解决了二进制包的安装问题。

    随后,在Red Hat上也出现了类似的软件包管理器,叫做rpm(Redhat Package Management)。rpm使用了一个以.rmp为扩展名的特殊文件,即软件包文件。rpm提供了叫做rmp的管理程序和其它相关的工具程序,以实现查询、安装、升级、更新和删除rpm软件包文件。 rpm将安装过的软件信息,例如软件的版本号码、作者、发行单位、内容、文件路径等信息,保存在数据库中。数据库使用Berkeley DB,在RHEL中这个数据库放在/var/lib/rpm目录下。 rpm软件包文件,里面封装了软件的二进制程序、配合文件、说明文件、链接库以及源代码等。二进制程序是编译好的文件,它必须与安装目标机器的CPU架构相兼容。

(一)rpm软件包文件的命名规则:

PACKAGE_NAME-VERSION-RELEASE.ARCH.rpm

PACKAGE_NAME 软件包名称
VERSION 软件版本号
RELEASE 软件包的发行号
ARCH 适用硬件平台,常见i386、x86_64、alpha、noarch

(二)rpm的常用命令

命令 说明
rpm -i PACKAGE_FILE ... 安装指定的包文件
rpm -U PACKAGE_FILE ... 用指定的包文件升级同名包

rpm -e [--nodeps] [--noscripts]            
            [--test] PACKAGE_NAME ...

删除指定的软件包
rpm –q PACKAGE_NAME 查询指定包名的包是否安装
rpm -qa 查看系统中安装的所有包
rpm –qf /path/to/file 查看指定文件所属的软件包
rpm –qi PACKAGE_NAME 查看已安装包的描述信息
rpm –ql PACKAGE_NAME 查看已安装包里所包含的文件
rpm –qc PACKAGE_NAME 产看已安装包的配置文件位置
rpm –qd PACKAGE_NAME 查看已安装包的文档安装位置
rpm –q --scripts PACKAGE_NAME 查看已安装包的脚本安装位置
rpm –qpi PACKAGE_FILE 查看未安装包文件的描述信息
rpm –qpl PACKAGE_FILE 查看未安装包文件里所包含的文件
rpm –qpc PACKAGE_FILE 产看未安装包文件的配置文件位置
rpm –qpd PACKAGE_FILE 查看未安装包文件的文档安装位置
rpm –V PACKAGE_NAME 校验指定的软件包
rpm –V /path/to/file 校验包含指定文件的软件包
rpm --initdb 当/var/lib/rpm下无数据库时执行创建数据库
rpm --rebuilddb 重建/var/lib/rpm下数据库
rpm --import /path/to/pubkeyfile 导入指定的公钥文件
rpm -K PACKAGE_FILE 检查指定包文件的GNUPG签名

(三)举例

1、查看是否安装zlib开发库
 
[root@localhost ~]# rpm -q zlib    
zlib-1.2.3-29.el6.x86_64     
[root@localhost ~]# rpm -q zlib-devel     
package zlib-devel is not installed
 
2、把CentOS的光盘挂载后,安装zlib-devel
 
[root@localhost ~]# ls /mnt/cdrom/Packages/ | grep zlib     
zlib-1.2.3-29.el6.i686.rpm     
zlib-1.2.3-29.el6.x86_64.rpm     
zlib-devel-1.2.3-29.el6.i686.rpm     
zlib-devel-1.2.3-29.el6.x86_64.rpm     
[root@localhost ~]# rpm -i /mnt/cdrom/Packages/zlib-devel-1.2.3-29.el6.x86_64.rpm     
 
3、查看安装后的信息
 
[root@localhost ~]# rpm -q zlib-devel     
zlib-devel-1.2.3-29.el6.x86_64     
[root@localhost ~]# rpm -qi zlib-devel     
Name        : zlib-devel                   Relocations: (not relocatable)     
Version     : 1.2.3                             Vendor: CentOS     
Release     : 29.el6                        Build Date: Fri 22 Feb 2013 07:02:17 AM CST     
Install Date: Thu 24 Jul 2014 07:54:10 AM CST      Build Host: c6b9.bsys.dev.centos.org     
Group       : Development/Libraries         Source RPM: zlib-1.2.3-29.el6.src.rpm     
Size        : 117496                           License: zlib and Boost     
Signature   : RSA/SHA1, Sun 24 Feb 2013 01:40:28 AM CST, Key ID 0946fca2c105b9de     
Packager    : CentOS BuildSystem <;http://bugs.centos.org>     
URL         : http://www.gzip.org/zlib/     
Summary     : Header files and libraries for Zlib development     
Description :     
The zlib-devel package contains the header files and libraries needed     
to develop programs that use the zlib compression and decompression     
library.     
[root@localhost ~]# rpm -ql zlib-devel     
/usr/include/zconf.h     
/usr/include/zlib.h     
/usr/lib64/libz.so     
/usr/lib64/pkgconfig/zlib.pc     
/usr/share/doc/zlib-devel-1.2.3     
/usr/share/doc/zlib-devel-1.2.3/README     
/usr/share/doc/zlib-devel-1.2.3/algorithm.txt     
/usr/share/doc/zlib-devel-1.2.3/example.c     
/usr/share/doc/zlib-devel-1.2.3/minigzip.c     
/usr/share/man/man3/zlib.3.gz     
[root@localhost ~]# rpm -qd zlib-devel     
/usr/share/doc/zlib-devel-1.2.3/README     
/usr/share/doc/zlib-devel-1.2.3/algorithm.txt     
/usr/share/doc/zlib-devel-1.2.3/example.c     
/usr/share/doc/zlib-devel-1.2.3/minigzip.c     
/usr/share/man/man3/zlib.3.gz     
[root@localhost ~]# rpm -q --scripts zlib-devel     
[root@localhost ~]# rpm -q --scripts zlib     
postinstall program: /sbin/ldconfig     
postuninstall program: /sbin/ldconfig     
[root@localhost ~]# rpm -qc --scripts zlib     
postinstall program: /sbin/ldconfig     
postuninstall program: /sbin/ldconfig     
[root@localhost ~]# rpm -e zlib-devel     
[root@localhost ~]# rpm -q zlib-devel     
package zlib-devel is not installed

三、YUM安装

虽然RPM很好的解决了包的安装、卸载、查询、校验,但是它的管理是对已经安装的软件信息收集的管理,它没有解决软件包安装中最头痛的问题——依赖关系。

Yellow Dog的YUM(Yellow Dog Updater,Modified)就是设计被用来解决依赖问题的,Redhat / Fedora / CentOS上默认都采用它。

YUM是建立在RPM之上,它收集rpm包相关信息,检查依赖性,并将众多的信息保存在repo数据库中,数据库采用轻量级关系型数据库Sqlite,早期使用xml文件。

YUM按照目录组织软件rpm包,形成仓库repository,并检查仓库中的软件,收集、分析信息后建立repo数据库。

YUM采用了CS(Client/Server)架构。Server端就是一个文件服务器,可以采用HTTP、FTP、File、NFS协议,但是这些协议的URL路径下必须有repo库文件;客户端通过这些协议,连接到repo Server,获取配置文件中指向的URL路径下的repo库信息,并缓冲至本地,CentOS通常是在/var/cache/yum。

用户使用YUM客户端,查找所有YUM仓库,下载、安装、升级、卸载软件包或者包组。

(一)常用命令

命令 说明
yum repolist [all|enabled|disabled] 列出所有仓库,所有、启用、未启用
yum list [all|installed|available] [regex] 列出仓库中所有、已安装的、可以安装的包或者和和正则表达式匹配的包
yum info PACKAGE_NAME 查看包信息
yum install PACKAGE_NAME 安装软件包
yum reinstall PACKAGE_NAME 重新安装软件包
yum update PACKAGE_NAME 升级软件包
yum remove PACKAGE_NAME 卸载指定软件包
yum check-update 检查可更新的所有软件包
yum clean [all|packages|metadata|expire-cache|rpmdb|plugins] 清除缓存中指定的文件
yum grouplist 查看系统中已安装和可用的包组
yum groupinstall GROUP_NAME 安装指定包组的软件包
yum groupremove GROUP_NAME 卸载指定包组的软件包
yum groupinfo GROUP_NAME 显示包组的信息

(二)服务器端repository库生成

配置文件服务器,可以使用FTP、HTTP、NFS服务搭建。
 
安装createrepo程序。
 
[root@localhost ~]# yum list | grep createrepo   
createrepo.noarch                          0.9.9-18.el6                localdvd     
[root@localhost ~]# yum install createrepo     
[root@localhost ~]# rpm -q createrepo     
createrepo-0.9.9-18.el6.noarch
 
为指定目录生成repo库
 
createrepo /path/to/rpms_repo

(三)客户端配置文件

主配置文件位于/etc/yum.conf,一个或多个相关仓库的配置信息可保存一个文件,文件名都已.repo结尾,并放在/etc/yum.repos.d目录中,该目录下的文件格式如下:

[repositoryid]     
name=Some name for this repository
baseurl=url://server1/path/to/repository/
url://server2/path/to/repository/
url://server3/path/to/repository/

enabled=1
gpgcheck=1
gpgkey=URL
mirrorlist=URL
cost=1000

参数 说明
repositoryid 仓库的唯一标识
name 仓库的描述
baseurl 指向yum仓库的repodata目录的上一级目录。可以一个baseurl指向多个URL,但不能出现多个baseurl=url
enabled 0或者1,分别表示停用或者启用此yum源
gpgcheck 0或者1,分别表示停用或者启用GPG签名验证
gpgkey 指向GPGKey文件的URL
mirrorlist 指向包含baseurl列表的文件的URL,可以替代baseurl选项
cost 默认1000,越小优先级越高。

内置变量

$releasever 版本号
$arch cpu架构,如i686,athlon等
$basearch 系统的基本架构,如i686和athlon同属i386,alpha和alphae v6同属alpha。

(四)举例

安装开发包组Development tools和Server Platform Development
 
[root@localhost ~]# yum grouplist *Development*   
Loaded plugins: fastestmirror, refresh-packagekit, security     
Setting up Group Process     
Loading mirror speeds from cached hostfile     
* localdvd:     
Installed Groups:     
   Additional Development     
   Development tools     
Available Groups:     
   Desktop Platform Development     
   Server Platform Development     
Done     
[root@localhost ~]# yum groupinstall "Server Platform Development"
 
列出指定类型指定名称的包
 
[root@localhost ~]# yum list installed createrepo   
Loaded plugins: fastestmirror, refresh-packagekit, security     
Loading mirror speeds from cached hostfile     
* localdvd:     
Installed Packages     
createrepo.noarch      0.9.9-18.el6     @localdvd # @符号表示已经安装

四、总结

    从以上源代码安装、RPM、YUM的演化可以看出,新的工具的产生是为了解决生产中的难题,提高生产效率。各种方法都有其适用性,在生成环境中合理的使用,才能发挥各种方法的优势。

 

参考资料

Debian软件包

http://www.debian.org/doc/manuals/debian-faq/ch-pkg_basics

推荐文章,博客园,xiaoluo501395377

http://www.cnblogs.com/xiaoluo501395377/archive/2013/05/21/3089970.html

http://www.cnblogs.com/xiaoluo501395377/archive/2013/05/20/3089554.html

本文出自 “终南山下” 博客,请务必保留此出处http://me2xp.blog.51cto.com/6716920/1530425

Linux的程序安装和包管理