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软件包管理,以及二者之间的相互比较,此处暂不做描述。

目录

  1. rpm 软件包管理

  2. yum 软件包管理

  3. 编译安装软件包

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: 测试安装,但不真正执行安装,即dry run模式
--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 -Uvh PACKAGE_FILE ...
rpm -Uvh PACKAGE_FILE ...

升级注意事项

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

rpm 包的查询

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

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

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

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

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

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

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

# 下面这个命令与上面的命令是等价的
[root@centos6 ~]#which bash
/bin/bash
[root@centos6 ~]#rpm -qf /bin/bash
bash-4.1.2-48.el6.x86_64
# 但是我们还可以使用下面这个命令实现同样的效果
[root@centos6 ~]#rpm -q --whatprovides bash
bash-4.1.2-48.el6.x86_64  


# 针对未安装的程序包进行查询,后面 的参数 必须是rpm 文件
[root@centos6 Packages]#rpm -qp sendmail-8.14.4-9.el6_8.1.x86_64.rpm 
warning: sendmail-8.14.4-9.el6_8.1.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: 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@centos6 Packages]#rpm -qd tree
/usr/share/doc/tree-1.5.3/LICENSE
/usr/share/doc/tree-1.5.3/README
/usr/share/man/man1/tree.1.gz

#查看指定的程序包安装后生成的所有文件
[root@centos6 Packages]#rpm -ql tree
/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.gz

rpm 包的卸载

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

rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts]           
    [--notriggers] [--test] PACKAGE_NAME ...
    
#删除 tree 工具
[root@centos6 Packages]#rpm -e tree

rpm 的包校验

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

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

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

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

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

# 没有结果#查看tree 命令的属性信息
[root@centos6 Packages]#which tree | xargs ls -l 
-rwxr-xr-x. 1 root root 41136 Jan 14  2015 /usr/bin/tree

#更改属主
[root@centos6 Packages]#chown mage /usr/bin/tree

#确认是否发生变动
[root@centos6 Packages]#which tree | xargs ls -l 
-rwxr-xr-x. 1 mage root 41136 Jan 14  2015 /usr/bin/tree

#使用rpm的查询命令  
[root@centos6 Packages]#rpm -VU tree
.....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=Some name for this repository # 可以理解为对这个仓库的一种解释
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=aliyun centos yum 
baseurl=
 gpgcheck=0
 
[aliyunepel]
name=aliyun epel yum
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 ...]

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

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

# 安装程序包:
yum install package1 [package2] [...]
yum reinstall package1 [package2] [...] (重新安装)  

#升级程序包:
yum update [package1] [package2] [...]
yum downgrade package1 [package2] [...] (降级)

#检查可用升级:
yum check-update

#卸载程序包:

yum remove | erase package1 [package2] [...]

#查看程序包information:
yum info [...]

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

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

#构建缓存:
yum makecache


#搜索:以指定的关键字搜索程序包名及summary信息
yum search string1 [string2] [...]

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

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

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

#安装升级本地程序包  
yum localinstall rpmfile1 [rpmfile2] [...]  
yum localupdate rpmfile1 [rpmfile2] [...]

#包组管理的相关命令:
	yum groupinstall group1 [group2] [...]
	yum groupupdate group1 [group2] [...]
	yum grouplist [hidden] [groupwildcard] [...]
	yum groupremove group1 [group2] [...]
	yum groupinfo group1 [...]

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

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

配置yum服务端仓库

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

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

 关闭防火墙

# centos7 中的配置
systemctl disable firewalld.service 
systemctl stop firewalld.service 

# centos6 中的配置
chkconfig iptables off
service iptables stop

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

 关闭SELinux

vim /etc/selinux/configSELINUX=permissive

setenforce  0
getenforce 验证是否生效
  • 实验一:配置ftp yum 服务包

第一步:安装ftp 服务

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

	rpm -ivh vsftpd-3.0.2-21.el7.x86_64.rpm 

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

	#开启ftp 服务
	systemctl start vsftpd  

	#确认ftp的21端口是否开启 
	ss -tnl	
	# 将ftp 服务设置为开机启动 (CentOS 7支持)
	systemctl enable vsftpd 	

第二步:准备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安装

	yum install httpd	
	#查看文件安装之后生成的所有的文件
	 rpm -ql httpd 

	#开启http 服务
	systemctl start httpd  

	#确认ftp的21端口是否开启 
	ss -tnl	
	# 将ftp 服务设置为开机启动 (CentOS 7支持)
	systemctl enable httpd

第二步:准备第三方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 ~]#yum remove httpd
  • 第二步: 安装开发包组

# 开发包组中包含了大部分的开发工具包
yum groupinstall "Development tools"
  • 第三步: 将下载的源码进行解包 ,进入到软件目录,查看软件安装文档

# 将下载的源码进行解包
[root@centos6 app]# tar xvf httpd-2.2.34.tar.bz2 

# 进入到软件安装目录查看文档  
[root@centos6 app]# cd httpd-2.2.34/
[root@centos6 app]# cat README
[root@centos6 app]# cat INSTALL
  • 第四步: 生成makefile,生成makefile的过程,我们使用 configure 这个脚本来生成。 configure这个脚本是开发者在开发结束之后提供的,它指定了软件支持哪些功能。 configure 根据 Makefile.in 这个模板来自动生成。 同时./configure 也可以检测当前的安装环境是否支持安装这个软件。

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

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

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

[root@centos6 httpd-2.2.34]# make && make install

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

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

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

# 执行该脚本,路径添加到环境变量中
[root@centos6 /]#. /etc/profile.d/httpd22.sh 


# 启动软件
[root@centos6 app]#apachectl start  


# 查看80端口是否已经被启用  
[root@centos6 app]#ss -ntl  


# 修改网页文件
[root@centos6 app]# vim /app/httpd22/htdocs/index.html

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

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

MANPATH /app/httpd22/man

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



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