最稳妥方式是直接在内网服务器运行apt-mirror,完整同步Packages、Sources、InRelease等元数据及.deb包;需严格匹配发行版代号(如jammy)和架构,配置base_path为绝对路径并授权,用nginx发布服务,客户端sources.list须精确对应服务端目录结构,定期执行apt-mirror与clean.sh维护。

用 apt-mirror 同步官方源到内网服务器
直接在内网服务器上跑 apt-mirror 是最稳妥的同步方式,它会完整拉取远程仓库的 Packages、Sources、InRelease 等元数据和所有 .deb 包,不是简单复制几个包。关键点在于配置必须严格匹配目标发行版和架构。
- 安装前先确认系统已启用 universe/multiverse 源(否则部分依赖可能漏掉)
-
/etc/apt/mirror.list中的set base_path必须是绝对路径,且目录需提前chown -R apt-mirror:apt-mirror - 务必把
deb行里的发行版代号写对:比如 Ubuntu 22.04 是jammy,不是22.04;Debian 12 是bookworm - 首次运行
apt-mirror前建议加--nosource(不下载源码包),节省 30%+ 空间;后续增量同步默认只拉新包
用 nginx 或 apache 提供 HTTP 访问
不能直接用 file:// 协议让客户端访问本地目录——APT 客户端在解析 Release 文件时会校验 Acquire-By-Hash 字段,而本地文件协议无法满足该校验逻辑,apt update 会报 Failed to fetch … Hash Sum mismatch 错误。
- 推荐用
nginx:轻量、无 SELinux 干扰、配置简单;监听 80 端口,root 指向/opt/apt-mirror/mirror/archive.ubuntu.com/ubuntu - 软链接比复制更安全:
ln -sf /opt/apt-mirror/mirror/archive.ubuntu.com/ubuntu /var/www/html/ubuntu,避免同步过程中文件被锁或读取不一致 - 防火墙必须放行 80 端口;若用
ufw,执行sudo ufw allow 80 - 浏览器访问
http://your-server-ip/ubuntu/dists/jammy/Release能看到明文内容才算服务就绪
客户端 sources.list 配置要点
客户端改 /etc/apt/sources.list 不是简单替换域名,稍有不慎就会混用公网源和内网源,导致更新失败或安装错包。
- 必须删除或注释掉所有原始
deb http://archive.ubuntu.com和http://security.ubuntu.com行,只保留内网地址 - 每行末尾的发行版名称(如
jammy)、组件(如main)必须与服务端dists/jammy/main目录结构完全一致 - 如果服务端同步了
jammy-updates和jammy-security,客户端也要对应写全,否则apt upgrade可能跳过安全更新 - 测试命令顺序固定:
sudo apt clean && sudo apt update && apt list --upgradable;中间任一环节失败都说明路径或权限有问题
定期同步与磁盘空间管理
apt-mirror 不会自动清理旧包,长期运行后 /opt/apt-mirror/mirror 可能膨胀到数百 GB,但删错文件会导致 apt update 报 Unable to locate package。
- 清理脚本必须调用
/opt/apt-mirror/var/clean.sh,这是apt-mirror自带的、唯一安全的清理方式 - 不要手动
rm -rf任何pool/下的子目录——哪怕看起来是旧版本,因为多个发行版或组件可能共用同一 deb 文件 - 建议用 cron 每日凌晨执行:
0 3 * * * /usr/bin/apt-mirror && /opt/apt-mirror/var/clean.sh > /dev/null - 监控磁盘空间:当
/opt/apt-mirror/mirror占用超过 85%,apt-mirror会静默跳过同步,但不会报错,容易被忽略


















