您的位置:首页 > 运维架构 > Linux

Linux的程序安装和包管理

2014-07-26 13:23 309 查看
一、源代码安装
早期,Linux下的程序安装是一件非常讲究技巧和耐心的事情,因为大多数软件仅仅提供编译源码。安装软件需要编译下载到的源代码,并且安装的时候,要解决很多的依赖关系。因为Linux的设计原则就是由众多单一功能软件组成,所以很多软件,需要依赖系统或者其他第三方软件提供的功能(库)。软件依赖关系简单的还好对付,当软件依赖关系复杂甚至循环依赖等,就会给系统管理人员带来巨大的管理维护难度。
(一)源码安装的优缺点
提供源代码安装虽然困难,但是它也有优点,而这些优点是非源码编译方法不具备的。
源代码编译安装的优点:
一份源码,四处编译

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

安装过程中,可以按照需求,设定选项参数进行安装
源代码编译安装的缺点:
优点其实也就是缺点,源代码编译需要安装者有很多的知识、有很强的技能,甚至很好的耐心才能安装好一个软件。

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

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

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

(二)举例
以安装nginx为例。nginx依赖pcre(PerlCompatibleRegularExpressions),它是包括perl兼容的正则表达式库。
1、下载pcre-8.35.tar.bz2源代码并安装




[root@localhostpcre-8.35]#./configure


[root@localhostpcre-8.35]#make


[root@localhostpcre-8.35]#makeinstall


Librarieshavebeeninstalledin:


/usr/local/lib




2、去官网下载nginx-1.6.0.tar.gz,目前这个版本是稳定版。解压缩后,运行configure。




[root@localhostmedia]#./configure--prefix=/usr/local/nginx--conf-path=/etc/nginx/nginx.conf


失败,提示没有安装zlib,这里需要安装的是zlib的开发库。编译安装需要安装库的开发包,一般分包名上会包含devel。安装的时候可能会提示需要公钥没有安装成功,可以使用--nogpgcheck选项。安装使用yum。




[root@localhostnginx-1.6.0]#yuminstallzlib-devel--nogpgcheck




3、开始nginx的安装




[root@localhostnginx-1.6.0]#./configure--prefix=/usr/local/nginx--conf-path=/etc/nginx/nginx.conf


[root@localhostnginx-1.6.0]#make


[root@localhostnginx-1.6.0]#makeinstall




4、安装完成,开始测试一下,找到/usr/local/nginx/sbin/nginx,运行后报错了。




[root@localhost~]#/usr/local/nginx/sbin/nginx


/usr/local/nginx/sbin/nginx:errorwhileloadingsharedlibraries:libpcre.so.1:cannotopensharedobjectfile:Nosuchfileordirectory




5、提示很简单,就是找不到库了,库在/usr/local/lib/libpcre.so.1。




解决办法有两个:




1)符号链接




32位:[root@localhostpcre]#ln-s/usr/local/lib/libpcre.so.1/lib


64位:[root@localhostpcre]#ln-s/usr/local/lib/libpcre.so.1/lib64




2)导出lib




[root@localhost~]#cd/etc/ld.so.conf.d/




[root@localhostld.so.conf.d]#vimnginx-x86_64.conf




建立一个文件nginx-x86_64.conf,在其中添加一行,/usr/local/lib,保存退出。


[root@localhostld.so.conf.d]#ldconfig–v




使用ldconfig命令重新读取配置文件


二、RPM安装

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

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

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

随后,在RedHat上也出现了类似的软件包管理器,叫做rpm(RedhatPackageManagement)。rpm使用了一个以.rmp为扩展名的特殊文件,即软件包文件。rpm提供了叫做rmp的管理程序和其它相关的工具程序,以实现查询、安装、升级、更新和删除rpm软件包文件。rpm将安装过的软件信息,例如软件的版本号码、作者、发行单位、内容、文件路径等信息,保存在数据库中。数据库使用BerkeleyDB,在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-iPACKAGE_FILE...安装指定的包文件
rpm-UPACKAGE_FILE...用指定的包文件升级同名包
rpm-e[--nodeps][--noscripts]
[--test]PACKAGE_NAME...

删除指定的软件包
rpm–qPACKAGE_NAME查询指定包名的包是否安装
rpm-qa查看系统中安装的所有包
rpm–qf/path/to/file查看指定文件所属的软件包
rpm–qiPACKAGE_NAME查看已安装包的描述信息
rpm–qlPACKAGE_NAME查看已安装包里所包含的文件
rpm–qcPACKAGE_NAME产看已安装包的配置文件位置
rpm–qdPACKAGE_NAME查看已安装包的文档安装位置
rpm–q--scriptsPACKAGE_NAME查看已安装包的脚本安装位置
rpm–qpiPACKAGE_FILE查看未安装包文件的描述信息
rpm–qplPACKAGE_FILE查看未安装包文件里所包含的文件
rpm–qpcPACKAGE_FILE产看未安装包文件的配置文件位置
rpm–qpdPACKAGE_FILE查看未安装包文件的文档安装位置
rpm–VPACKAGE_NAME校验指定的软件包
rpm–V/path/to/file校验包含指定文件的软件包
rpm--initdb当/var/lib/rpm下无数据库时执行创建数据库
rpm--rebuilddb重建/var/lib/rpm下数据库
rpm--import/path/to/pubkeyfile导入指定的公钥文件
rpm-KPACKAGE_FILE检查指定包文件的GNUPG签名
(三)举例

1、查看是否安装zlib开发库




[root@localhost~]#rpm-qzlib


zlib-1.2.3-29.el6.x86_64


[root@localhost~]#rpm-qzlib-devel


packagezlib-develisnotinstalled




2、把CentOS的光盘挂载后,安装zlib-devel




[root@localhost~]#ls/mnt/cdrom/Packages/|grepzlib


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-qzlib-devel


zlib-devel-1.2.3-29.el6.x86_64


[root@localhost~]#rpm-qizlib-devel


Name:zlib-develRelocations:(notrelocatable)


Version:1.2.3Vendor:CentOS


Release:29.el6BuildDate:Fri22Feb201307:02:17AMCST


InstallDate:Thu24Jul201407:54:10AMCSTBuildHost:c6b9.bsys.dev.centos.org


Group:Development/LibrariesSourceRPM:zlib-1.2.3-29.el6.src.rpm


Size:117496License:zlibandBoost


Signature:RSA/SHA1,Sun24Feb201301:40:28AMCST,KeyID0946fca2c105b9de


Packager:CentOSBuildSystem<;http://bugs.centos.org>


URL:http://www.gzip.org/zlib/


Summary:HeaderfilesandlibrariesforZlibdevelopment


Description:


Thezlib-develpackagecontainstheheaderfilesandlibrariesneeded


todevelopprogramsthatusethezlibcompressionanddecompression


library.


[root@localhost~]#rpm-qlzlib-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-qdzlib-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--scriptszlib-devel


[root@localhost~]#rpm-q--scriptszlib


postinstallprogram:/sbin/ldconfig


postuninstallprogram:/sbin/ldconfig


[root@localhost~]#rpm-qc--scriptszlib


postinstallprogram:/sbin/ldconfig


postuninstallprogram:/sbin/ldconfig


[root@localhost~]#rpm-ezlib-devel


[root@localhost~]#rpm-qzlib-devel


packagezlib-develisnotinstalled


三、YUM安装

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

YellowDog的YUM(YellowDogUpdater,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库文件;客户端通过这些协议,连接到repoServer,获取配置文件中指向的URL路径下的repo库信息,并缓冲至本地,CentOS通常是在/var/cache/yum。

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

(一)常用命令

命令说明
yumrepolist[all|enabled|disabled]列出所有仓库,所有、启用、未启用
yumlist[all|installed|available][regex]列出仓库中所有、已安装的、可以安装的包或者和和正则表达式匹配的包
yuminfoPACKAGE_NAME查看包信息
yuminstallPACKAGE_NAME安装软件包
yumreinstallPACKAGE_NAME重新安装软件包
yumupdatePACKAGE_NAME升级软件包
yumremovePACKAGE_NAME卸载指定软件包
yumcheck-update检查可更新的所有软件包
yumclean[all|packages|metadata|expire-cache|rpmdb|plugins]清除缓存中指定的文件
yumgrouplist查看系统中已安装和可用的包组
yumgroupinstallGROUP_NAME安装指定包组的软件包
yumgroupremoveGROUP_NAME卸载指定包组的软件包
yumgroupinfoGROUP_NAME显示包组的信息
(二)服务器端repository库生成

配置文件服务器,可以使用FTP、HTTP、NFS服务搭建。




安装createrepo程序。




[root@localhost~]#yumlist|grepcreaterepo


createrepo.noarch0.9.9-18.el6localdvd


[root@localhost~]#yuminstallcreaterepo


[root@localhost~]#rpm-qcreaterepo


createrepo-0.9.9-18.el6.noarch




为指定目录生成repo库




createrepo/path/to/rpms_repo


(三)客户端配置文件

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

[repositoryid]
name=Somenameforthisrepository
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
enabled0或者1,分别表示停用或者启用此yum源
gpgcheck0或者1,分别表示停用或者启用GPG签名验证
gpgkey指向GPGKey文件的URL
mirrorlist指向包含baseurl列表的文件的URL,可以替代baseurl选项
cost默认1000,越小优先级越高。
内置变量

$releasever版本号
$archcpu架构,如i686,athlon等
$basearch系统的基本架构,如i686和athlon同属i386,alpha和alphaev6同属alpha。
(四)举例

安装开发包组Developmenttools和ServerPlatformDevelopment




[root@localhost~]#yumgrouplist*Development*


Loadedplugins:fastestmirror,refresh-packagekit,security


SettingupGroupProcess


Loadingmirrorspeedsfromcachedhostfile


*localdvd:


InstalledGroups:


AdditionalDevelopment


Developmenttools


AvailableGroups:


DesktopPlatformDevelopment


ServerPlatformDevelopment


Done


[root@localhost~]#yumgroupinstall"ServerPlatformDevelopment"




列出指定类型指定名称的包




[root@localhost~]#yumlistinstalledcreaterepo


Loadedplugins:fastestmirror,refresh-packagekit,security


Loadingmirrorspeedsfromcachedhostfile


*localdvd:


InstalledPackages


createrepo.noarch0.9.9-18.el6@localdvd#@符号表示已经安装


四、总结

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

参考资料

Debian软件包

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

推荐文章,博客园,xiaoluo501395377

/article/4842693.html

/article/4842692.html
本文出自“终南山下”博客,请务必保留此出处http://me2xp.blog.51cto.com/6716920/1530425
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: