CentOS自建yum仓库

4,589 阅读5分钟

由于后面工作中可能会遇到服务器在无公网的情况下使用,那么这个时候就可能需要在本地搭建私有yum仓库了。正好趁着周末学习一下如何搭建,以下是我学习自建yum仓库的笔记。

服务端设置

安装Nginx

这里我默认大家都会编译安装Nginx,所以使用yum的方式安装以减少文章篇幅。

  • 添加Nginx源
# rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
  • 安装Nginx
# yum -y install nginx
  • 启动Nginx
# systemctl start nginx
# systemctl enable nginx
  • 添加mirrors.conf
# vim /etc/nginx/conf.d/mirrors.conf

内容如下:

server {
    listen 80 default_server;
    server_name _;

    location / {
        # 仓库文件路径
        root /opt/aliyun-mirrors/;
        # 开启目录显示功能
        autoindex on;
        # 关闭详细文件大小统计,默认为b,以kb、mb、gb为单位显示
        autoindex_exact_size off;
        # 开启以服务器时区显示文件修改日期
        autoindex_localtime on;
        # 以html风格将目录展示在浏览器中
        autoindex_format html;
        charset utf-8,gbk;
    }
}
  • 重载配置
# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# nginx -s reload

搭建yum仓库

使用Everything版本ISO搭建

Everything版本的ISO镜像文件相对rpm包要丰富一些,且使用ISO镜像来搭建仓库是比较方便快捷的。

  • 上传iso镜像文件至服务器
  • 创建挂载路径
# mkdir /mnt/centos7-iso
  • 挂载iso镜像
# mount -o loop -t iso9660 /tmp/CentOS-7-x86_64-Everything-1908.iso /mnt/centos7-iso/
mount: /dev/loop0 is write-protected, mounting read-only
# echo "/tmp/CentOS-7-x86_64-Everything-1908.iso /mnt/centos7-iso/ iso9660 defaults 0 0" >> /etc/fstab

挂载完成,使用方法见下方

使用阿里云镜像站搭建本地仓库

安装必备工具

  • createrepo 命令用于创建yum源(软件仓库),即为存放于本地特定位置的众多rpm包建立索引,描述各包所需依赖信息,并形成元数据
  • reposync 命令是一个python脚本。包含在yum-utils包中。因此,我们如果要使用reposync命令的时候,需要安装yum-utils包。
# yum -y install createrepo yum-utils

获取阿里云镜像站配置文件

# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

创建存储仓库路径

# mkdir -p /opt/aliyun-mirrors/centos/7/os/{base,extras,updates}

使用reposync同步镜像到本地,命令格式:reposync -r 仓库名(一般为base) -p 目标目录

# reposync -r base -p /opt/aliyun-mirrors/centos/7/os/
# reposync -r extras -p /opt/aliyun-mirrors/centos/7/os/
# reposync -r updates -p /opt/aliyun-mirrors/centos/7/os/

创建yum仓库

# createrepo /opt/aliyun-mirrors/centos/7/os/base/
# createrepo /opt/aliyun-mirrors/centos/7/os/extras/
# createrepo /opt/aliyun-mirrors/centos/7/os/updates/

至此镜像同步完成,现在配置nginx提供外部访问即可,配置文件如上述nginx部署中配置文件,修改本地仓库地址为你所创建地址即可,访问浏览器如下界面

rsync同步镜像站使用

慎用!因为文件总量很大,会占用服务器较多资源,并且由于流量过大可能会封IP,如非必要请尽量避免使用该方式

同步脚本如下:

#!/bin/bash
kill -9 $(ps -aux | grep rsync | grep -v grep | awk '{print $2}')
# 待同步仓库
repos=("centos" "epel" "ceph")
# repo存储路径
mirrorsdir="/opt/mirrors/"
# 中科大镜像站rsync地址
# URL="rsync://rsync.mirrors.ustc.edu.cn/repo/"
# 清华大学镜像站rsync地址
URL="rsync://mirrors.tuna.tsinghua.edu.cn/"
if [ ! -d "${mirrorsdir}" ]; then
    echo "创建镜像仓库路径:${mirrorsdir}"
    mkdir -p ${mirrorsdir}
fi
# 同步仓库
for repo in ${repos[@]}; do
    if [ ! -d "${mirrorsdir}/${repo}" ]; then
        echo "创建${repo}镜像仓库路径"
        mkdir -p ${mirrorsdir}/${repo}
    fi
    echo "开始同步${repo}相关镜像文件"
    rsync -avzPH --delete ${URL}${repo}/ ${mirrorsdir}${repo}/
done

保存脚本后直接执行即可,同步完成后可以在浏览器看到相应的文件列表

客户端设置

使用ISO文件后设置

如果单机使用,则在/etc/yum.repos.d/CentOS-Base.repobaseurl的值为file:///仓库文件路径,提供给局域网其他服务器的话需要使用Nginx或者Apache,并且baseurl的值为仓库服务器的IP或者域名

以下为客户端修改repo的脚本,使用时修改仓库地址及IP部分即可

#!/bin/bash
# 自建仓库IP
repoIP="10.100.5.80"
echo "添加域名解析到hosts文件"
cat /etc/hosts | grep ${repoIP}
if [ $? == 1 ]; then
    echo "${repoIP} mirrors.akiya.org" >>/etc/hosts
    echo "备份CentOS-Base.repo"
    mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
    echo "写入自建源repo配置文件"
    cat >/etc/yum.repos.d/CentOS-Base.repo <<EOF
[akiya-mirror]
name=CentOS-$releasever - Base
# 如果是本地仓库则填写本地文件路径即可
# 注意:file:///是三斜线,一定要记住路径不能写错,写错你就走远了,老弟
baseurl=file:///mnt/centos7-iso/
# 远程仓库则填写对应的远程仓库地址
# baseurl=http://mirrors.akiya.org/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
EOF
    yum clean all
    yum repolist
fi

保存并执行脚本后可以看到已有我们的自建源了。

# yum repolist
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
repo id                                                               repo name                                                               status
akiya-mirror                                                          CentOS- - Base                                                          10,097
repolist: 10,097

可以看到我们安装软件的时候Repository显示为我们自己设置的akiya-mirror

使用阿里云同步后设置

使用下述脚本,修改domain值为仓库所在服务器的IP域名即可。

#!/bin/bash
# 自建仓库IP
repoIP="10.100.5.80"
domain="mirrors.akiya.org"
echo "添加域名解析到hosts文件"
cat /etc/hosts | grep ${repoIP}
if [ $? == 1 ]; then
    echo "${repoIP} ${domain}" >>/etc/hosts
    echo "备份CentOS-Base.repo"
    mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
    echo "写入自建源repo配置文件"
    cat >/etc/yum.repos.d/CentOS-Base.repo <<EOF
[base]
name=CentOS-\$releasever - Base - ${domain}
failovermethod=priority
baseurl=http://${domain}/centos/\$releasever/os/base/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#released updates
[updates]
name=CentOS-\$releasever - Updates - ${domain}
failovermethod=priority
baseurl=http://${domain}/centos/\$releasever/os/updates/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that may be useful
[extras]
name=CentOS-\$releasever - Extras - ${domain}
failovermethod=priority
baseurl=http://${domain}/centos/\$releasever/os/extras/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
EOF
    yum clean all
    yum repolist
fi

使用rsync同步后设置

使用此方法自建源后/etc/yum.repos.d/CentOS-Base.repo修改内容请参考中科大CentOS 源使用帮助,把baseurl的域名替换为你自建仓库服务器的IP或者域名即可。

总结

使用iso镜像:

  • 体积:CentOS-7-x86_64-Everything-1908.iso大小约(10098):11GB
  • 优点:方便已携带,整体由单一iso文件,既可以安装操作系统又能挂载用作本地yum仓库
  • 缺点:rpm包版本可能存在老旧问题,无法获取到较新版本

使用reposync同步阿里云等镜像仓库对应发行版本:

  • 体积:CentOS7 1908约:base(10097):9.8GB;extras(305):408MB;updates(680):5.5GB;合计:16GB
  • 优点:包版本为当前同步时最新官方仓库版本
  • 缺点:仓库需要联网才能完成同步与更新

使用rsync同步完整仓库:

  • 体积:🤣原谅我同步了20多个小时被封了IP,于2019-10-26未同步完成。目前已经下载了150GB,估计CentOS相关仓库文件用500G磁盘应该够了
  • 优点:完整的镜像站克隆
  • 缺点:整体体积过大,不利于同步、复制、转存内网