基于CentOS8搭建双系统本地仓库

基于centOS8搭建可供centOS7和centOS8共同使用的本地化仓库。

基础环境

  • CentOS 8.3.2011 minimal
  • reposync
  • 由于存放在home目录,所以使用普通用户权限
  • CentOS 7 的base+updates+extras大约30G
  • CentOS 8 baseos+appstream大约18G

本次环境将使用CentOS8来搭建可供CentOS7和CentOS8都可以使用的基础仓库与软件仓库,为了区别存放,需要先对目录结构进行规划,由于目录结构和repoid有关联性,所以repoid和repo文件名也得做些区别;

关闭selinux

如果会用的话,可以选择开启,否则建议关闭

sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

开启防火墙

sudo firewall-cmd --add-service=http --permanent && \
sudo firewall-cmd --reload

规划命名

由于7和8有些不同,所以对于repo文件名和存放目录做些区别规划,也便于不同版本的软件存放。

[hai@repo ~]$ tree -dL 2 repos
repos
├── 7
│   ├── centos-base
│   └── software
└── 8
    ├── appstream
    ├── baseos
    └── epel

[hai@repo ~]$ ls repos/7/centos-base/
c7-base  c7-epel  c7-extras  c7-updates  keys

[hai@repo ~]$ ls repos/7/software/
c7-docker-ce-stable  c7-elrepo         c7-gitlab-ce   c7-mariadb      c7-mysql57-community  c7-nginx-stable  c7-remi-php74  keys
c7-elasticsearch     c7-elrepo-kernel  c7-kubernetes  c7-mongodb-org  c7-mysql80-community  c7-remi          c7-remi-php80

[hai@repo ~]$ ls /etc/yum.repos.d/
c7-base.repo         c7-nginx.repo                        CentOS-Linux-Extras.repo            epel-playground.repo.rpmnew
c7-docker-ce.repo    c7-remi.repo                         CentOS-Linux-FastTrack.repo         epel.repo
c7-elrepo.repo       CentOS-AppStream.repo.bak            CentOS-Linux-HighAvailability.repo  epel.repo.rpmnew
c7-epel.repo         CentOS-Base.repo.backup              CentOS-Linux-Media.repo             epel-testing-modular.repo
c7-es.repo           CentOS-Base.repo.rpmsave             CentOS-Linux-Plus.repo              epel-testing-modular.repo.rpmnew
c7-gitlab.repo       CentOS-Linux-AppStream.repo          CentOS-Linux-PowerTools.repo        epel-testing.repo
c7-k8s.repo          CentOS-Linux-BaseOS.repo             CentOS-Linux-Sources.repo           epel-testing.repo.rpmnew
c7-mariadb.repo      CentOS-Linux-ContinuousRelease.repo  epel-modular.repo
c7-mongodb-org.repo  CentOS-Linux-Debuginfo.repo          epel-modular.repo.rpmnew
c7-mysql.repo        CentOS-Linux-Devel.repo              epel-playground.repo

首先系统版本号目录肯定得分开存放,文件夹名称是根据repoid自动创建的;对于非系统源之外的,有两种管理方式:1、像我这种,用单独的文件加标识符c7来区分,这会增加文件数量,长期来看,似乎不是最优的;2、一个文件中存在两个或多个版本的配置信息,在repoid面区别对应的系统版本;以Nginx为例

命名方式1

/etc/yum.repos.d/c7-nginx.repo

[c7-nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/7/x86_64/
gpgcheck=1
enabled=0
gpgkey=http://repo.local/7/software/keys/nginx_signing.key
module_hotfixes=true

/etc/yum.repos.d/nginx.repo或c8-nginx.repo

[c8-nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/8/x86_64/
gpgcheck=1
enabled=0
gpgkey=http://repo.local/7/software/keys/nginx_signing.key
module_hotfixes=true

命名方式2

/etc/yum.repos.d/nginx.repo

[c7-nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/7/x86_64/
gpgcheck=1
enabled=0
#gpgkey=https://nginx.org/keys/nginx_signing.key
gpgkey=file:///home/hai/repos/7/software/keys/nginx_signing.key
module_hotfixes=true

[c8-nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/8/x86_64/
gpgcheck=1
enabled=0
gpgkey=file:///home/hai/repos/7/software/keys/nginx_signing.key
module_hotfixes=true

存放目录命名是根据repoid自动创建的,而且repoid不能重名。

先创建CentOS7 repo

安装同步工具

dnf install createrepo -y

# 创建存储目录
mkdir -p repos/7/centos-base/keys

# 创建软件存放目录
mkdir -p repos/7/software/keys

下载GPGKey文件

既然是本地仓库,那么就把key也下载到本地,这样客户端更新就无需连接外网了;先从阿里云的repo中,把key下载下来

cd ~/repos/7/centos-base/keys
curl -O http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
curl -O https://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-7

cd ~/repos/7/software/keys
curl -O https://nginx.org/keys/nginx_signing.key

# 导入本机
rpm --import *

准备repo

下载阿里云的CentOS 7和EPEL

# centos base
curl -o /etc/yum.repos.d/c7-base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# epel
curl -o /etc/yum.repos.d/c7-epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

修改repo

以NGINX为例;

  1. 打开文件把repoid改掉,加上c7-前缀,如[nginx-stable]改为[c7-nginx-stable],base源也是;
  2. 去掉$releasever变量判断;本机去获取数据判断的结果是8,而非7
  3. $basharch变量可改可不改,除非要兼顾32位版本;64位版为x86_64;32位版为i386

原版

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

修改后

[c7-nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/7/x86_64/
gpgcheck=1
enabled=0
gpgkey=file:///home/hai/repos/7/software/keys/nginx_signing.key
module_hotfixes=true

开始同步

这里的c7-base c7-updates c7-extras c7-epel并非文件名,而是repoid

for i in c7-base c7-updates c7-extras c7-epel;
do dnf reposync --repoid=$i --download-path=/home/hai/repos/7/centos-base/ --download-metadata --newest-only --delete --downloadcomps;
done

# -g --gpgcheck #密钥检查;CentOS8不支持,7支持
# -l --plugin #开启插件支持如groupinstall;CentOS8不支持,7支持
# -m --downloadcoms #开启组安装
# -n --newest-only #只下载最新版的包
# -q --quit #输出最少的信息
# -p --download_path=DESTDIR #下载路径
# -r --repoid #更新源的名称
# -a --arch #系统位数,x86_64或i*86;默认下载当前系统所属位数
# -d --delete  #删除本地过期的包
# 更多参数参考 man reposync
# 需要同步的源首先得存在于yum.repos.d目录中,才能开启

CentOS8的reposync下载中会自动获取repodata目录,即索引目录,CentOS7得手动创建索引在首次和每次更新后,CentOS8无需创建索引。如果是CentOS7需要执行这一步。

for i in c7-base c7-updates c7-extras c7-epel;
do createrepo -g comps.xml -p --update /home/hai/repos/7/centos-base/$i;
done
# -p 输出漂亮的xml文件
# --update 只更新发生变化的包
# -g comps.xml为组安装"groupinstall"

再创建CentOS8

同上,先获取阿里云的源,添加后执行

# 这里不能加系统源arch=x86_64,因为安装更新或软件的时候有32位依赖,比如minimal版安装vim,所以得全下载
# 8.2向8.3升级的时候,做了repoid的变更,BaseOS和AppStream都变为了小写,阿里云的AppStream还是大写,这里要注意
# 软件源可以指定arch,比如MySQL
for i in baseos appastream epel;
do reposync --repoid=$i --download-path=/home/hai/repos/8/ --download-metadata --newest-only --delete --downloadcomps
done

下载结果

[hai@repo ~]$ tree -dL 3 repos/
repos/
├── 7
│   ├── centos-base
│   │   ├── c7-base
│   │   ├── c7-epel
│   │   ├── c7-extras
│   │   ├── c7-updates
│   │   └── keys
│   └── software
│       ├── c7-docker-ce-stable
│       ├── c7-elasticsearch
│       ├── c7-elrepo
│       ├── c7-elrepo-kernel
│       ├── c7-gitlab-ce
│       ├── c7-kubernetes
│       ├── c7-mariadb
│       ├── c7-mongodb-org
│       ├── c7-mysql57-community
│       ├── c7-mysql80-community
│       ├── c7-nginx-stable
│       ├── c7-remi
│       ├── c7-remi-php74
│       ├── c7-remi-php80
│       └── keys
└── 8
    ├── appstream
    │   ├── Packages
    │   └── repodata
    ├── baseos
    │   ├── Packages
    │   └── repodata
    └── epel
        ├── Packages
        └── repodata

创建客户端的repo文件

centos7

可以使用IP,也可以使用主机名;repos/7/CentOS-Base.repo;可以合并文件到一个,也可以分割文件为单独的。

echo -e '
# Local repos
# centos base
[c7-base]
name=CentOS-7 - Base - 192.168.0.120
baseurl=http://192.168.0.120/7/centos-base/c7-base
enabled=1
gpgcheck=1
gpgkey=http://192.168.0.120/7/centos-base/keys/RPM-GPG-KEY-CentOS-7

# released updates 
[c7-updates]
name=CentOS-7 - Updates - 192.168.0.120
baseurl=http://192.168.0.120/7/centos-base/c7-updates
gpgcheck=1
enabled=1
gpgkey=http://192.168.0.120/centos/RPM-GPG-KEY-CentOS-7

# additional packages that may be useful
[c7-extras]
name=CentOS-7 - Extras - 192.168.0.120
baseurl=http://192.168.0.120/7/centos-base/c7-extras
gpgcheck=1
enabled=1
gpgkey=http://192.168.0.120/7/centos-base/keys/RPM-GPG-KEY-CentOS-7

# epel
[c7-epel]
name=Extra Packages for Enterprise Linux 7 - x86_64
baseurl=http://192.168.0.120/7/centos-base/c7-epel
enabled=1
gpgcheck=1
gpgkey=http://192.168.0.120/7/centos-base/keys/RPM-GPG-KEY-EPEL-7' > repos/7/CentOS-Base.repo

centos8

这里把没有合并文件了;官方原版是分开的;

echo -e '
[baseos]
name=CentOS Linux $releasever - baseos
baseurl=http://repo.local/8/baseos
gpgcheck=1
enabled=1
gpgkey=http://repo.local/8/baseos/RPM-GPG-KEY-centosofficial' > repos/8/CentOS-Linux-BaseOS.repo

echo -e '
[appstream]
name=CentOS-$releasever - appstream - localrepo
failovermethod=priority
baseurl=http://repo.local/8/appstream
gpgcheck=1
gpgkey=http://repo.local/8/appstream/RPM-GPG-KEY-CentOS-Official' > repos/8/CentOS-Linux-AppStream.repo

echo -e '
[epel]
name=Extra Packages for Enterprise Linux $releasever - $basearch
baseurl=http://repo.local/8/epel
enabled=1
gpgcheck=1
gpgkey=http://repo.local/8/epel/RPM-GPG-KEY-EPEL-8' > repos/8/epel.repo

对外发布

dnf install nginx -y

Nginx配置

vim /etc/nginx/nginx.conf

server {

	root /home/hai/repos/; #路径只到这里;后面的版本号从repo文件中指定
	autoindex on; #开启nginx目录浏览
	autoindex_exact_size off; #on的话是字节显示,off是K、M、G显示
	autoindex_localtime on; #使用本机时区时间显示
	
	location /favico.ico {
		log_not_found off;
		access_log off;
	}
	location /robots.txt {
		log_not_found off;
		access_log off;
	}
}

为了避免权限问题,可以把Nginx加入当前用户组中

usermod -aG hai nginx

启动服务

systemctl enable --now nginx

完成测试

客户端获取

# centos 7
curl -o /etc/yum.repos.d/CentOS-Base.repo http://repo.local/7/CentOS-Base.repo
# centos 8
curl -O http://repo.local/8/CentOS-Linux-BaseOS.repo
curl -O http://repo.local/8/CentOS-Linux-AppStream.repo
curl -O http://repo.local/8/CentOS-Linux-epel.repo

加入定时任务

crontab -e
0 0 * * 0 bash /home/hai/repos/reposync.sh 2> /home/hai/repos/sync.log
#每周日0点自动执行
2只输出错误,2>&1 输出全部信息
systemctl enable --now crond