内网服务器的“求生之路”:手把手搭建企业级离线 YUM/APT 仓库(告别 U 盘拷包)

news/2025/11/30 3:48:33/文章来源:https://www.cnblogs.com/kentkwok/p/19287925

内网服务器的“求生之路”:手把手搭建企业级离线 YUM/APT 仓库(告别 U 盘拷包)

上一篇文章我们解决了 Docker 镜像在离线环境的同步问题,今天我们来解决更基础、也更让人头疼的问题——操作系统本身的软件源。

痛点:当服务器失去了互联网

对于身处金融、政企或者涉密单位的 IT 运维和开发者来说,“内网”是一个让人又爱又恨的词。安全是安全了,但便捷性几乎为零。

你是否经历过这种绝望场景:

  • 新拿到一台内网服务器,习惯性输入 yum install vimapt install nginx,然后看着终端光标无限闪烁直到超时。
  • 为了安装一个软件,先在能上网的电脑上下好 .rpm.deb 包,用 U 盘拷进内网。结果一安装,提示缺少依赖 A;拷来依赖 A,又提示缺少依赖 B 和 C……陷入了无尽的“依赖地狱”。

在纯内网环境中,没有可用的软件源,服务器就像一座孤岛。

本文将带你打破这座孤岛,用最正规、最企业级的方式,在内网搭建一套私有的 YUM (CentOS/RHEL) 和 APT (Ubuntu/Debian) 仓库,让内网机器也能享受丝般顺滑的 install 体验。


一、 核心原理:搬运工与大管家

我们不能直接把互联网接入内网,但我们可以做互联网的“搬运工”。

搭建离线仓库的本质分为三步:

  1. 同步 (Sync): 找一台能通外网的机器(称为“同步机”),把阿里源、清华源等上游镜像站里的所有软件包和**元数据(Metadata)**统统拉取到本地硬盘。
  2. 迁移 (Transfer): 通过合规的方式(如移动硬盘、光闸等)将这些数据导入到内网环境。
  3. 服务 (Serve): 在内网找一台服务器(称为“仓库服务器”),利用 Nginx/Apache 将这些数据以 HTTP 的形式发布出去,供内网其他机器使用。

PixPin_2025-11-30_03-23-28

为什么不能只拷软件包?

新手最大的误区就是只下载 .rpm 文件。YUM 和 APT 之所以强大,是因为它们依赖元数据(Repodata/Packages.gz)。这些文件记录了包的版本、依赖关系、文件列表等信息。没有元数据,包管理工具就是个瞎子,无法自动解决依赖问题。

我们要做的,是同步整个仓库生态。


二、 准备工作

  • 同步机(互联网侧): 能够访问公网,磁盘空间要大!同步一个完整的 CentOS 7 版本大约需要 50G+,一个完整的 Ubuntu 版本可能需要 200G+。
  • 仓库服务器(内网侧): 安装好 Nginx 或 Apache,用于提供 HTTP 文件服务。
  • 目标系统: 本文以最常见的 CentOS 7 和 Ubuntu 20.04 LTS 为例。

三、 实战:搭建离线 YUM 仓库 (CentOS 7为例)

CentOS/RHEL 系的同步相对简单,主要依靠 yum-utils 包中的 reposync 工具。

3.1 在同步机上拉取数据

1. 安装必要工具:

# 安装 reposync 和 createrepo
yum install -y yum-utils createrepo nginx

2. 配置你需要同步的源:

假设我们需要同步最基础的 base, updates, extras 以及常用的 epel 源。确保你的 /etc/yum.repos.d/ 下已经配置好了这些源的国内镜像(如阿里云)。

3. 开始同步:

我们需要创建一个目录来存放这些数据,例如 /data/centos_repo

mkdir -p /data/centos_repo
# 使用 reposync 同步指定的 repo id 到指定目录
# -g: 同步 GPG Key,-l: 包含 yum plugin 支持,-d: 删除本地旧包,-n: 只下载最新包
reposync -g -l -d -n --repoid=base --newest-only --download_path=/data/centos_repo/
reposync -g -l -d -n --repoid=updates --newest-only --download_path=/data/centos_repo/
reposync -g -l -d -n --repoid=extras --newest-only --download_path=/data/centos_repo/
reposync -g -l -d -n --repoid=epel --newest-only --download_path=/data/centos_repo/

PixPin_2025-11-30_02-43-02

4. 生成元数据 (关键步骤):

下载完成后,目录里只有 rpm 包,还不能叫仓库。我们需要用 createrepo 生成元数据目录(即那个著名的 repodata 目录)。

# 对每个下载好的目录执行 createrepo
createrepo /data/centos_repo/base/
createrepo /data/centos_repo/updates/
createrepo /data/centos_repo/extras/
createrepo /data/centos_repo/epel/

执行完毕后,你会发现每个目录下多了一个 repodata 文件夹。

3.2 数据迁移与内网服务

/data/centos_repo 整个打包拷贝到内网仓库服务器的相同位置。

在内网服务器上配置 Nginx:

server {listen       80;server_name  yum.intra.example.com; # 内网域名或IProot         /data/centos_repo;     # 指向数据根目录location / {autoindex on;             # 开启目录浏览功能autoindex_exact_size off; # 显示人性化的文件大小autoindex_localtime on;   # 显示服务器时间}
}

启动 Nginx 后,在浏览器访问,应该能看到目录结构列表。

PixPin_2025-11-30_03-17-31

3.3 内网客户端配置

在内网其他 CentOS 机器上,备份原有的 repo 文件,新建一个 internal.repo

# /etc/yum.repos.d/internal.repo
[internal-base]
name=Internal Base
baseurl=http://yum.intra.example.com/base/
gpgcheck=0
enabled=1[internal-updates]
name=Internal Updates
baseurl=http://yum.intra.example.com/updates/
gpgcheck=0
enabled=1# extras 和 epel 依此类推...

最后,清理缓存并测试:

yum clean all
yum makecache
yum install vim  # 享受内网极速下载吧!

四、 实战:搭建离线 APT 仓库 (Ubuntu 20.04为例)

Debian/Ubuntu 系的仓库结构比 YUM 复杂得多,通常使用 apt-mirror 工具来进行同步。

注意:APT 仓库通常非常巨大,请准备充足的磁盘空间!

4.1 在同步机上配置 apt-mirror

1. 安装工具:

apt update
apt install -y apt-mirror nginx

2. 修改配置文件:

编辑 /etc/apt/mirror.list。这里定义了我们要镜像哪些源、哪些版本以及架构。

############# config ##################
# 定义基础目录
set base_path    /data/apt_mirror
# 定义镜像存储位置
set mirror_path  $base_path/mirror
# 定义临时下载目录
set skel_path    $base_path/skel
set var_path     $base_path/var
set cleanscript $var_path/clean.sh
# 架构,通常只需要 amd64
set defaultarch  amd64
# 进程数
set nthreads     20
set _tilde 0
############# end config ############### 替换为你想要同步的上游源(推荐使用国内源加速下载)
# Ubuntu 20.04 代号 focal
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
# deb-src 开头的是源码包,如果不需要可以注释掉以节省大量空间
# deb-src http://mirrors.aliyun.com/ubuntu/ focal main ...clean http://mirrors.aliyun.com/ubuntu

3. 开始同步 (漫长的等待):

切换到 apt-mirror 用户执行同步(或直接用 root,注意权限):

apt-mirror

这个过程可能会持续几个小时甚至几天,取决于你的网速和同步的数据量。

PixPin_2025-11-30_03-25-27

4.2 数据迁移与内网服务

同步完成后,数据通常位于 /data/apt_mirror/mirror/mirrors.aliyun.com/ubuntu/ 目录下。将这个 ubuntu 目录完整迁移到内网服务器的 /data/apt_repo/ 下。

内网 Nginx 配置与 YUM 类似,指向 /data/apt_repo/

4.3 内网客户端配置

在内网 Ubuntu 机器上,修改 /etc/apt/sources.list

# 注释掉原来的源,添加内网源
# 假设内网仓库地址是 http://apt.intra.example.com/ubuntu/
deb [trusted=yes] http://apt.intra.example.com/ubuntu/ focal main restricted universe multiverse
deb [trusted=yes] http://apt.intra.example.com/ubuntu/ focal-security main restricted universe multiverse
deb [trusted=yes] http://apt.intra.example.com/ubuntu/ focal-updates main restricted universe multiverse

注意: 由于我们是离线镜像,通常没有同步官方的 GPG 签名密钥,或者内网机器无法验证签名。简单粗暴的方法是在源地址前加上 [trusted=yes] 告诉 APT 信任此源。

最后测试:

apt update
apt install nginx

五、 总结与进阶

搭建离线软件源是企业级内网环境的基础设施建设。虽然初期搭建比较繁琐,数据搬运量大,但一旦建成,将极大提升整个团队的运维效率和开发体验。

进阶思考:

  • 增量更新: 第一次全量同步后,如何定期进行增量同步?(Review reposync 的参数和 apt-mirror 的机制)。
  • 版本冻结: 对于追求极度稳定的生产环境,如何利用离线源实现软件版本的冻结,避免意外升级带来的 Bug?
  • CI/CD 集成: 如何将自研的软件打包成 RPM/DEB,发布到这个私有仓库中,供自动化部署使用?

掌握了这些,你才算真正掌控了内网服务器的“生杀大权”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/981358.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PDF报表-JasperReports

PDF报表-JasperReports一、常见的PDF报表生成方式 在企业开发中,除了常见的Excel形式 报表,还有PDF形式的报表。那么如何导出PDF形式的报表呢? 1. iTextiText是著名的开放源码的站点sourceforge一个项目,是用于生成…

CF2161G Editorial

Two language versions are available in order to serve both codeforces and luogu community. English Version HintsWhats the necessary condition for \(a_1^\prime\&a_2^\prime\cdots\&a_n^\prime=X\) …

数组高阶方法:map、filter、reduce实战指南

数组高阶方法:map、filter、reduce实战指南 文章简介 在HarmonyOS应用开发中,数组操作是日常开发的重要组成部分。本文将深入探讨三个核心的数组高阶方法:map、filter和reduce,帮助开发者掌握这些强大的数据处理工…

设备能力检测:自适应不同硬件环境

设备能力检测:自适应不同硬件环境 引言 在 HarmonyOS 应用开发中,设备能力检测是构建自适应应用的关键技术。随着 HarmonyOS 生态的不断扩大,开发者需要确保应用能够在不同硬件配置的设备上提供一致的用户体验。本文…

DuckDB:轻量级 OLAP 数据库的新星

1. 分钟级上手一个像 SQLite 一样简单、却能跑得像 ClickHouse 一样快的分析引擎。而且——你今天就能用上。如果你经常在 Jupyter Notebook 里等 Pandas 加载数据,或者写一堆 Python 循环做聚合,那 DuckDB 很可能就…

跨设备剪贴板数据:实现应用间内容共享

跨设备剪贴板数据:实现应用间内容共享 概述 在 HarmonyOS 生态系统中,跨设备剪贴板功能让用户能够在一台设备上复制内容,然后在同一账号下的其他设备上粘贴使用。这项技术打破了设备边界,为开发者提供了全新的内容…

Text组件高级排版技巧:字体样式与文本布局深度优化

Text 组件高级排版技巧:字体样式与文本布局深度优化 文章简介 本文基于 HarmonyOS Next,深入探讨 Text 组件的高级排版技巧。我们将从基础字体样式设置开始,逐步深入到复杂的文本布局优化,帮助开发者掌握专业级的文…

通知与提醒系统:即时消息与日程管理实现

通知与提醒系统:即时消息与日程管理实现 概述 在HarmonyOS应用开发中,通知与提醒系统是连接用户与应用的重要桥梁。本文将深入探讨如何在HarmonyOS Next(API 10+)中实现高效的通知管理和智能的日程提醒功能。 官方…

try/catch/finally:完善的错误处理策略

try/catch/finally:完善的错误处理策略 概述 在 HarmonyOS 应用开发中,错误处理是保证应用稳定性和用户体验的关键环节。本文将深入探讨 HarmonyOS Next(API 10 及以上版本)中的错误处理机制,帮助开发者构建更加健…

4种XML解析方式详解

详细讲解四种主流的XML解析方式,包括其原理、特点、适用场景和代码示例。 四种方式,可以分为两大类:基于树的解析:将整个XML文档一次性加载到内存,形成一棵树形结构。DOM基于事件的解析:顺序读取XML文档,遇到节…

20232415 2025-2026-1 《网络与系统攻防技术》实验七实验报告

1.实验内容 2.实验目的 3.实验环境 4.实验过程与分析 4.1 使用SET工具建立冒名网站 4.1.1 建立冒名网站 4.1.2 验证欺骗效果 在浏览器中访问伪造的监听地址,发现能够看到一个与天翼快递登录页面相同的页面,说明冒名网…

2025 Launch X431 PRO3 ACE: Online ECU Coding 38+ Services for Euro/Amer Vehicles with CANFD/DoIP

Problem: Outdated Tools Can’t Keep Up with Modern Vehicle Technology Today’s European and American vehicles are more advanced than ever, packed with cutting-edge ECUs, complex protocols like CAN FD a…

QtSingleapplication单实例-源码分析

QtSingleapplication单实例-源码分析 目录QtSingleapplication单实例-源码分析官方案例 QtSingleApplication分析1. 描述2. 类解析QtLocalPeerQtSingleApplication3. 实际案例consoletrivial4. 逻辑流程(AI整理)QtSing…

2025解决VS C# NUGET 安装System.Data.SQLite+SourceGear.SQLite3 不支持 AnyCPU 的系列问题

环境:isual Studio 2022 项目:.NETFramework,Version=v4.8 时间:2025年11月30日 注:此问题在网络上搜到的解决办法比较旧,且部分失效,所以作此解决记录 使用Visual Studio NuGet方式安装System.Data.SQLite后会因为缺少…

102302156 李子贤 数据采集第四次作业

作业1 要求:熟练掌握 Selenium 查找HTML元素、爬取Ajax网页数据、等待HTML元素等内容。 使用Selenium框架+ MySQL数据库存储技术路线爬取“沪深A股”、“上证A股”、“深证A股”3个板块的股票数据信息。 候选网站:东…

东华萌新挑战赛 密室逃脱

点击查看代码 #include<bits/stdc++.h>using namespace std;bool check(int k,int n,const vector<vector<int> >& pos) {//枚举所有可以作为障碍区的起始位置 for(int r=0;r<=n-k;r++){for(…

第40天(中等题 数据结构)

打卡第四十天 2道简单题+1道中等题题目:思路:哈希表+位运算 代码: class Solution { public:int similarPairs(vector<string>& words) {unordered_map<int,int> cnt;int ans = 0;for(auto &s:…

核心功能详解

Vue3 大屏可视化平台核心功能详解 一、Composables 架构 Vue3 Composables 是该项目的核心架构模式,实现了逻辑复用和关注点分离。 1. usePersonnel - 人员管理 import { usePersonnel } from @/composables/usePerso…

2025-11-30-Nature Genetics | 本周最新文献速递

文章标题: Genetic associations with educational fields 中文标题: 基因与教育:解码教育领域选择背后的遗传驱动力! 关键词: 教育领域、全基因组关联研究、遗传相关性、社会分层、多基因风险评分 摘要总结: 教…