搭建 yum 服务器

Posted by feizaipp on March 6, 2019

我的博客

YUM(Yellowdog Updater Modified) 是一个基于 RPM 的软件包管理器,能够从指定服务器自动下载RPM包并且安装,可以处理软件之间的依赖关系,一次性安装所有依赖的软件包,无需一个个下载安装。包管理器大大提高了 CentOS 操作系统的易用性。本文首先介绍 yum 的原理,之后介绍如何在本地和远程搭建源服务器。

1. yum 运行原理

使用过 CentOS 操作系统的人不会对 yum install *** 这个命令陌生,因为你一定使用过这个命令安装程序。这个 yum 命令就是包管理器的客户端,那么 yum 客户端都做了哪些事情呢?回忆一下,是不是执行 yum 命令时,提示你安装这个程序需要安装不止一个包,这是因为你安装这个包需要安装依赖,最后要你确认是否安装这个程序和相关的依赖,你输入 y 后才开始安装。这些依赖关系又是怎么得来的?这就是 yum 服务器要干的事情了, yum 服务器不但要提供可下载的安装程序,还要提供这个安装程序需要的依赖关系。那么 yum 客户端怎么知道要找哪个服务器呢?这就需要配置 yum 客户端,告诉它去哪个地址下载要安装的程序,并且找出依赖关系,顺便把依赖的包也下载并安装。

1.1. yum 客户端配置

yum 客户端的配置都在 /etc/yum.repo.d 目录下。把所有的源仓库的配置都添加到这个目录下,执行 yum 时就会从对应的仓库去下载程序。创建源仓库的格式如下所示:

[Repository_ID] #仓库的 ID ,可以取任意名字,只要不和其他的 ID 冲突即可
name=… #仓库的描述信息,长短不限,可以有空格,但是必不可少
baseurl=url #告诉 yum 客户端,通过哪种路径可以访问到
enabled={1|0} #是否启用这个仓库, 0 表示不启用, 1 表示启用,默认是启用的
gpgcheck=1{1|0} #是否进行签名合法性检测, 0 表示不启用, 1 表示启用,默认启用。如果选择启用 gpg 检查,则需要告知其key是什么
gpgkey=url #如果启用 gpg 检测,则需要指定 gpgkey 的路径,即使导入过 gpgkey ,这里仍然需要手动为其指定路径,这个路径可以是远程服务器上的,也可以是本地的,只要让本地客户端访问到即可
cost=1000 #访问的代价,定义了 cost 的,且数字较小的,会被优先访问。如果两个仓库里的 RPM 包是一样的,一个在远程服务器上,另一个在本地光盘上,那么本地光盘的访问速度通常会快于远程服务器上。在配置文件中,我们可以定义这样的两个仓库,为其中一个设定优先级

1.2. yum 服务器段配置

yum 服务器可以搭建到本地也可以搭建到远程服务器中。

1.2.1. 搭建本地 yum 服务

将 CentOS 官方的 iso 镜像当作本地服务器的源。首先将 iso 文件挂载到 /mnt/centos 目录下,目录不存在要先创建目录:

mkdir /mnt/centos
mount -o loop CentOS-7-x86_64-DVD-1708.iso /mnt/centos

然后进入 /etc/yum.repo.d 目录,将当前目录的内容备份,创建一个新的源:

cd /etc/yum.repos.d #进入repo目录
mkdir repoback #新建备份目录
mv C*.repo repoback #将原始repo文件移动至备份目录

创建, 并将以下内容放到文件中:

vi CentOS-new.repo
[base]
name=centos-iso
baseurl=file:///mnt/centos #ISO文件挂载目录
gpgcheck=0 #由于是本地源,不需要检查
enable=1

测试:

yum clean all
yum list | grep centos-iso

1.2.2. 搭建远程 yum 服务

由于没有另一台主机作为远程 yum 服务器,我把 yum 服务器部署在本地。首先,安装 httpd 。安装 httpd 时,可以用我们刚才搭建好的本地 yum 源,执行 yum install httpd ,安装时会安装依赖 httpd-tools 和 mailcap 两个包。检查安装程序的版本,与我们搭建的本地源里的程序的版本是一致的。

修改配置文件:

打开 /etc/httpd/conf/httpd.conf 文件,修改 DocumentRoot 项,改为自定义的目录,客户端通过 http 协议访问到服务器的这个目录。

DocumentRoot “/var/www/centos/7/x86_64/Packages”

将 rpm 包拷贝到目录 "/var/www/centos/7/x86_64/Packages" 。使用 createrepo 命令,创建依赖关系,执行如下命令:

createrepo -p -d -o ${dir1} ${dir2}

${dir1} 是创建 repodata 文件夹的位置(-o选项即为:将 repodata 目录创建在此处); ${dir2} 为 rpm 软件包所在位置;每次添加软件包后都应重新生成依赖。以当前的配置来说,创建 repodata 的命令为:

cd /var/www/centos/7/x86_64/Packages
createrepo -p -d -o . .

再次修改 CentOS-new.repo ,增加如下内容:

[remote]
name=http
baseurl:http://11.12.115.111
gpgcheck=0
enable=1

测试:

yum clean all
yum makecache

往 /var/www/centos/7/x86_64/Packages 目录拷贝一个 rpm 包, 使用 createrepo 命令重新生成依赖,然后执行 rpm install 安装。

这时本机已经可以通过 yum 命令下载 RPM 包安装了。当我把它部署到局域网时报了 "Failed connect to 11.12.115.111:80; 没有到主机的路由" 错误。上网上搜索了一下,是因为 yum 服务器的防火墙拦住了 80 端口。最简单的解决办法是关闭 yum 服务器的防火墙: systemctl stop firewalld.service 。高级一点的办法是设置路由,使用如下两条命令:

firewall-cmd –zone=public –add-port=80/tcp –permanent
firewall-cmd –reload

好了,到此为止 yum 服务器已经成功搭建完成,可以适配软件包并供公司其他同事使用了。