一、源代码安装
早期,Linux下的程序安装是一件非常讲究技巧和耐心的事情,因为大多数软件仅仅提供编译源码。安装软件需要编译下载到的源代码,并且安装的时候,要解决很多的依赖关系。因为Linux的设计原则就是由众多单一功能软件组成,所以很多软件,需要依赖系统或者其他第三方软件提供的功能(库)。软件依赖关系简单的还好对付,当软件依赖关系复杂甚至循环依赖等,就会给系统管理人员带来巨大的管理维护难度。
(一)源码安装的优缺点
提供源代码安装虽然困难,但是它也有优点,而这些优点是非源码编译方法不具备的。
源代码编译安装的优点:
- 一份源码,四处编译
开发者只需要提供一份源代码,就可以在任何具备条件的编译环境下,本地编译安装,完全根据本机自身CPU特性度身定做的。这样编译出来的二进制程序,能最大发挥CPU的指令能力,使程序运行具有更高的效率。
- 定制化安装
安装过程中,可以按照需求,设定选项参数进行安装
源代码编译安装的缺点:
- 优点其实也就是缺点,源代码编译需要安装者有很多的知识、有很强的技能,甚至很好的耐心才能安装好一个软件。
- 而且软件升级后,有可能导致依赖库的版本过低,或者依赖库升级,导致软件不能使用较新的库而运行失败。
- 卸载时,如何能将安装时产生的文件删除干净,同时也要解决依赖关系,不能把其它软件正在使用的库卸载。
- 运维时,对于批量安装,源代码编译方法就显得效率低下。
(二)举例
以安装nginx为例。nginx依赖pcre(Perl Compatible Regular Expressions),它是包括 perl 兼容的正则表达式库。
1、下载pcre-8.35.tar.bz2源代码并安装
[[email protected] pcre-8.35]# ./configure
[[email protected] pcre-8.35]# make
[[email protected] pcre-8.35]# make install
Libraries have been installed in:
/usr/local/lib
2、去官网下载nginx-1.6.0.tar.gz,目前这个版本是稳定版。解压缩后,运行configure。
[[email protected] media]# ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf
失败,提示没有安装zlib,这里需要安装的是zlib的开发库。编译安装需要安装库的开发包,一般分包名上会包含devel。安装的时候可能会提示需要公钥没有安装成功,可以使用--nogpgcheck选项。安装使用yum。
[[email protected] nginx-1.6.0]# yum install zlib-devel --nogpgcheck
3、开始nginx的安装
[[email protected] nginx-1.6.0]# ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf
[[email protected] nginx-1.6.0]# make
[[email protected] nginx-1.6.0]# make install
4、安装完成,开始测试一下,找到/usr/local/nginx/sbin/nginx,运行后报错了。
[[email protected] ~]# /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位:[[email protected] pcre]# ln -s /usr/local/lib/libpcre.so.1 /lib
64位:[[email protected] pcre]# ln -s /usr/local/lib/libpcre.so.1 /lib64
2)导出lib
[[email protected] ~]# cd /etc/ld.so.conf.d/
[[email protected] ld.so.conf.d]# vim nginx-x86_64.conf
建立一个文件nginx-x86_64.conf,在其中添加一行,/usr/local/lib,保存退出。
[[email protected] 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开发库
[[email protected] ~]# rpm -q zlib
zlib-1.2.3-29.el6.x86_64
[[email protected] ~]# rpm -q zlib-devel
package zlib-devel is not installed
2、把CentOS的光盘挂载后,安装zlib-devel
[[email protected] ~]# 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
[[email protected] ~]# rpm -i /mnt/cdrom/Packages/zlib-devel-1.2.3-29.el6.x86_64.rpm
3、查看安装后的信息
[[email protected] ~]# rpm -q zlib-devel
zlib-devel-1.2.3-29.el6.x86_64
[[email protected] ~]# 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.
[[email protected] ~]# 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
[[email protected] ~]# 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
[[email protected] ~]# rpm -q --scripts zlib-devel
[[email protected] ~]# rpm -q --scripts zlib
postinstall program: /sbin/ldconfig
postuninstall program: /sbin/ldconfig
[[email protected] ~]# rpm -qc --scripts zlib
postinstall program: /sbin/ldconfig
postuninstall program: /sbin/ldconfig
[[email protected] ~]# rpm -e zlib-devel
[[email protected] ~]# 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程序。
[[email protected] ~]# yum list | grep createrepo
createrepo.noarch 0.9.9-18.el6 localdvd
[[email protected] ~]# yum install createrepo
[[email protected] ~]# 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=URLcost=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
[[email protected] ~]# 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
[[email protected] ~]# yum groupinstall "Server Platform Development"
列出指定类型指定名称的包
[[email protected] ~]# 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