1. 项目背景与核心需求
在服务器运维和嵌入式开发场景中,我们经常遇到需要在内网环境或无法连接互联网的设备上部署Ubuntu系统的情况。传统在线安装方式依赖网络连接,而离线安装方案往往需要手动下载大量deb包,依赖关系处理极其繁琐。本地APT仓库方案正是为了解决这个痛点而生——它能在完全离线的环境中,提供与在线安装几乎一致的使用体验。
我最近在给某金融机构部署内网开发环境时,就遇到了必须在20台物理机上安装Ubuntu 22.04 LTS的需求。通过搭建本地offline-repo,不仅实现了批量快速部署,还能像在线环境一样使用apt-get进行后续软件管理。下面分享的具体方法,已经过生产环境验证,特别适合以下场景:
- 军工、金融等需要物理隔离的网络环境
- 工厂产线上的嵌入式设备批量部署
- 云计算平台的基础镜像定制
- 需要固定软件版本号的开发测试环境
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 离线仓库构建全流程
2.1 基础环境准备
首先需要一台能联网的同架构主机(建议使用虚拟机)作为抓取机,其Ubuntu版本应与目标机一致。这里特别强调架构一致性的重要性——我曾因疏忽了ARM64和x86_64的区别,导致整个仓库需要重新构建。
bash复制# 验证系统架构
uname -m
# 清理旧缓存
sudo apt clean all
# 创建仓库目录结构
mkdir -p ~/offline-repo/{archives,lists,keys}
关键提示:建议预留至少50GB磁盘空间,完整仓库包括main/restricted/universe/multiverse四个组件时,实际占用约35GB(不含后续自定义软件包)
2.2 软件包抓取策略
使用apt-rdepends进行递归依赖下载是最可靠的方式。以下命令会下载vim及其所有依赖到指定目录:
bash复制sudo apt install apt-rdepends
apt-get download $(apt-rdepends vim | grep -v "^ ")
但对于基础系统安装,我们更需要的是获取最小化安装的包集合。这个清单可以通过分析ubuntu-minimal的依赖得到:
bash复制# 获取最小化安装包列表
apt-cache depends --recurse --no-recommends --no-suggests \
--no-conflicts --no-breaks --no-replaces --no-enhances \
ubuntu-minimal | grep "^ [a-z]" | sort -u > minimal-pkgs.txt
# 批量下载(约650个包)
xargs -a minimal-pkgs.txt apt-get download
实际操作中,我推荐使用downloadonly插件更高效地获取完整仓库:
bash复制sudo apt install apt-offline
sudo apt-offline set --install-packages ubuntu-minimal --update \
--output ~/offline-repo/apt-offline.sig
sudo apt-offline get ~/offline-repo/apt-offline.sig \
--download-dir ~/offline-repo/archives
2.3 仓库元数据生成
这是最容易被忽视但至关重要的步骤。在archives目录下执行:
bash复制# 创建Packages.gz索引
dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz
# 生成Release文件
apt-ftparchive release . > Release
gpg --armor --detach-sign -o Release.gpg Release
我曾遇到因时区设置错误导致Release文件时间戳异常,引发客户端校验失败的问题。解决方案是:
bash复制export SOURCE_DATE_EPOCH=$(date +%s)
3. 离线环境部署实战
3.1 仓库传输与配置
将整个offline-repo目录通过以下方式转移到目标机:
- 物理介质:USB 3.0移动硬盘实测传输约25分钟(35GB数据)
- 内网共享:NFS挂载速度可达100MB/s(千兆网络)
- 分段压缩:适合网络带宽受限场景
bash复制# 目标机配置sources.list
deb [trusted=yes] file:/path/to/offline-repo/archives ./
3.2 系统安装关键步骤
使用Ubuntu 22.04官方ISO启动后,在安装类型选择界面按Ctrl+Alt+F2进入TTY,执行:
bash复制# 挂载仓库介质
sudo mkdir /mnt/repo
sudo mount /dev/sdb1 /mnt/repo # 根据实际设备调整
# 临时配置APT源
echo "deb [trusted=yes] file:/mnt/repo/offline-repo/archives ./" | \
sudo tee /etc/apt/sources.list
# 刷新缓存(必须在chroot前完成)
sudo apt update
返回图形界面继续安装,在软件选择步骤务必取消所有默认选项(否则会触发网络请求)。安装完成后立即执行:
bash复制# 修复可能的依赖问题
sudo apt --fix-broken install
4. 高级技巧与问题排查
4.1 仓库增量更新方案
维护期需要添加新软件时,在抓取机执行:
bash复制# 获取变更差异
apt-get --print-uris --yes install <new-pkg> | grep ^\' | cut -d\' -f2 > new-urls.txt
# 增量下载
wget -i new-urls.txt -P ~/offline-repo/archives/
# 重建索引(保留旧版本)
cd ~/offline-repo/archives
dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz
4.2 典型问题解决记录
问题1:安装时提示"Unable to locate package"
- 检查目标机架构是否匹配
- 验证Packages.gz是否包含该软件(zgrep package_name Packages.gz)
- 确认sources.list中路径是否正确
问题2:依赖关系不满足
- 使用
apt-cache showpkg <package>分析依赖链 - 检查是否有版本冲突(如libc6版本不一致)
- 尝试
apt-get install -f自动修复
问题3:GPG验证失败
- 临时添加[trusted=yes]选项
- 或导入签名密钥:sudo apt-key add archive-key.asc
5. 生产环境优化建议
根据在银行数据中心的部署经验,给出以下建议配置:
-
存储优化:
- 使用硬链接节省空间:
cp -al /var/cache/apt/archives/* ~/offline-repo/archives/ - 启用apt缓存:
sudo apt-config dump | grep -i cache
- 使用硬链接节省空间:
-
网络部署:
bash复制# 启动简易HTTP服务 cd ~/offline-repo/archives python3 -m http.server 8000 # 客户端配置 deb [trusted=yes] http://<server-ip>:8000 ./ -
版本控制:
- 使用git管理Packages.gz和Release文件变更
- 为每个版本创建独立目录(如repo-202405)
这种方案在30台服务器集群的实测中,批量安装时间从平均45分钟/台缩短至12分钟/台,且后续软件更新效率提升80%以上。对于需要严格管控软件版本的企业环境,还可以通过apt-mark hold锁定关键包版本。
