软件包的管理

2017-09-15 10:12:51来源:http://xiaoshuaigege.blog.51cto.com/6217242/1965100作者:人点击

分享

Linux 软件包关系图谱

本图片引自http://www.cnblogs.com/yangquan/p/6582771.html,如有侵权,请及时告知,会立即删除。

可以图片上点击右键,选择在新的标签页中打开,这样可以查看大图。

软件包简介

在Linux操作系统中,RPM 和 DPKG 为最常见的两类软件包管理工具,他们分别应用于基于 RPM 软件包的 Linux 发行版本和 DEB 软件包的 Linux 发行版本。软件包管理工具的作用就是在操作系统中能够快捷的实现程序包的安装,卸载,查询,升级和校验等管理操作。

RPM 全称 RedHat Package Manager 或者RPM Package Manager ,最早由 Red Hat 公司制定实施,随后被 GNU 开源操作系统接受并成为很多 Linux 系统 (RHEL) 的既定软件标准。与 RPM 进行竞争的是基于 Debian 操作系统 (UBUNTU) 的 DEB 软件包管理工具- DPKG,全称为 Debian Package,功能方面与 RPM 相似。

本文是主要介绍RPM软件包管理工具在CentOS系统上的配置和使用,至于DPKG软件包管理,以及二者之间的相互比较,此处暂不做描述。

目录

rpm 软件包管理

yum 软件包管理

编译安装软件包

rpm 包管理rpm 包的命名方式

rpm包的命名是有一定规则的一般如 name-VERSION-release.arch.rpm

name:表示软件的名字 VERSION: major.minor.release 发行版的编号 release: 系统版本 arch: 支持的平台 常见的如 i386 ,X86_64

rpm 包的安装

Linux系统中可以直接使用rpm 命令来直接安装系统中已经有的软件包,使用方式如下所示。

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

-v:verbose显示详细信息
-vv:
-h:以#显示程序包管理执行进度

通常我们会rpm -ivh PACKAGE_FILE的组合形式一起安装。 下面我们演示安装tree 命令的过程 。

[install-options]指的是在安装过程中的一些相关的操作,例如测试安装,忽略以来关系等等,常用选项,如下

--test:测试安装,但不真正执行安装,即dryrun模式
--nodeps:忽略依赖关系
--replacepkgs|replacefiles:覆盖或者替代安装
--nosignature:不检查来源合法性
--nodigest:不检查包完整性
--noscripts:不执行程序包脚本
%pre:安装前脚本;--nopre
%post:安装后脚本;--nopost
%preun:卸载前脚本;--nopreun
%postun:卸载后脚本;--nopostun
rpm 包的升级

软件包在使用的过程中可能会遇到升级的情况,这时,rpm 升级功能就能够派上用场。rpm 升级命令的使用一般如下所示

rpm{-U|--upgrade}[install-options]PACKAGE_FILE...
rpm{-F|--freshen}[install-options]PACKAGE_FILE...

但是U和F 在实际的使用过程中还是有区别的。 upgrade:安装有旧版程序包,则“升级” 如果不存在旧版程序包,则“安装” freshen:安装有旧版程序包,则“升级” 如果不存在旧版程序包,则不执行升级操作

rpm-UvhPACKAGE_FILE...
rpm-UvhPACKAGE_FILE...

升级注意事项

(1) 不要对内核进行升级操作;Linux 支持多内核版本并存,因此可以直接安装新的内核程序。 (2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留

rpm 包的查询

rpm包管理工具支持查询软件程序包,,比如说某些应用程序是由哪些包安装生成,也可以针对未安装成功的包进行查询。

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

常用的查询[select-options]有下面几个选项

[select-options]
-a:所有包
-f:查看指定的文件由哪个程序包安装生成
-prpmfile:针对尚未安装的程序包文件做查询操作
--whatprovidesCAPABILITY:查询指定的CAPABILITY由哪个包所提供
--whatrequiresCAPABILITY:查询指定的CAPABILITY被哪个包所依赖

查询的过程中,必须要有选项-q 然后可以结合[select-options]中的选项查看更多的信息。

#查询与tree有关的所有的包
[root@centos6~]#rpm-qatree
tree-1.5.3-3.el6.x86_64

#查询指定的文件由哪个程序包提供
#这里使用了管道,将前一个命令的结果作为参数,传给第二命令来执行。
[root@centos6~]#whichbash|xargsrpm-qf
bash-4.1.2-48.el6.x86_64

#下面这个命令与上面的命令是等价的
[root@centos6~]#whichbash
/bin/bash
[root@centos6~]#rpm-qf/bin/bash
bash-4.1.2-48.el6.x86_64
#但是我们还可以使用下面这个命令实现同样的效果
[root@centos6~]#rpm-q--whatprovidesbash
bash-4.1.2-48.el6.x86_64
#针对未安装的程序包进行查询,后面的参数必须是rpm文件
[root@centos6Packages]#rpm-qpsendmail-8.14.4-9.el6_8.1.x86_64.rpm
warning:sendmail-8.14.4-9.el6_8.1.x86_64.rpm:HeaderV3RSA/SHA1Signature,keyIDc105b9de:NOKEY
sendmail-8.14.4-9.el6_8.1.x86_64

常用的查询[query-options]有下面几个选项

[query-options]
--changelog:查询rpm包的changelog
-c:查询程序的配置文件
-d:查询程序的文档
-i:information
-l:查看指定的程序包安装后生成的所有文件
--scripts:程序包自带的脚本
--provides:列出指定程序包所提供的CAPABILITY
-R:查询指定的程序包所依赖的CAPABILITY

在实际的使用过程中可以根据[query-options]选项进行更多的查询操作。

#查询程序的文档
[root@centos6Packages]#rpm-qdtree
/usr/share/doc/tree-1.5.3/LICENSE
/usr/share/doc/tree-1.5.3/README
/usr/share/man/man1/tree.1.gz

#查看指定的程序包安装后生成的所有文件
[root@centos6Packages]#rpm-qltree
/usr/bin/tree
/usr/share/doc/tree-1.5.3
/usr/share/doc/tree-1.5.3/LICENSE
/usr/share/doc/tree-1.5.3/README
/usr/share/man/man1/tree.1.gzrpm 包的卸载

rpm 也提供了对rpm 程序的卸载功能,并且也有很多的选项。

rpm{-e|--erase}[--allmatches][--nodeps][--noscripts]
[--notriggers][--test]PACKAGE_NAME...

#删除tree工具
[root@centos6Packages]#rpm-etreerpm 的包校验

rpm 提供了软件包的校验,它可以用来对一个包来源的合法性和完整性进行校验。rpm 检验的方式如下

rpm{-V|--verify}[select-options][verify-options]

S文件大小发生变化
M文件的属性变化(包括权限和文件类型)
5MD5发生改变
D设备发生变动
L链接路径发生改变
U属主发生变化
G属组发生变化
TmTime发生变化
P程序所依赖的capabilities发生变化

接下来我们还是以tree命令为例来进行演示

#首先查看tree命令的属主是否有过变更
[root@centos6Packages]#rpm-VUtree

#没有结果#查看tree命令的属性信息
[root@centos6Packages]#whichtree|xargsls-l
-rwxr-xr-x.1rootroot41136Jan142015/usr/bin/tree

#更改属主
[root@centos6Packages]#chownmage/usr/bin/tree

#确认是否发生变动
[root@centos6Packages]#whichtree|xargsls-l
-rwxr-xr-x.1mageroot41136Jan142015/usr/bin/tree

#使用rpm的查询命令
[root@centos6Packages]#rpm-VUtree
.....U.../usr/bin/tree#结果显示属主发生过变更yum 包管理

在实际的生产环境中,仅仅使用rpm 命令有时并不能满足我们的需要,因为rpm 的包与包之间往往有着相互的依赖,甚至可能是循环依赖,我们在使用rpm命令安装软件的过程中往往会因为有依赖包而安装不成功,这时我们就需要一种能够将依赖包也一并安装的机制,在CentOS上,这个方式,就是yum。YUM: Yellowdog Update Modifier,rpm的前端程序,可解决软件包相关依赖性,可在多个库之间定位软件包,up2date的替代工具。 yum repository: yum repo,存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录repodata下)。 yum源的文件服务器一共可以有4种,http://、https://、ftp://、file://

配置yum 客户端

yum 客户端的配置文件如下所示: /etc/yum.conf:为所有仓库提供公共配置 /etc/yum.repos.d/*.repo:为仓库的指向提供配置(必须是以repo结尾的配置文件) 仓库指向的定义

[repositoryID]#中间不能有空格作为仓库的ID,并且唯一
name=Somenameforthisrepository#可以理解为对这个仓库的一种解释
baseurl=url://path/to/repository/#仓库的地址,类型可以是上面说到那4种类型
enabled={1|0}#指定该仓库是否可用0不可用
gpgcheck={1|0}#指定是否进行gpg校验
gpgkey=URL#如果进行gpg校验的话,将gpgkey的地址放在这里
enablegroups={1|0}
failovermethod={roundrobin|priority}roundrobin:意为随机挑选,默认值priority:按顺序访问cost=默认为100

yum 的配置文件中,可以使用一些通用的变量,这样可以对yum仓库进行统一的配置。yum的repo配置文件中可用的变量:

$releasever:当前OS的发行版的主版本号
$arch:平台,i386,i486,i586,x86_64等
$basearch:基础平台;i386,x86_64
$YUM0-$YUM9:自定义变量

实例:
#这样写的话,系统版本,以及适应平台都可以不用写称HardCode了
http://server/centos/7/x86_64
http://server/centos/6/i384在本地配置阿里云yum仓库#进入到/etc/yum.repos.d/目录下创建一个以.repo为后缀的文件输入以下内容就搭建好了一个本地的yum客户端。
[aliyum]
name=aliyuncentosyum
baseurl=
gpgcheck=0

[aliyunepel]
name=aliyunepelyum
baseurl=
gpgcheck=0

EPEL 全称是 Extra Packages for Enterprise linux 。EPEL是由 Fedora 社区打造,为 RHEL 及衍生发行版如 CentOS、Scientific Linux 等提供高质量软件包的项目。装上了 EPEL之后,就相当于添加了一个第三方源。同时能够提供大量的在官方的repository中找不到的软件源,例如bash-completion。

yum 命令的使用方法

yum 命令有着大量的选项和参数,在使用过程中可以非常的灵活。yum命令的使用方法为yum [options] [command] [package ...]

#显示仓库列表:
yumrepolist[all|enabled|disabled]

#显示程序包:
yumlist
yumlist[all|glob_exp1][glob_exp2][...]
yumlist{available|installed|updates}[glob_exp1][...]

#安装程序包:
yuminstallpackage1[package2][...]
yumreinstallpackage1[package2][...](重新安装)

#升级程序包:
yumupdate[package1][package2][...]
yumdowngradepackage1[package2][...](降级)

#检查可用升级:
yumcheck-update

#卸载程序包:

yumremove|erasepackage1[package2][...]

#查看程序包information:
yuminfo[...]

#查看指定的特性(可以是某文件)是由哪个程序包所提供:
yumprovides|whatprovidesfeature1[feature2][...]

#清理本地缓存:
#清除/var/cache/yum/$basearch/$releasever缓存
yumclean[packages|metadata|expire-cache|rpmdb|plugins|all]

#构建缓存:
yummakecache
#搜索:以指定的关键字搜索程序包名及summary信息
yumsearchstring1[string2][...]

#查看指定包所依赖的capabilities:
yumdeplistpackage1[package2][...]

#查看yum事务历史:
yumhistory[info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
yumhistoryyumhistoryinfo6
yumhistoryundo6

#日志:
/var/log/yum.log

#安装升级本地程序包
yumlocalinstallrpmfile1[rpmfile2][...]
yumlocalupdaterpmfile1[rpmfile2][...]

#包组管理的相关命令:
yumgroupinstallgroup1[group2][...]
yumgroupupdategroup1[group2][...]
yumgrouplist[hidden][groupwildcard][...]
yumgroupremovegroup1[group2][...]
yumgroupinfogroup1[...]

下面将通过两个简单的示例来演示一下yum命令的使用 ,分别是yum 显示程序列表 ,以及卸载和重新安装 软件程序。

在实际的生产环境中,我们有可能会卸载掉之前安装过的软件,如果一个软件在安装过程中一并安装了大量的依赖包,此时使用rpm 命令将不能有效的达到我们的目的,而使用yum history 命令却可以很轻松的做到。如果我们卸载错了软件,甚至还可以重装起来,这就是yum的魅力。

配置yum服务端仓库

在实际的生产环境中,有时我们不仅需要从yum源服务器上下载安装软件,还有可能需要我们自己配置yum服务器端仓库,以提供软件,方便他人进行下载。比方说,开发人员开发的软件工具包,放在我们自己配置的yum源上,然后大家都可以进行下载。 此时我们要配置一个网络yum源供他人使用。

在试验的过程中,有可能会因为防火墙,以及SELinux等不确定原因导致失败,所以我们先将这两个服务关掉。

关闭防火墙

#centos7中的配置
systemctldisablefirewalld.service
systemctlstopfirewalld.service

#centos6中的配置
chkconfigiptablesoff
serviceiptablesstop

#查看是否已经关闭了
iptables-vnL

关闭SELinux

vim/etc/selinux/configSELINUX=permissive

setenforce0
getenforce验证是否生效

实验一:配置ftp yum 服务包

第一步:安装ftp 服务

cd/run/media/root/CentOS/7/x86_64/Packages/

rpm-ivhvsftpd-3.0.2-21.el7.x86_64.rpm

#查看文件安装之后生成的所有的文件
rpm-qlvsftpd

#开启ftp服务
systemctlstartvsftpd

#确认ftp的21端口是否开启
ss-tnl
#将ftp服务设置为开机启动(CentOS7支持)
systemctlenablevsftpd

第二步:准备yum 系统安装包

mkdir-p/var/ftp/pub/centos/{6,7}
cp-r/run/media/root/CentOS/7/x86_64/*/var/ftp/pub/centos/7
cp-r/run/media/root/CentOS/6/x86_64/*/var/ftp/pub/centos/6

第三步:客户端配置


vim/etc/yum.repos.d/base.repo
[base]
name=centos
baseurl=
gpgkey=ftp://$IP_ADDRESS/pub/centos/$releasever/RPM-GPG-KEY-CentOS-$releasever

实验二 配置http yum 服务包

第一步:安装http 服务


httpd安装的过程需要依赖,所以我们要使用yum安装

yuminstallhttpd
#查看文件安装之后生成的所有的文件
rpm-qlhttpd

#开启http服务
systemctlstarthttpd

#确认ftp的21端口是否开启
ss-tnl
#将ftp服务设置为开机启动(CentOS7支持)
systemctlenablehttpd

第二步:准备第三方yum包

#实际生产中会把开发人员开发的rpm包放在app目录下,我们这里使用光盘里的rpm来模拟
cp-r/run/media/root/CentOS/7/x86_64/*/var/www/html/app

第三步:客户端配置

[app]
name=app
baseurl=
gpgcheck=0编译安装软件包

在实际生产中,软件厂商有时并不会提供rpm包,而是以源码的形式发布。因为他们的源码是可以在多个平台上运行的。如果要提供安装包,开发人员就需要根据不同的平台进行编译,然后打包。这是一个比较大的工作量,所以软件提供商有时更愿意发布源码供用户自己编译安装。 最典型的应用有很多,比如Linux kernel。

在这种情况下,我们就需要自己编译安装。而Linux 中就提供了这样的编译工具。有针对C、C++语言的make项目管理器,以及针对Java 的maven管理器。

我们以下面的这个实验来介绍如何编译安装软件。

实验:在centos6.9源码编译httpd-2.2.34

第一步: 首先我们先检查一下系统中是否已经安装了httpd,如果是将其删除,同时我们将在Apache官方网站上下载的Httpd的源码拷贝到Linux的app(自己创建)目录中。

#查看是否已经安装了httpd的相关软件
[root@centos6~]#rpm-qa"httpd*"httpd-tools-2.2.15-59.el6.centos.x86_64
httpd-2.2.15-59.el6.centos.x86_64
#已经安装了,将其删除掉
[root@centos6~]#yumremovehttpd

第二步: 安装开发包组

#开发包组中包含了大部分的开发工具包
yumgroupinstall"Developmenttools"

第三步: 将下载的源码进行解包 ,进入到软件目录,查看软件安装文档

#将下载的源码进行解包
[root@centos6app]#tarxvfhttpd-2.2.34.tar.bz2

#进入到软件安装目录查看文档
[root@centos6app]#cdhttpd-2.2.34/
[root@centos6app]#catREADME
[root@centos6app]#catINSTALL

第四步: 生成makefile,生成makefile的过程,我们使用configure这个脚本来生成。configure这个脚本是开发者在开发结束之后提供的,它指定了软件支持哪些功能。configure根据Makefile.in这个模板来自动生成。 同时./configure也可以检测当前的安装环境是否支持安装这个软件。

同时 开发者也可以自己生成configure。使用autoconf生成configure脚本,使用automake生成Makefile.in。

#先查看一下configure脚本的帮助
[root@centos6app]#./configure--help

#configure脚本执行的过程中,要指定路径,当然也可以不指定,系统就会放到默认目录下
#生产中建议,将编译安装的软件放到指定的路径下,这样便于管理。
[root@centos6httpd-2.2.34]#./configure--prefix=/app/httpd22/--sysconfdir=/etc/httpd22/--enable-ssl
#脚本执行过程中会检查需要的依赖包
#这会就可以检查一下,是否缺少相应的包组,如果缺少,缺什么就装什么。比如说,gcc,openssl-devel

第五步: 编译和安装 直接执行make命令进行编译,执行make install 命令进行安装

[root@centos6httpd-2.2.34]#make&&makeinstall

安装成功之后,查看之前指定的目录是否已经成功创建。例如/app/httpd22/,/etc/httpd22/

[root@centos6/]#ll-d/etc/httpd22
drwxr-xr-x.4rootroot4096Aug512:39/etc/httpd22

第六步:针对Httpd这个软件进行环境配置 cd /etc/httpd22/一般在软件安装成功之后,在/app/httpd22/ 下面会有一个bin的目录,里面存放了该软件的运行命令。如果我们想运行该软件,就可以进入到bin目录下执行相应的命令,当然,我们也可以把该目录添加到环境变量中,这样我们就不用每次都进入到该目录,节省了时间。

#将“路径添加到环境变量”写成一个脚本,并写入到httpd22.sh的脚本中
[root@centos6/]#echo'exportPATH=/app/httpd22/bin:$PATH'>/etc/profile.d/httpd22.sh

#执行该脚本,路径添加到环境变量中
[root@centos6/]#./etc/profile.d/httpd22.sh
#启动软件
[root@centos6app]#apachectlstart
#查看80端口是否已经被启用
[root@centos6app]#ss-ntl
#修改网页文件
[root@centos6app]#vim/app/httpd22/htdocs/index.html

#为软件添加man帮助
[root@centos6htdocs]#vim/etc/man.config

#添加一行添加了这一行之后,就可以使用man帮助查看帮助文档了。

MANPATH/app/httpd22/man

至此,我们就已经完整的介绍了CentOS上的软件包的管理。总结一下,一共三种方式,rpm,yum,编译安装,而每一种安装方式都有自己应该注意的地方,都有自己的优缺点,在实际生产中,我们可以多种方式结合使用,从而实现我们的目标。

个人博客地址:http://www.pojun.tech/欢迎访问


微信扫一扫

第七城市微信公众平台