前言

yum仓库,是一个集中的大数据库,存放两块重要的内容

  1. 存放所有的rpm软件包(安装包或依赖包)
  2. 仓库包的元数据(包的描述信息-版本-制作者、存放包和包之间的依赖性等一些信息)

yum/dnf 工作原理

  • yum/dnf 是基于C/S 模式
  • yum 服务器存放rpm包和相关包的元数据库
  • yum 客户端访问yum服务器进行安装或查询等

实现过程 :
先在yum服务器上创建 yum repository(仓库),在仓库中事先存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录repodata下),当yum客户端利用yum/dnf工具进行安装时包时,会自动下载repodata中的元数据,查询元数据是否存在相关的包及依赖关系,自动从仓库中找到相关包下载并安装。

yum服务器的仓库可以多种形式存在:

  1. file:// 本地路径
  2. http:// 网络
  3. https:// 网络
  4. ftp:// 网络
    注意:yum仓库指向的路径一定必须是repodata目录所在目录(repodata其实存放仓库软件包的元数据的地方\记录了包之间的依赖性以及包的描述信息)

yum客户端配置

/etc/yum.conf 为所有仓库提供公共配置
/etc/yum.repos.d/*.repo:为每个仓库的提供配置文件

CentOS7 yum配置文件常用选项讲解

范例:CentOS7的配置文件

[extras]

# 是否检查软件包签名 1为启用 0为不起用
gpgcheck=1   
#签名秘钥地址
gpgkey=http://mirrors.tencentyun.com/centos/RPM-GPG-KEY-CentOS-7

#是否启用该仓库 1为启用 0为不起用
enabled=1  

#/URL访问路径(须指定到repodate数据文件夹的上级目录)
baseurl=http://mirrors.tencentyun.com/centos/$releasever/extras/$basearch/ 

#仓库名称 可以自定义
name=Qcloud centos extras - $basearch  

yum工具管理软件包

在CentOS 7 服务器中,yum工具是最常用的YUM客户端工具,由默认安装的yum-3.4.3-150.el7.centos.noarch软件包提供。

yum-config-manager命令
可以生成yum仓库的配置文件及启用或禁用仓库,来自于yum-utils包
格式:

#增加仓库 
yum-config-manager --add-repo URL或file  

#禁用仓库 
yum-config-manager --disable “仓库名"  

#启用仓库 
yum-config-manager --enable “仓库名”

可以使用yum repolist [all|enabled|disabled]查看仓库启用情况

为CentOS7用系统安装光盘作的本地yum仓库

#挂载光盘至某目录,如/mnt/cdrom 
mount /dev/cdrom /mnt/cdrom 

#创建配置文件 
[root@mirror ~]#vim /etc/yum.repos.d/centos.repo 
[CentOS7] name=CentOS 7 
baseurl=file:///mnt/cdrom 
gpgcheck=0 
enabled=1

注意:CentOS8与之前的版本不同,CentOS 8 系统有两个yum 源:BaseOS和AppStream ,需要分别设置两个仓库 (Appstream存放额外的软件包,BaseOS存放操作系统核心包)

CentOS8制作的EPEL源仓库

Epel (extra packages for enterprise linux)源存放第三方红帽公司经过测试适合企业使用的仓库含有大量的包,它比我们光碟镜像自带的包多的多,增加许多非常丰富的工具

[root@mirror yum.repos.d]# cat epel.repo 
[Epel]
name=Epel

#华为开源镜像网络路径,注意选择对的版本和平台 也可以通过网络路径夹带变量$releasever(系统版本)$basearch(平台)配置的yum仓库
baseurl=https://repo.huaweicloud.com/epel/8/x86_64/  

gpgcheck=0

enabled=1

实现私用 yum仓库–epel镜像仓库

1. 首先安装nginx (此处使用yum安装 过程略过)

 yum install nginx -y

2. 创建项目目录

mkdir -p /www/html/centos/8/epel/

3. 下载阿里云或华为云的Epel仓库到包本地做局域网仓库

①、首先本地主机配置好Epel源仓库,以华为Epel为例子

[root@mirror /]# cat /etc/yum.repos.d/epel.repo 
[Epel]
name=Epel
baseurl=https://repo.huaweicloud.com/epel/8/x86_64/
gpgcheck=0
enabled=1

②. 通过yum repolist all 可以到设置的源的repo id

    [root@yum /]# yum repolist all
    Loaded plugins: fastestmirror
    Loading mirror speeds from cached hostfile
    repo id                                               repo name                                          status
    Epel                                                  Epel                                               enabled: 13,580

③、下载华为epel源的所有rpm包并且下载meta

 #CentOS 8 dnf 工具集成 
 dnf reposync --help #查看帮助 

 #默认只下载rpm包,不下载meta数据,需要指定--download-metadata 才能下载meta 
 dnf  reposync  --repoid=Epel  --download-metadata -p /www/html/centos/8/epel #指定源repoid进行仓库源同步 -p指定同步路径(按自己需求修改)

 #CentOS 7 以前版本,reposync工具来自于yum-utils包 
 reposync --repoid=REPOID --download-metadata -p /path  

4. 添加nginx 子配置文件

vim /etc/nginx/conf.d/yum.conf
#添加以下内容
    server {
       listen       80;    #  修改要监听的端口
       server_name  10.10.10.254;
       charset utf-8;                        #设置中文字符集
       location / {
   		autoindex  on;        # 打开目录浏览
           autoindex_exact_size off;         #关闭字节显示(会以MB的方式显示)
           root   /www/html/centos;       # 这里请换成你的实际目录路径
           index  index.html index.htm;
       }
   }

5. nginx 启动并设置开机自启并测试

注意:关闭selinux、防火墙 (或者放行指定端口)
nginx -t 检查nginx配置文件是否正确
systemctl enable --now nginx   #启动并设置开机自启

通过http://10.10.10.254/centos/8/epel进行访问

客户端配置好yum配置文件即可使用例如

[Epel]
name=Epel
baseurl=https://10.10.10.254/centos/8/epel/
gpgcheck=0
enabled=1

6、 定时同步

用repoync 命令,reposync用于将远程yum存储库同步到本地存储库.(centos7 需要yum-utils包,centos8 集成 dnf reposync )

  • -n: 只下载最新的包
  • -p: 下载包的路径:默认为当前目录
vim /home/scripts/yum_update.sh

#!/bin/bash
echo 'Updating  Source'
DATETIME=`date +%F_%T`
exec > /var/log/repo_$DATETIME.log
dnf  reposync  --repoid=Epel  --download-metadata -np /www/html/centos/8/epel &>/dev/null
if [ $? -eq 0 ];then
    echo "SUCESS: $DATETIME aliyum_yum update successful" >>/var/log/repo_$DATETIME.log
else
    echo "ERROR: $DATETIME aliyum_yum update failed" >> /var/log/repo_$DATETIME.log
fi


#设定定时任务
crontab -e
30 1 * * 6 /bin/bash /home/scripts/yum_update.sh &>/dev/null

最后

如果为自建yum仓库为手动获取的RPM软件 (无repodata元数据)
每次添加rpm包到仓库时都要执行一遍(createrepo依赖于createrepo包)

 cd /www/html/centos/8/epel// #进入rpm包所在的目录
 createrepo .