在上一篇博客中,写到了如何使用rpm命令来安装、卸载软件等,但是大家都知道,各个软件包之间可能存在依赖关系,如果安装某个软件需要额外的依赖其他若干的包,那么我们就需要将其他额外的包一个一个的安装上去,这样的一个过程是非常耗时的,所以出现了一个前端工具,如yum,dnf,apt-get等,本次博客就CentOS上的yum和程序包的编译安装做出详细的描述,最后还通过实际的例子介绍了程序包的编译安装。
yum的实现原理yum实现软件包的获取其实是基于C/S架构的,C为你的主机,S为yum repository(文件服务器或者本地yum repository),yum repository里面存储了众多的rpm包,以及包的相关元数据文件(包含软件包的列表和依赖关系等)和计算出来的特征码,一般放在repodata目录下面。
当我们使用yum安装一个软件包的时候,会进行如下几个步骤:
1.本地主机会在配置文件里面找到yum repository的指向,并建立连接;
2.从yum repository获取元数据文件和特征码放在缓存里面;
3.通过查看元数据文件获知需要安装的软件包和其依赖的软件的名称并向yum repository发起请求;
4.本地主机获取到软件包后进行安装。
5.安装好后,rpm包会被删除,但是元数据文件和特征码会被保存下来,其目的是为了当你再向yum repository发起连接的时候,先会向yum repository获取到特征码和本地缓存的特征码做对比,如果相同则说明yum repository里面的文件没有发生改变,如果不同,则说明yum repository里面的文件发生了改变,这时候就需要重新向yum repository获取元数据文件了。
通常情况下yum repository都是文件服务器,你可以通过URL进行访问,如:
ftp://path/to/repository/ 通过FTP进行访问和传输
通过http进行访问和传输
nfs://path/to/repository/ 通过nfs进行访问和传输
file:///path/to/repository/ 用于本地的yum仓库
yum的配置文件yum的配置文件有:
/etc/yum.conf:为所有仓库提供公共配置
/etc/yum.repos.d/下以repo结尾的文件:为仓库的指向提供配置
yum.conf的内容:
[main] cachedir=/var/cache/yum/$basearch/$releasever keepcache=0 debuglevel=2 logfile=/var/log/yum.log exactarch=1 obsoletes=1 gpgcheck=1 plugins=1 installonly_limit=5 bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=?category=yum distroverpkg=centos-release
yum.conf的内容cachedir:缓存目录,默认情况下在"/var/cache/yum";
keepcache:是否保存缓存,0是不保存,1是保存;
debuglevel:Debug信息的输出等级,范围为0-10,默认为2
logfile:存放log的文件路径
exactarch:是否精确匹配平台,默认是1,精确匹配平台
obsolete:这个选项仅仅会影响升级,简单的说相当于upgrade,允许更新旧版本的rpm包
gpgcheck:是否经验安装包的来源合法性
plugins:是否允许使用插件安装插件,1表示安装
installonly_limit:允许同时保持的内核包
bugtracker_url:bug的追踪的url
distroverpkg:指定一个软件包,yum会根据这个包判断你的发行版本,这里是centos-release
具体的可以是使用命令man yum.conf查看
下面我们来看一下/etc/yum.repos.d/下的文件
[root@localhost ~]# ls /etc/yum.repos.d/ CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo CentOS-CR.repo CentOS-fasttrack.repo CentOS-Sources.repo
这里就有很多以repo结尾的文件,都是yum repository的指向:
让我们来看一下/etc/yum.repo.d/CentOS-Base.repo,其他里面的yum repository都是disable的:
# CentOS-Base.repo # # The mirror system uses the connecting IP address of the client and the # update status of each mirror to pick mirrors that are updated to and # geographically close to the client. You should use this for CentOS updates # unless you are manually picking other mirrors. # # If the mirrorlist= does not work for you, as a fall back you can try the # remarked out baseurl= line instead. # # [base] name=CentOS-$releasever - Base mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra #baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 #released updates [updates] name=CentOS-$releasever - Updates mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra #baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 #additional packages that may be useful [extras] name=CentOS-$releasever - Extras mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra #baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 #additional packages that extend functionality of existing packages [centosplus] name=CentOS-$releasever - Plus mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra #baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/ gpgcheck=1 enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 CentOS-Base.repo
repository指向的定义: