1 前言

我们曾经介绍过 Linux软件安装和包管理工具,其中提到 前端工具安装,比如 yum是CentOS系列npm软件包安装的前端工具,apt-get是Ubuntu系列dpkg软件包安装的前端工具。同时引入了软件仓库的概念,这样进行软件安装的时候,就不需要将软件安装包下载到本地,而是直接由前端工具去软件仓库中去获取。我们在 Ubuntu软件仓库 中介绍了 Ubuntu 的软件包安装源。这次我们就来介绍一下CentOS的软件仓库。

2 配置文件

CentOS的yum工具文件分别是 /etc/yum.conf, /etc/yum.repos.d/, /etc/yum/。这部分主要是展示:

  • /etc/yum.conf  的 [main]  部分设置全局的Yum选项;
  • /etc/yum.conf[repository]部分 以及 /etc/yum.repos.d/  的各个  .repo文件中 设置每个仓库的选项;
  • 使用 /etc/yum.conf  文件中的变量 以及   /etc/yum.repos.d/  目录中的文件,这样不同的系统版本和架构可以动态地进行处理 ;
  • 在命令行 添加,打开 和 禁用 Yum仓库;
  • 设置你自己定制的 Yum仓库;

2.1 /etc/yum.conf

这个文件必须有一个 main部分 去设置一些在全局生效的选项,也可以包含一个或多个 repository部分 来设置 仓库相关的选项。当然,还是推荐你在 /etc/yum.repos.d 目录下 用多个.repo文件来进行设置。在 /etc/yum.conf 文件中的 repository部分 将会覆盖 main部分 的同名设置。

[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=16&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release

#  This is the default, if you make this bigger yum won't see if the metadata
# is newer on the remote and so you'll "gain" the bandwidth of not having to
# download the new metadata and "pay" for it by yum not having correct
# information.
#  It is esp. important, to have correct metadata, for distributions like
# Fedora which don't keep old packages around. If you don't like this checking
# interupting your command line usage, it's much better to have something
# manually check the metadata once an hour (yum-updatesd will do this).
# metadata_expire=90m

# PUT YOUR REPOS HERE OR IN separate files named file.repo
# in /etc/yum.repos.d

以下是 main部分 最常用的一些选项:

2.1.1 assumeyes=value

假定为是。当yum执行一些关键操作时,如果假定为是,则不弹出提示确认消息,就像在命令行中使用 -y 选项时一样。

0 — 对关键操作弹出确认信息。默认值。

1  — 对关键的yum动作不弹出确认信息。
 
2.1.2  cachedir=directory

值是一个绝对路径,指示 Yum应该在哪个目录保存它的缓存和数据库文件。默认地,Yum 的缓存目录是 /var/cache/yum/$basearch/$releasever。其中的变量如下(原文):

  • $basearch:这个是指系统的基础架构(base-architecture),例如i586和i686都有i386的基础架构,AMR64和Intel 64有x86_64的基础架构。
  • $releasever:这个是指Red Hat企业版Linux的发行版本(release-version)。yum会从 /etc/yum.conf中的 distroverpkg=value 的这行去获取 $releasever 的值。如果没有这行,yum会从Red Hat的发行包中获取相对应的值。
  • $arch:这个变量是指CPU架构,例如i586,i686,x86_64等。 
  • $YUM0-9:这10个变量将分别被shell环境中的同名变量的值所替代。如果这些变量中的任意一个被引用了,而在shell环境中不存在同名变量,那么这个配置文件中的变量将不会被替代。

其中 basearch 可通过arch命令获取到

arch
x86_64

我的 releasever 指向的是 distroverpkg=centos-release,也就是 centos的发行版本。可通过以下命令查询到

cat /etc/issue
cat /etc/redhat-release
cat /etc/centos-release

CentOS release 6.3 (Final)

也就是说,我的缓存目录是 /var/cache/yum/x86_64/6.3,实际上是 /var/cache/yum/x86_64/6,只使用了大版本号。

2.1.3 debuglevel=value

一个1-10之间的整数。设置一个高debuglevel值时,yum会展示更多详细的debug输出。为0时,将会禁止debug输出,2是默认值。

2.1.4  exactarch=value 
 
0  — 当更新软件包时,不考虑具体的系统架构。
1  — 当更新软件包时,考虑具体的系统架构进来。此时,如果系统中已装了 i386软件包,yum就不会去安装一个 i686的软件包。 此值为默认值。
 
2.1.5  exclude=package_name [more_package_names]

这个选项允许你在安装和更新过程中,通过关键词排除相关软件包。可通过使用空格分割来列举多个软件包。也可使用通配符 (例如 *  ?)。

2.1.6gpgcheck=value

值包含:
0  — 在所有仓库中 禁用 GPG 签名确认,包括本地软件包安装。
1  — 在所有仓库中 启用 GPG 签名确认,包括本地软件包安装。此值为默认值。
 
如果在   /etc/yum.conf  文件的 [main]  部分中设置了此值,将对所有仓库生效。当然你也可以在每个仓库中进行单独设置。因此,你可以在某个A仓库中启用,而在B仓库中禁用。更多 GPG 前面校验的,请参考 原文
 
2.1.7  groupremove_leaf_only=value
 
0    当卸载一个软件包时, yum  不检查每个软件包的依赖关系。为此值时,将会把软件包组内的所有软件进行卸载,而不管这些软件包是否被其他软件包或软件包组所需要。此值为默认值。
1 — 当卸载一个软件包时, yum 检查每个软件包的依赖关系。只卸载没有被其他软件包或软件包组所需要的软件包。
 
更多信息参考原文
 
2.1.8  installonlypkgs=space separated list of packages
通过此选项,可以指定 yum 能安装但是不会更新的软件包清单,多个软件包之间用空格隔开。可以查看 yum.conf 手册来获取默认清单。特别地,内核的软件包应该永远被放在这个选项中,而且   installonly_limit  值应该永远大于2,这样即便默认内核启动失败,备用的内核也可用。
 
2.1.9 installonly_limit=value

installonlypkgs指令清单中的单个软件包,可以被同时安装的版本个数的最大值。

 installonlypkgs 指令的默认值包含了若干不同的内核软件包,所以要注意,改变 installonly_limit 的值也将影响已安装的内核软件包的最大值。/etc/yum.conf 中的默认值 installonly_limit=3,而且不推荐减少此值,特别是把它设于2以下。 

2.1.10keepcache=value

是否保留缓存:
0  — 安装成功后,不保留头文件和软件包的缓存。此值为默认值。
1  — 安装成功后,保留缓存。
 
2.1.11 logfile=file_name

日志文件的路径,绝对地址。 默认值为 /var/log/yum.log.

2.1.12 multilib_policy=value

多仓库策略:
best  —选择安装本系统的最佳选择的架构的软件包。例如,当 ARM64系统设置此值时,yum将安装64位的软件包。
all  — 为每个软件包安装每种可能得架构软件包。例如,当 ARM64系统设置此值时,如果 i686 和 ARM64版本的软件包都可用时,两者都会被安装。
 
2.1.13  obsoletes=value
 
0  — 当执行更新时,禁用淘汰处理逻辑。
1  — 当执行更新时,启用淘汰处理逻辑。当一个软件包在它指定的文件中声明它会淘汰其他软件包时,当前者安装时,后者将会被前者所替代。例如当安装包变更名称时,淘汰值就会进行设置。默认值为1。
 
2.1.14  plugins=value
 
0  — 全局性地禁用所有Yum插件。不建议禁用所有插件,因为某个特定的插件提供了重要的 yum服务。特别是   rhnplugin  提供了 RHN Classic, 而   product-id    subscription-manager  插件 提供了基于认证的   Content Delivery Network  (CDN) 支持。全局性地禁用插件只是一个方便的选项,通常只在忽略Yum的潜在问题时才推荐使用。
1  — 全局性地启用Yum插件。当设为此值时,你仍然可以在单个插件的配置文件中将其设置为0。  更多关于 Yum插件的信息,请参考此处。关于控制插件的信息,参考此处
 
2.1.15  reposdir=directory
.repo  文件存放的绝对路径。所有的 .repo  文件包含仓库信息(类似于   /etc/yum.conf文件中的 [repository]  部分)。yum将会从这些   .repo  文件 和  /etc/yum.conf文件中的 [repository]  部分获取信息,并创建一个仓库的主列表。如果没有设置此项,  yum  将使用默认值   /etc/yum.repos.d/
 
2.1.16  retries=value
 
值为大于等于0的整数。此值设置了 yum 在返回错误之前,尝试搜索文件的次数。设为0时,yum将一直重试。默认值为10。
 

2.2 /etc/yum.repos.d/

这就是存放yum仓库文件的目录,里面存放的都是 .repo 为后缀的文件,其中就有 CentOS-Base.repo 和 yum.repo,前者就是我们正使用的仓库。

内容如下:

# 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
baseurl=http://mirrors.baidu.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

#released updates
[updates]
name=CentOS-$releasever - Updates
# mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
baseurl=http://mirrors.baidu.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
# mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
baseurl=http://mirrors.baidu.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
# mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus
baseurl=http://mirrors.baidu.com/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib
# mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=contrib
baseurl=http://mirrors.baidu.com/centos/$releasever/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

可以看到:

  • mirrorlist 原本是官方的 mirrorlist.centos.org,提示说:如果mirrorlist不起作用,可以使用baseurl进行替代,这里用的是百度的。
  • 有base,updates,extras,centosplus,contrib五个配置,分别代表 基本的、更新的、额外可用的、已有包的扩展功能包、CentOS用户贡献的包。

2.3 /etc/yum

主要是一些配置

├── aliases.conf
├── pluginconf.d
│   ├── aliases.conf
│   ├── downloadonly.conf
│   ├── fastestmirror.conf
│   ├── priorities.conf
│   └── security.conf
├── protected.d
├── vars
└── version-groups.conf

其中fastestmirror的内容如下

[main]
enabled=1
verbose=0
always_print_best_host = true
socket_timeout=3
#  Relative paths are relative to the cachedir (and so works for users as well
# as root).
hostfilepath=timedhosts.txt
maxhostfileage=10
maxthreads=15
#exclude=.gov, facebook
#include_only=.nl,.de,.uk,.ie

是对最快镜像的一些设置,例如socket超时时间,域文件地址(与cachedir的相对路径),最大的域文件有效期时长(10天),最大线程数。

3 国内源

更多可参考官网:https://mirror-status.centos.org/#cn

4 替换仓库文件

有时候我们需要使用国内源时,以阿里云为例,可以这样操作:

4.1 备份

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

4.2 下载新.repo文件

wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-6.repo
或者
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-6.repo

注意这里用的是Centos6的文件,你可以参照自己的系统下载相对应的文件。

4.3 yum clean all 清除缓存

4.4 yum makecache 生成缓存

5 修改仓库地址

当我们在使用新仓库文件时,遇到以下报错

http://mirrors.aliyun.com/centos/6/os/x86_64/repodata/repomd.xml: [Errno 14] PYCURL ERROR 22 - "The requested URL returned error: 404"
Trying other mirror.
http://mirrors.aliyuncs.com/centos/6/os/x86_64/repodata/repomd.xml: [Errno 12] Timeout on http://mirrors.aliyuncs.com/centos/6/os/x86_64/repodata/repomd.xml: (28, 'connect() timed out!')
Trying other mirror.
http://mirrors.cloud.aliyuncs.com/centos/6/os/x86_64/repodata/repomd.xml: [Errno 14] PYCURL ERROR 6 - "Couldn't resolve host 'mirrors.cloud.aliyuncs.com'"
Trying other mirror.
Error: Cannot retrieve repository metadata (repomd.xml) for repository: base. Please verify its path and try again

所请求的URL返回404,没有找到相关文件。

观察到,这里是读取了 .repo 配置文件中 baseurl,发行版本为6,架构为x86_64,所以整体就是上面报错日志中所描述的URL。

[base]
name=CentOS-$releasever - Base - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/os/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-6

我们可以先到相应的仓库网站上看看,例如这里的 http://mirrors.aliyun.com/centos/,进到6的目录里,发现确实没有找到相应的文件。

而在7里面是存在的

所以我们可以通过修改仓库文件的地址,也就是 baseurl 配置。

sudo vi /etc/yum.repos.d/CentOS-Base.repo
:%s/$releasever/7/g #将文件中$releasever全部改成7
yum clean all && yum makecache # 清除缓存 并 生成缓存

再次执行就成功了。

04-16 22:34