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了。
如文档有任何不当之处,还请您在线指出,不甚感激