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动作不弹出确认信息。 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是默认值。
exactarch
=value 0
— 当更新软件包时,不考虑具体的系统架构。 1
— 当更新软件包时,考虑具体的系统架构进来。此时,如果系统中已装了 i386软件包,yum就不会去安装一个 i686的软件包。 此值为默认值。 exclude
=package_name [more_package_names] 这个选项允许你在安装和更新过程中,通过关键词排除相关软件包。可通过使用空格分割来列举多个软件包。也可使用通配符 (例如 *
和 ?
)。
2.1.6gpgcheck
=value
0
— 在所有仓库中 禁用 GPG 签名确认,包括本地软件包安装。 1
— 在所有仓库中 启用 GPG 签名确认,包括本地软件包安装。此值为默认值。 /etc/yum.conf
文件的 [main]
部分中设置了此值,将对所有仓库生效。当然你也可以在每个仓库中进行单独设置。因此,你可以在某个A仓库中启用,而在B仓库中禁用。更多 GPG 前面校验的,请参考 原文。 groupremove_leaf_only
=value 0
— 当卸载一个软件包时, yum
不检查每个软件包的依赖关系。为此值时,将会把软件包组内的所有软件进行卸载,而不管这些软件包是否被其他软件包或软件包组所需要。此值为默认值。 1
— 当卸载一个软件包时, yum
检查每个软件包的依赖关系。只卸载没有被其他软件包或软件包组所需要的软件包。 installonlypkgs
=space separated list of packages installonly_limit
值应该永远大于2,这样即便默认内核启动失败,备用的内核也可用。 installonly_limit
=value 在installonlypkgs
指令清单中的单个软件包,可以被同时安装的版本个数的最大值。
installonlypkgs
指令的默认值包含了若干不同的内核软件包,所以要注意,改变 installonly_limit
的值也将影响已安装的内核软件包的最大值。/etc/yum.conf
中的默认值 installonly_limit=3
,而且不推荐减少此值,特别是把它设于2以下。
2.1.10keepcache
=value
0
— 安装成功后,不保留头文件和软件包的缓存。此值为默认值。 1
— 安装成功后,保留缓存。 logfile
=file_name 日志文件的路径,绝对地址。 默认值为 /var/log/yum.log
.
2.1.12 multilib_policy
=value
best
—选择安装本系统的最佳选择的架构的软件包。例如,当 ARM64系统设置此值时,yum将安装64位的软件包。 all
— 为每个软件包安装每种可能得架构软件包。例如,当 ARM64系统设置此值时,如果 i686 和 ARM64版本的软件包都可用时,两者都会被安装。 obsoletes
=value 0
— 当执行更新时,禁用淘汰处理逻辑。 1
— 当执行更新时,启用淘汰处理逻辑。当一个软件包在它指定的文件中声明它会淘汰其他软件包时,当前者安装时,后者将会被前者所替代。例如当安装包变更名称时,淘汰值就会进行设置。默认值为1。 plugins
=value 0
— 全局性地禁用所有Yum插件。不建议禁用所有插件,因为某个特定的插件提供了重要的 yum服务。特别是 rhnplugin 提供了 RHN Classic
, 而 product-id 和 subscription-manager 插件 提供了基于认证的 Content Delivery Network
(CDN) 支持。全局性地禁用插件只是一个方便的选项,通常只在忽略Yum的潜在问题时才推荐使用。 reposdir
=directory .repo
文件存放的绝对路径。所有的 .repo
文件包含仓库信息(类似于 /etc/yum.conf
文件中的 [repository]
部分)。yum将会从这些 .repo
文件 和 /etc/yum.conf
文件中的 [repository]
部分获取信息,并创建一个仓库的主列表。如果没有设置此项, yum
将使用默认值 /etc/yum.repos.d/
。 retries
=value 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 国内源
- 百度:http://mirrors.baidu.com/file/centos/
- 阿里:http://mirrors.aliyun.com/centos/
- 网易:http://mirrors.163.com/centos/
- 清华:https://mirrors.tuna.tsinghua.edu.cn/centos/
- 上交:http://ftp.sjtu.edu.cn/centos/
更多可参考官网: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 # 清除缓存 并 生成缓存
再次执行就成功了。