基于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为例;
- 打开文件把repoid改掉,加上c7-前缀,如[nginx-stable]改为[c7-nginx-stable],base源也是;
- 去掉$releasever变量判断;本机去获取数据判断的结果是8,而非7
- $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