1 前言
everything 镜像中包含了许多 rpm 包,可以提供基本的安装使用,然而还有一部分软件包需要连网到公网 repo 源中下载。但是在生产环境中,服务器大多数是不能连接公网的,因此需要搭建一个局域网 repo 源,即让一台能够连接公网的服务器从公网 repo 源中同步 rpm 包到本地,然后局域网的其他服务器再从这台能连接公网的服务器中下载 rpm 包
2 所需的服务或命令
2.1 Web 服务
用于局域网中其他服务器访问,可以使用 httpd 服务或 nginx 服务
2.2 dnf reposync
命令
$ dnf reposync [OPTIONS]
-c [CONFIG FILE] 指定配置文件运行(默认配置文件是 /etc/yum.conf)
-q 安静操作
-v 显示详细信息
-b 尝试使用最佳的软件包版本
-C 完全从系统缓存运行,不更新缓存
-R [minutes] 最大命令等待时间
-y 所有问题自动回答 yes
--assumeno 所有问题自动回答 no
--enablerepo [repo] 启用其他存储库,可以指定多次
--disablerepo [repo] 禁用仓库,可以指定多次
--repo [repo], --repoid [repo] 仅使用指定的存储库
--exclude [package] 排除软件包
--forcearch ARCH 强制使用指定的架构
--arch [arch] 仅下载指定架构的软件包
--delete 删除存储库中不再存在的本地软件包
-n 仅下载最新的软件包
-p DOWNLOAD_PATH 指定软件包下载的位置
--norepopath 在下载目录中不重新生成以 `repo name` 命名的目录
2.3 createrepo
命令
$ createrepo [OPTION?] <directory_to_index>
-q 以安静模式运行
-v 显示详细信息
-o 指定生成的元数据存放的位置
--excludes=PACKAGE_NAME_GLOB 指定生成元数据时排除的包
--update 在原有元数据上升级,只更新有变化的软件
--workers 读取 rpm 包的数量,默认为 5
3 同步官方源
服务器名称 | 用途 | 操作系统版本 | IP 地址 |
---|---|---|---|
Server | 搭建局域网 repo 源 | openEuler 22.03 LTS SP1 | 192.168.255.221 |
Client | 模拟局域网内主机 | openEuler 22.03 LTS | 192.168.255.220 |
3.1 Server 端配置
3.1.1 系统基本设置
# 关闭防火墙,并停止开机自启
$ systemctl stop firewalld
$ systemctl disable firewalld
# 关闭 SELinux
$ setenforce 0
# 安装用于提供 reposync 命令的工具包
$ yum install -y dnf-plugins-core
# 安装用于提供 createrepo 命令的工具包
$ yum install -y createrepo
# 创建专用目录,保存同步的 RPM 包
$ mkdir /openEuler-22.03-LTS-REPO
另外注意要留有足够的分区空间去保存 RPM 包
3.1.2 配置 Web 服务
此处使用 nginx 服务
# 安装 nginx
$ yum install -y nginx
# 启动服务,并设置开机自启
$ systemctl start nginx
$ systemctl enable nginx
# 在默认网页根目录下创建 openEuler-22.03-LTS 目录及以下子目录,用来存放 RPM 包
$ mkdir -p /usr/share/nginx/html/openEuler-22.03-LTS/{everything,update,EPOL}
$ mkdir -p /usr/share/nginx/html/openEuler-22.03-LTS/EPOL/main
# 编写配置文件,允许显示目录索引
$ cat > /etc/nginx/conf.d/openEuler-22.03-LTS.conf <<EOF
server {
listen 8001;
root /usr/share/nginx/html/openEuler-22.03-LTS;
location / {
autoindex on;
autoindex_exact_size off;
autoindex_format html;
autoindex_localtime on;
}
}
EOF
# 重启 nginx 服务
$ systemctl restart nginx
使用 Windows 浏览器访问 http://192.168.255.221:8001,查看访问是否正常
3.1.3 配置 repo 源
Server 端需要配置局域网内客户端主机操作系统的 repo 源。例如本实验中作为局域网 repo 源服务器的 Server 端的操作系统版本为 openEuler 22.03 LTS SP1,而客户端主机操作系统为 openEuler 22.03 LTS,那么需要在 Server 端配置 openEuler 22.03 LTS 操作系统的 repo 源
openEuler 各版本的 repo 源可以在论坛中找到:【汇总贴】openEuler常用repo源 - 迁移 - openEuler 论坛
注意:
一定要修改新添加的 repo 源的 repo id 和 repo name,即修改
[ REPO ID ]
和naem=REPO NAME
的内容,否则可能会和现有的 repo 源名字冲突
# 在 Server 端配置客户端主机操作系统的 reop 源
$ cat > /etc/yum.repos.d/openEuler-22.03-LTS.repo <<EOF
[openEuler-22.03-everything]
name=openEuler-22.03-everything
baseurl=http://repo.huaweicloud.com/openeuler/openEuler-22.03-LTS/everything/x86_64/
enabled=1
gpgcheck=0
gpgkey=http://repo.huaweicloud.com/openeuler/openEuler-22.03-LTS/everything/x86_64/RPM-GPG-KEY-openEuler
[openEuler-22.03-EPOL]
name=openEuler-22.03-EPOL
baseurl=http://repo.huaweicloud.com/openeuler/openEuler-22.03-LTS/EPOL/main/x86_64/
enabled=1
gpgcheck=0
[openEuler-22.03-update]
name=openEuler-22.03-update
baseurl=http://repo.huaweicloud.com/openeuler/openEuler-22.03-LTS/update/x86_64/
enabled=1
gpgcheck=0
EOF
# 清空 yum 缓存
$ yum clean all
# 重建 yum 缓存
$ yum makecache
# 查看当前的 repo 源
$ yum repolist
repo id repo name
openEuler-22.03-EPOL openEuler-22.03-EPOL
openEuler-22.03-everything openEuler-22.03-everything
openEuler-22.03-update openEuler-22.03-update
从命令返回结果看到,openEuler 22.03 LTS 版本的 repo 源已经成功添加,另外需要记住此处的 repo id
,在同步时会指定 --repoid=REPO_ID
选项
3.1.4 同步 everything 源
(1)同步 everything 源的 RPM 包到本地
# 同步 everything 源的 RPM 包到本地
$ dnf reposync -v --repoid=openEuler-22.03-everything -p /openEuler-22.03-LTS-REPO
# 同步完成后会在 /openEuler-22.03-LTS-REPO 目录创建一个名称同 repo name 的目录
$ ls /openEuler-22.03-LTS-REPO/
openEuler-22.03-everything
# 查看目录结构
$ tree -L 1 /openEuler-22.03-LTS-REPO/openEuler-22.03-everything/
/openEuler-22.03-LTS-REPO/openEuler-22.03-everything/
└── Packages
(2)生成 everything 源的 RPM 包元数据
# 执行以下命令生成元数据
$ createrepo -v --workers 10 /openEuler-22.03-LTS-REPO/openEuler-22.03-everything
# 查看生成元数据后的目录结构
$ tree -L 1 /openEuler-22.03-LTS-REPO/openEuler-22.03-everything/
/openEuler-22.03-LTS-REPO/openEuler-22.03-everything/
├── Packages
└── repodata
# 查看生成的元数据文件
$ ls /openEuler-22.03-LTS-REPO/openEuler-22.03-everything/repodata
0079e1d3bd752a19486cb91269c98c8b5a6254d3ca13e5c0326e085561f1ed2a-other.sqlite.bz2
355628d38b0cd6163757264bc7971f3d86ff1d530a44c034786f3116b167f490-filelists.xml.gz
73565b368f50f6d2bb92543e2f7bcef4a9bc159ccdfbc728fc22e9b2ed5bb528-primary.xml.gz
7c20d73494e2525944a113b55983be13ba437e354da3e45f19f456b8f39457b4-other.xml.gz
9b353c421ef03be739e96d529e92393dfc4864205d974309a6af813e47893fff-filelists.sqlite.bz2
bd6c1976aae37a44ef7c7f9390c0321b4f7a27c4991e318f57b9c37016cb32fa-primary.sqlite.bz2
repomd.xml
(3)创建软链接到 nginx 网页根目录
# 创建 everything 源软链接到 nginx 网页根目录
$ ln -s /openEuler-22.03-LTS-REPO/openEuler-22.03-everything/ /usr/share/nginx/html/openEuler-22.03-LTS/everything/x86_64
3.1.5 同步 update 源
(1)同步 update 源的 RPM 包到本地
# 同步 update 源的 RPM 包到本地
$ dnf reposync -v --repoid=openEuler-22.03-update -p /openEuler-22.03-LTS-REPO
# 同步完成后会在 /openEuler-22.03-LTS-REPO 目录创建一个名称同 repo name 的目录
$ ls /openEuler-22.03-LTS-REPO/
openEuler-22.03-update
# 查看目录结构
$ tree -L 1 /openEuler-22.03-LTS-REPO/openEuler-22.03-update/
/openEuler-22.03-LTS-REPO/openEuler-22.03-update/
└── Packages
(2)生成 update 源的 RPM 包元数据
# 执行以下命令生成元数据
$ createrepo -v --workers 10 /openEuler-22.03-LTS-REPO/openEuler-22.03-update
# 查看生成元数据后的目录结构
$ tree -L 1 /openEuler-22.03-LTS-REPO/openEuler-22.03-update
/openEuler-22.03-LTS-REPO/openEuler-22.03-update
├── Packages
└── repodata
# 查看生成的元数据文件
$ ls /openEuler-22.03-LTS-REPO/openEuler-22.03-update/repodata
8943580f5aefe7f532fbbd9f19d771aaf9407a855b0acad33723007d8dde4199-primary.xml.gz
ad1a113f7358bfebf9d13783d8fa8ce0a9b151725ecfc2da059226280422c30a-other.xml.gz
bf573c34d9f77a76757a2a496b2c9ee671dddc81d660a95b063f8b81b8d7a4f9-filelists.sqlite.bz2
c6b747c4c6ee6cb6a44683b4a3636066cba5c9e573ea19ad95a5e315a9af1836-primary.sqlite.bz2
e152e3b11a7fcf011e16a27f7e6ba855ac12025b114ec5916e09d4edb0fa61e9-other.sqlite.bz2
f88eb68a9e41086c6b2de992367613c9b1e530bea82a73aa82e6faad6e5ed53d-filelists.xml.gz
repomd.xml
(3)创建软链接到 nginx 网页根目录
# 创建 update 源软链接到 nginx 网页根目录
$ ln -s /openEuler-22.03-LTS-REPO/openEuler-22.03-update/ /usr/share/nginx/html/openEuler-22.03-LTS/update/x86_64
3.1.6 同步 EPOL 源
(1)同步 EPOL 源的 RPM 包到本地
# 同步 update 源的 RPM 包到本地
$ dnf reposync -v --repoid=openEuler-22.03-EPOL -p /openEuler-22.03-LTS-REPO
# 同步完成后会在 /openEuler-22.03-LTS-REPO 目录创建一个名称同 repo name 的目录
$ ls /openEuler-22.03-LTS-REPO/
openEuler-22.03-EPOL
# 查看目录结构
$ tree -L 1 /openEuler-22.03-LTS-REPO/openEuler-22.03-EPOL
/openEuler-22.03-LTS-REPO/openEuler-22.03-EPOL/
└── Packages
(2)生成 EPOL 源的 RPM 包元数据
# 执行以下命令生成元数据
$ createrepo -v --workers 10 /openEuler-22.03-LTS-REPO/openEuler-22.03-EPOL
# 查看生成元数据后的目录结构
$ tree -L 1 /openEuler-22.03-LTS-REPO/openEuler-22.03-EPOL
/openEuler-22.03-LTS-REPO/openEuler-22.03-EPOL
├── Packages
└── repodata
# 查看生成的元数据文件
$ ls /openEuler-22.03-LTS-REPO/openEuler-22.03-EPOL/repodata
2d41ed62331b529104c7b04fd34680e8eeb8783e212e910e5230daaa66a900a4-filelists.sqlite.bz2
3445b86e5fd0157d0fd08aaf06cde6f1feca76517b574d8fdd3b40abe827b71e-other.xml.gz
709755e7d41e355645979f47b78155234bae9d50b2422105a4b03fca6ea93c83-filelists.xml.gz
70e673639de7efb802e65a54ce80e99c49ea93b1a8a4b4a676a47a91cadc99fa-primary.xml.gz
8c1cb6add3f18391a70436bed3bca18b9e0eac6861d8c5e2266c9952be3ea9f0-other.sqlite.bz2
bae172c52a64e4637d189780ff27d983e3c97bcbc17278f74afe0a23ab6e9ecd-primary.sqlite.bz2
repomd.xml
(3)创建软链接到 nginx 网页根目录
# 创建 EPOL 源软链接到 nginx 网页根目录
$ ln -s /openEuler-22.03-LTS-REPO/openEuler-22.03-EPOL/ /usr/share/nginx/html/openEuler-22.03-LTS/EPOL/main/x86_64
3.1.7 在前端界面查看 RPM 包
使用 Windows 浏览器访问: http://192.168.255.221:8001,查看 RPM 包
3.2 Client 端配置
3.2.1 系统基本设置
# 关闭防火墙,并停止开机自启
$ systemctl stop firewalld
$ systemctl disable firewalld
# 关闭 SELinux
$ setenforce 0
3.2.2 配置 repo 源
# 创建备份目录,将现有的 repo 源都移动到备份目录中
$ cd /etc/yum.repos.d/
$ mkdir bak
$ mv ./* bak/
# 编写新的 repo 源,URL 地址指向局域网 repo 源服务器
cat > /etc/yum.repos.d/lan.repo <<EOF
[openEuler-22.03-everything]
name=openEuler-22.03-everything
baseurl=http://192.168.255.221:8001/everything/x86_64/
enabled=1
gpgcheck=0
[openEuler-22.03-EPOL]
name=openEuler-22.03-epol
baseurl=http://192.168.255.221:8001/EPOL/main/x86_64/
enabled=1
gpgcheck=0
[openEuler-22.03-update]
name=openEuler-22.03-update
baseurl=http://192.168.255.221:8001/update/x86_64/
enabled=1
gpgcheck=0
EOF
# 清空 yum 缓存
$ yum clean all
# 重建 yum 缓存
$ yum makecache
# 查看当前的 repo 源
$ yum repolist
repo id repo name
openEuler-22.03-EPOL openEuler-22.03-epol
openEuler-22.03-everything openEuler-22.03-everything
openEuler-22.03-update openEuler-22.03-update
3.2.3 测试 repo 源
# 随便搜索一个软件包
$ yum provides tree
Last metadata expiration check: 0:08:11 ago on Wed 13 Dec 2023 04:36:36 PM CST.
tree-1.8.0-2.oe2203.x86_64 : Tree file viewer tool
Repo : openEuler-22.03-everything
Matched from:
Provide : tree = 1.8.0-2.oe2203
# 安装搜索的软件包
$ yum install -y tree
4 使用 .iso
镜像搭建本地 repo 源
4.1 基于 HTTP 协议搭建
# 安装 httpd 服务及其他工具
$ yum install -y httpd createrepo
# 修改配置文件,不显示默认网页
$ mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.bak
$ sed -i '/^\s*DirectoryIndex/ s/index.html//' /etc/httpd/conf/httpd.conf
# 挂载 everything 镜像
$ mount /dev/sr0 /mnt/
# 创建 repo 目录
$ mkdir -p /var/www/html/openEuler-LTS-SP1/Package
# 从镜像中复制软件包到 repo 目录
$ cp /mnt/Packages/* /var/www/html/openEuler-LTS-SP1/Package/
# 生成元数据信息
$ createrepo -v --workers 20 /var/www/html/openEuler-LTS-SP1/
# 修改目录及文件权限
$ chmod 755 /var/www/html/openEuler-LTS-SP1/Package/
$ chmod 755 /var/www/html/openEuler-LTS-SP1/repodata/
$ chmod 644 /var/www/html/openEuler-LTS-SP1/Package/*
$ chmod 644 /var/www/html/openEuler-LTS-SP1/repodata/*
# 启动 httpd 服务
$ systemctl start httpd
客户端编写 repo 文件:
# 编写 repo 文件
$ cat > /etc/yum.repos.d/local.repo <<EOF
[local-repo]
name=local-repo
baseurl=http://192.168.230.201/openEuler-LTS-SP1/
enabled=1
gpgcheck=0
EOF
4.2 基于 FTP 协议搭建
# 安装 vsftpd 服务及其他工具
$ yum install -y vsftpd createrepo
# 配置 vsftpd 服务,允许匿名用户登录
$ sed -i '/^anonymous_enable/c anonymous_enable=YES' /etc/vsftpd/vsftpd.conf
# 挂载 everything 镜像
$ mount /dev/sr0 /mnt/
# 创建 repo 目录
$ mkdir -p /var/ftp/pub/openEuler-22.03-LTS-SP1/Packages
# 从镜像中复制软件包到 repo 目录
$ cp /mnt/Packages/* /var/ftp/pub/openEuler-22.03-LTS-SP1/Packages/
# 生成元数据信息
$ createrepo -v --workers 20 /var/ftp/pub/openEuler-22.03-LTS-SP1/
# 启动 vsftpd 服务
$ systemctl start vsftpd
客户端编写 repo 文件:
# 编写 repo 文件
$ cat > /etc/yum.repos.d/local.repo <<EOF
[local-repo]
name=local-repo
baseurl=ftp://192.168.230.201/pub/openEuler-22.03-LTS-SP1/
enabled=1
gpgcheck=0
EOF
评论