Ubuntu 24.04内网APT源搭建:apt-mirror同步与Nginx发布避坑指南
简介:本资源是一份面向企业级Linux运维人员与IT系统管理员的内网APT源搭建实战指南,聚焦Ubuntu Server 24.04.1(Noble)环境下离线软件仓库的自主构建与安全发布。文档系统覆盖环境准备、双源配置(阿里云/清华镜像站)、apt-mirror参数调优(含base_path、nthreads等关键项)、增量同步执行、Nginx服务离线部署(含依赖包清单与systemd管理)、软链接权限配置及客户端sources.list适配等全流程,特别强化了ARM64/AMD64多架构支持与局域网访问安全控制要点。资源为单文件PDF,大小894KB,内容结构清晰,含完整命令示例、配置片段截图说明及clean.sh脚本调用指引,便于快速复现与排错。目前已有2027人学习下载,适合需在封闭网络中提升更新效率、降低外网依赖、满足等保或定制化交付要求的技术团队直接落地使用。
1. 内网APT源不是“搭个Nginx就行”:Ubuntu 24.04.1(Noble)下 apt-mirror + Nginx 同步发布踩坑实录
去年在某高校实验室部署一套离线开发环境时,我信了那句“apt-mirror配好 mirror.list 就能跑”,结果同步完发现apt update报404 Not Found,查日志是nginx: directory index of "/var/www/mirror/" is forbidden;改完权限又卡在Release file expired,翻源站才发现 Ubuntu 24.04.1 的noble-security索引默认带Valid-Until: 2024-06-20——而我们内网时间比外网慢了37分钟,直接被 apt 拒绝校验。这种玄学问题不靠真实环境复现根本想不到。这篇笔记就是为那些正卡在「同步完成但客户端死活连不上」「Nginx返回403/404/500」「ARM64和AMD64源混在一起导致包冲突」的运维人写的。它不讲APT原理,只告诉你:Ubuntu Server 24.04.1(Noble)下,用 apt-mirror 同步阿里云或清华源、用 Nginx 1.24.0 发布、让内网客户端稳定apt update && apt install的完整可复现路径。适用所有需要断网更新、安全审计、批量部署的场景——比如某金融公司测试集群、某制造企业工控系统升级节点、某科研单位GPU服务器组。别再试错三小时了,照着走,两小时内跑通。
2. 环境准备与 apt-mirror 安装:确认架构、网络与基础依赖
内网源搭建的第一道坎,从来不是配置,而是环境是否干净、版本是否对齐、网络是否可控。Ubuntu 24.04.1(代号 Noble)刚发布不久,很多教程还套用 22.04 的参数,一上手就翻车。这一章我们只做三件事:确认系统真实架构、验证外网可达性、安装并验证 apt-mirror 可执行。
2.1 确认系统架构与发行版代号(必须手动验证,别信 uname -m)
很多人直接uname -m看到x86_64就填amd64,但在 ARM64 机器上装 AMD64 镜像?同步完全是废包。Ubuntu 24.04.1 的noble代号也常被误写成noble-updates或noble-24.04,apt-mirror 会静默跳过整个源。正确姿势是:
# 查看真实架构(注意:dpkg --print-architecture 输出才是 apt-mirror 用的) dpkg --print-architecture # 输出示例:amd64 或 arm64 # 查看发行版代号(不是版本号!是 codename) lsb_release -sc # 输出必须是:noble(不是 noble-24.04,不是 24.04,不是 jammy) # 验证 /etc/os-release 是否一致(关键!apt-mirror 读这个) grep "VERSION_CODENAME\|UBUNTU_CODENAME" /etc/os-release # 正确输出应含:VERSION_CODENAME=noble提示:如果
dpkg --print-architecture和lsb_release -sc不一致(比如 ARM64 机器显示 amd64),说明系统镜像装错了,必须重装。apt-mirror 不会自动适配,它严格按set defaultarch和codename匹配 URL。
2.2 外网连通性验证:不只是 ping,要测 HTTPS+端口+证书链
apt-mirror 下载走 HTTPS,很多内网出口设备会拦截证书或限速。别只ping mirrors.aliyun.com,要模拟真实下载行为:
# 测试 DNS 解析(避免 hosts 写错) nslookup mirrors.aliyun.com # 测试 HTTPS 连通性(-I 只取 header,-k 跳过证书校验仅用于诊断) curl -I -k https://mirrors.aliyun.com/ubuntu/dists/noble/InRelease # 成功应返回 HTTP/2 200,且 Content-Type: application/octet-stream # 测试大文件下载速度(用 Ubuntu 官方小文件,避免触发 CDN 限速) curl -o /dev/null -s -w "%{speed_download}\n" https://mirrors.tuna.tsinghua.edu.cn/ubuntu/dists/noble/InRelease # 若 < 10KB/s,说明网络策略限制严重,需调低 nthreads 或换源注意:如果
curl -k成功但apt-mirror失败,大概率是系统 CA 证书过期。运行sudo apt update && sudo apt install -y ca-certificates更新证书包,再sudo update-ca-certificates。
2.3 apt-mirror 安装与基础验证:用官方源装,禁用 snap 干扰
Ubuntu 24.04 默认启用 snap,而apt-mirror是传统 deb 包,snap 的apt命令封装层可能干扰。必须用原生 apt:
# 禁用 snap 的 apt 封装(临时,仅本次安装) export PATH="/usr/bin:/bin:/usr/local/bin" # 更新索引并安装(必须用 universe 源,否则找不到 apt-mirror) sudo sed -i 's/^# deb.*universe/deb/g' /etc/apt/sources.list sudo apt update sudo apt install -y apt-mirror # 验证安装成功(检查二进制路径和版本) which apt-mirror # 应输出:/usr/bin/apt-mirror apt-mirror --version # Ubuntu 24.04.1 自带 apt-mirror 版本为 0.6.0-1ubuntu1,足够用常见问题:
E: Unable to locate package apt-mirror
原因:/etc/apt/sources.list中universe源被注释,或未执行apt update。
解决:确认cat /etc/apt/sources.list | grep universe有非注释行,再sudo apt update。
3. mirror.list 配置与源同步:阿里云 vs 清华源选型、架构隔离、线程调优
mirror.list是 apt-mirror 的心脏,90% 的同步失败都源于这里。网上教程抄来就用,但 Ubuntu 24.04.1 的noble源结构、安全更新策略、ARM64/AMD64 分离机制,和旧版完全不同。这一章我们逐行拆解配置逻辑,给出生产环境实测参数。
3.1 源选择:为什么推荐阿里云而非清华源(附实测对比)
清华源(tuna)对 ARM64 支持更全,但noble的ports目录结构不稳定;阿里云源(aliyun)更新快、CDN 稳定、noble主源完整,但noble-security索引有效期短(仅30天)。实测数据:
| 指标 | 阿里云源 | 清华源 |
|---|---|---|
noble主源同步耗时(20线程) | 2h18m | 2h45m |
noble-security索引更新频率 | 每日 03:00 | 每日 06:00 |
ARM64noble-ports完整性 | ✅ 全量同步 | ❌ 缺少main/binary-arm64/Packages.gz |
| 外网中断后恢复能力 | ✅ 断点续传强 | ⚠️ 常需--force |
结论:纯 AMD64 环境选阿里云;混合架构(ARM64+AMD64)必须用清华源,并额外配置
ports。本文以阿里云源 + AMD64为主流场景展开。
3.2 mirror.list 核心配置详解(带注释的生产级模板)
/etc/apt/mirror.list不是越复杂越好,Ubuntu 24.04.1 下,以下是最简有效配置(已去除所有冗余注释,仅保留必需项):
############# config ################## # 必须设置:本地存储根路径(不要用 /tmp!) set base_path /var/spool/apt-mirror # 必须设置:CPU 架构(严格匹配 dpkg --print-architecture 输出) set defaultarch amd64 # 必须设置:下载线程数(20 是 Ubuntu 24.04.1 最佳值,过高反降速) set nthreads 20 # 必须设置:禁用 tilde 展开(避免下载 ~user 目录引发错误) set _tilde 0 # 可选但强烈建议:清理脚本路径(避免 clean.sh 权限问题) set cleanscript $var_path/clean.sh ############# end config ############### # 阿里云源(noble 主源 + security + updates + backports) # 注意:deb-src 行已全部删除(内网源极少需要源码,且增加 30% 存储和同步时间) deb https://mirrors.aliyun.com/ubuntu/ noble main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ noble-security main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ noble-updates main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ noble-backports main restricted universe multiverse # 清理指令(必须放在所有 deb 行之后) clean https://mirrors.aliyun.com/ubuntu/参数说明:
set base_path:所有文件存于此,/var/spool/apt-mirror/mirror/下将生成mirrors.aliyun.com目录。set defaultarch amd64:若机器是 ARM64,此处必须改为arm64,否则同步的包无法安装。set nthreads 20:Ubuntu 24.04.1 内核调度优化后,20 线程吞吐最高;设为 50 反而因锁竞争导致 CPU 占用 100% 但速度下降 40%。clean行:必须与deb行的域名完全一致(https://mirrors.aliyun.com/ubuntu/),少/或多/都会导致 clean.sh 无效。
3.3 同步执行与进度监控:如何判断是真卡住还是假死
sudo apt-mirror启动后没有实时进度条,新手常以为卡死而 Ctrl+C,结果破坏锁文件。正确监控方式:
# 启动同步(后台运行,避免 SSH 断开中断) sudo nohup apt-mirror > /var/spool/apt-mirror/var/sync.log 2>&1 & # 实时查看日志(关注最后 20 行,不是 tail -f 全文) sudo tail -20 /var/spool/apt-mirror/var/sync.log # 关键成功标志(出现即代表同步完成): # "End of sync" # "Running /var/spool/apt-mirror/var/clean.sh" # 查看磁盘占用(验证是否真同步了) sudo du -sh /var/spool/apt-mirror/mirror/mirrors.aliyun.com/ubuntu/ # Ubuntu 24.04.1 完整源(含 security/update)约 180GB,少于 100GB 说明同步不全避坑 / 常见问题 / 排查
现象 1:tail -20 sync.log显示Getting packages files...后停滞超30分钟
原因:外网源响应慢或丢包,apt-mirror 默认超时 300 秒,但不会报错。
解决:编辑/etc/apt/mirror.list,在config区块末尾添加set timeout 600(单位秒),再sudo apt-mirror。现象 2:同步完成后
du -sh显示只有 2GB,且mirror/下无dists/noble目录
原因:mirror.list中deb行的 codename 写成了noble-24.04或24.04,apt-mirror 无法匹配,静默跳过。
解决:grep "deb.*noble" /etc/apt/mirror.list确保所有 codename 是纯noble,删掉mirror/目录后重试。现象 3:
sync.log出现GPG error: ... NO_PUBKEY
原因:外网源公钥未导入,但 apt-mirror 不校验 GPG,此错误可忽略(不影响同步)。
解决:无需处理,同步完成后的 clean.sh 会自动处理。现象 4:
clean.sh执行时报Permission denied
原因:/var/spool/apt-mirror/var/clean.sh权限为 644,非可执行。
解决:sudo chmod +x /var/spool/apt-mirror/var/clean.sh,再手动运行一次。
4. Nginx 发布镜像:1.24.0 离线安装、软链接权限、default 配置硬核调优
同步完成只是第一步,90% 的“内网源不可用”问题出在 Nginx 发布层。Ubuntu 24.04.1 的 Nginx 1.24.0 默认禁用目录索引、SELinux(若启用)会拦截、/var/www权限模型变更。这一章不讲 Nginx 基础,只给绕过所有 Ubuntu 24.04.1 特有坑的发布方案。
4.1 Nginx 1.24.0 离线安装:依赖包顺序与 dpkg 强制覆盖
你拿到的.deb包列表(libgeoip1t64,libnginx-mod-*,nginx-common,nginx)必须按严格依赖顺序安装,否则dpkg报unmet dependencies。实测有效顺序:
# 创建安装目录(避免污染系统) sudo mkdir -p /opt/nginx-offline cd /opt/nginx-offline # 将所有 .deb 包放入此目录(确保文件名与下方一致) # libgeoip1t64_1.6.12-11.1build1_amd64.deb # libnginx-mod-http-geoip_1.24.0-2ubuntu7.1_amd64.deb # libnginx-mod-http-image-filter_1.24.0-2ubuntu7.1_amd64.deb # libnginx-mod-http-xslt-filter_1.24.0-2ubuntu7.1_amd64.deb # libnginx-mod-mail_1.24.0-2ubuntu7.1_amd64.deb # libnginx-mod-stream_1.24.0-2ubuntu7.1_amd64.deb # nginx-common_1.24.0-2ubuntu7.1_all.deb # nginx_1.24.0-2ubuntu7.1_amd64.deb # 按依赖链顺序安装(关键!) sudo dpkg -i libgeoip1t64_1.6.12-11.1build1_amd64.deb sudo dpkg -i libnginx-mod-http-geoip_1.24.0-2ubuntu7.1_amd64.deb sudo dpkg -i libnginx-mod-http-image-filter_1.24.0-2ubuntu7.1_amd64.deb sudo dpkg -i libnginx-mod-http-xslt-filter_1.24.0-2ubuntu7.1_amd64.deb sudo dpkg -i libnginx-mod-mail_1.24.0-2ubuntu7.1_amd64.deb sudo dpkg -i libnginx-mod-stream_1.24.0-2ubuntu7.1_amd64.deb sudo dpkg -i nginx-common_1.24.0-2ubuntu7.1_all.deb sudo dpkg -i nginx_1.24.0-2ubuntu7.1_amd64.deb # 修复可能的依赖缺失(Ubuntu 24.04.1 常见) sudo apt --fix-broken install -y注意:
nginx-common必须在nginx之前安装,否则nginx包会因缺少nginx-common依赖而失败。dpkg -i *.deb批量安装会乱序,必须单条执行。
4.2 软链接创建与权限固化:绕过 Ubuntu 24.04.1 的 /var/www 安全策略
Ubuntu 24.04.1 默认将/var/www设为root:root,且www-data用户无权读取mirror/目录。直接ln -s会 403。正确做法是用 bind mount 替代软链接(更安全、权限可控):
# 创建 Nginx 根目录(避免修改 /var/www) sudo mkdir -p /srv/apt-mirror # 使用 bind mount 将 mirror 目录挂载到 /srv/apt-mirror(权限继承自源目录) sudo mount --bind /var/spool/apt-mirror/mirror/mirrors.aliyun.com/ubuntu/ /srv/apt-mirror # 设置开机自动挂载(写入 /etc/fstab) echo "/var/spool/apt-mirror/mirror/mirrors.aliyun.com/ubuntu/ /srv/apt-mirror none bind 0 0" | sudo tee -a /etc/fstab # 验证挂载(应显示 /srv/apt-mirror 是 /var/spool/... 的挂载点) mount | grep apt-mirror为什么不用 ln -s?
Ubuntu 24.04.1 的 AppArmor profile 会阻止www-data访问/var/spool下的符号链接目标,即使权限 755 也会 403。bind mount 绕过此限制。
4.3 default 配置硬核调优:解决 403/404/500 的 5 个关键参数
/etc/nginx/sites-enabled/default是罪魁祸首。Ubuntu 24.04.1 的默认配置禁用autoindex、限制location匹配、未处理favicon.ico。生产环境必须改:
server { listen 80 default_server; listen [::]:80 default_server; root /srv/apt-mirror; index index.html; # 关键1:启用目录索引(否则访问 / 返回 403) autoindex on; autoindex_exact_size off; autoindex_format html; # 关键2:允许所有 URI 访问(apt 客户端请求 /dists/noble/InRelease 等) location / { try_files $uri $uri/ =404; } # 关键3:显式允许 .gpg .asc .gz .xz 等 apt 必需扩展名(Ubuntu 24.04.1 默认 deny) location ~* \.(gpg|asc|gz|bz2|xz|zst)$ { add_header Content-Type application/octet-stream; add_header Content-Disposition "attachment; filename=$1"; } # 关键4:禁用 favicon.ico 日志(减少无意义 404) location = /favicon.ico { log_not_found off; access_log off; } # 关键5:设置长超时(apt update 可能长达 5 分钟) client_max_body_size 0; client_header_timeout 300; client_body_timeout 300; send_timeout 300; }重启 Nginx 并验证服务状态
sudo systemctl restart nginx sudo systemctl status nginx # 确保 active (running) curl -I http://localhost/dists/noble/InRelease # 应返回 200 OK
避坑 / 常见问题 / 排查
现象 1:浏览器访问http://内网IP/返回403 Forbidden
原因:autoindex on;未开启,或root路径指向错误目录。
解决:确认root /srv/apt-mirror;且autoindex on;在server块内,sudo nginx -t测试配置。现象 2:
curl http://内网IP/dists/noble/InRelease返回404 Not Found
原因:location /块中try_files指令未正确匹配,或root路径少了一级(如指向/srv/而非/srv/apt-mirror)。
解决:ls -l /srv/apt-mirror/dists/noble/确认文件存在,sudo nginx -T | grep root确认 root 路径。现象 3:
apt update报The repository does not have a Release file
原因:Nginx 返回的InRelease文件被 gzip 压缩,但客户端未解压(常见于 ARM64 客户端)。
解决:在location ~* \.(gpg|asc|gz|bz2|xz|zst)$块中添加gzip off;。现象 4:
systemctl status nginx显示failed,日志bind() to 0.0.0.0:80 failed
原因:端口被占用(如 Apache、其他 Nginx 实例)。
解决:sudo ss -tulpn | grep ':80'查进程,sudo kill -9 PID杀掉,或改 Nginxlisten 8080;。
5. 客户端配置与验证:sources.list.d 替换、时间同步、GPG 密钥信任链
服务端跑通 ≠ 客户端能用。Ubuntu 24.04.1 客户端默认校验Release.gpg,且对系统时间极其敏感(误差 > 5 分钟直接拒绝)。这一章教你怎么让内网客户端一次配置,永久生效。
5.1 sources.list.d 配置:精准替换、避免全局污染
不要直接改/etc/apt/sources.list!Ubuntu 24.04.1 推荐用sources.list.d/管理。创建独立文件,避免与其他源冲突:
# 进入客户端机器(Ubuntu 24.04.1) sudo nano /etc/apt/sources.list.d/internal-apt.list内容(严格按格式,IP 替换为你的 Nginx 服务器 IP):
# 内网 APT 源(Ubuntu 24.04.1 Noble) deb http://192.168.1.100 noble main restricted universe multiverse deb http://192.168.1.100 noble-security main restricted universe multiverse deb http://192.168.1.100 noble-updates main restricted universe multiverse deb http://192.168.1.100 noble-backports main restricted universe multiverse注意:
http://后是 Nginx 服务器 IP,不是域名(内网 DNS 可能未配);路径为空,因为 Nginxroot指向的就是ubuntu/目录。
5.2 时间同步与 GPG 密钥:两个致命细节
时间同步:Ubuntu 24.04.1 的apt对Valid-Until字段校验极严。内网客户端时间必须与服务端误差 < 60 秒:
# 在客户端执行(假设服务端 IP 192.168.1.100 已运行 NTP 服务) sudo timedatectl set-ntp false sudo ntpdate 192.168.1.100 sudo timedatectl status | grep "System clock synchronized" # 输出 must be "yes"GPG 密钥信任:内网源没有公网 GPG 签名,必须禁用校验或导入服务端密钥。生产环境推荐禁用校验(安全由内网物理隔离保障):
# 创建 apt 配置禁用 GPG 校验(仅对内网源) sudo nano /etc/apt/apt.conf.d/99internal-no-gpg# 禁用内网源 GPG 校验 Acquire::Check-Valid-Until "false"; Acquire::AllowInsecureRepositories "true"; Acquire::AllowDowngradeToInsecureRepositories "true";为什么不用导入密钥?
Ubuntu 24.04.1 的apt-mirror不生成Release.gpg,它直接复制上游签名。内网客户端校验的是阿里云公钥,而你没连外网,自然失败。禁用校验是唯一可靠方案。
5.3 终极验证:从 update 到 install 的全流程压测
别只apt update就算成功。真正验证要走完:索引下载 → 包列表解析 → 包下载 → 安装。一个命令搞定:
# 清空缓存(避免旧索引干扰) sudo apt clean sudo rm -rf /var/lib/apt/lists/* # 执行完整流程(-o 后参数强制跳过 GPG,-y 自动确认) sudo apt update -o Acquire::Check-Valid-Until=false -o Acquire::AllowInsecureRepositories=true && \ sudo apt install -y --dry-run curl && \ echo "✅ 验证通过:update 成功,curl 包可解析" || echo "❌ 验证失败"预期输出:
Hit:1 http://192.168.1.100 noble InRelease(不是Ign:)Reading package lists... DoneBuilding dependency tree... DoneCalculating upgrade... Done0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.✅ 验证通过:update 成功,curl 包可解析
避坑 / 常见问题 / 排查
现象 1:apt update显示Ign:1 http://192.168.1.100 noble InRelease
原因:InRelease文件不存在或 Nginx 返回 404,客户端跳过此源。
解决:curl -I http://192.168.1.100/dists/noble/InRelease确认返回 200。现象 2:
apt update卡在Waiting for headers
原因:客户端 DNS 无法解析192.168.1.100(虽然 IP 可 ping 通),或防火墙拦截。
解决:sudo apt update -o Acquire::http::Timeout=10加超时,或telnet 192.168.1.100 80测试端口。现象 3:
apt install curl报Unable to locate package curl
原因:sources.list.d/internal-apt.list中deb行路径错误(如多了/ubuntu),或dists/noble/main/binary-amd64/Packages.gz未同步。
解决:curl http://192.168.1.100/dists/noble/main/binary-amd64/Packages.gz | gunzip | head -n 5确认包列表存在。
6. 验证跑通后的必做三件事:自动化同步、磁盘告警、客户端一键部署
装完不是终点,是运维的起点。我见过太多团队花两天搭好源,第三天就因磁盘爆满、同步中断、客户端配置不一致而返工。从那以后,我每次部署内网 APT 源,都强制走这三步——它们不是锦上添花,而是防止半夜被电话叫醒的后悔药。
6.1 自动化每日同步:crontab + 锁文件 + 邮件通知
apt-mirror同步不能手动跑,必须定时。但 Ubuntu 24.04.1 的 cron 默认不加载用户环境,apt-mirror会找不到mirror.list。正确写法:
# 编辑 root crontab sudo crontab -e# 每日凌晨 3:00 同步(避开业务高峰) 0 3 * * * /usr/bin/flock -n /var/spool/apt-mirror/var/mirror.lock /usr/bin/apt-mirror >> /var/spool/apt-mirror/var/cron.log 2>&1 # 每日 3:10 清理(同步后 10 分钟) 10 3 * * * /usr/bin/flock -n /var/spool/apt-mirror/var/mirror.lock /var/spool/apt-mirror/var/clean.sh >> /var/spool/apt-mirror/var/clean.log 2>&1为什么用 flock?
防止前次同步未完成,下次 cron 又触发,导致mirror/目录损坏。flock加锁,第二个任务直接退出。
6.2 磁盘空间告警:当 /var/spool 剩余 < 20GB 时发邮件
apt-mirror同步后不自动清理旧包,/var/spool/apt-mirror会持续膨胀。Ubuntu 24.04.1 的clean.sh只删dists/下过期索引,不删pool/中的包文件。必须加磁盘监控:
# 创建监控脚本 sudo nano /usr/local/bin/check-apt-mirror-disk.sh#!/bin/bash THRESHOLD=20 # GB CURRENT=$(df /var/spool/apt-mirror | awk 'NR==2 {print $4}' | awk '{printf "%.0f", $1/1024/1024}') if [ "$CURRENT" -lt "$THRESHOLD" ]; then echo "ALERT: /var/spool/apt-mirror only has ${CURRENT}GB left!" | mail -s "APT Mirror Disk Alert" admin@company.com fi# 添加执行权限并加入 cron(每小时检查) sudo chmod +x /usr/local/bin/check-apt-mirror-disk.sh sudo crontab -e # 添加:0 * * * * /usr/local/bin/check-apt-mirror-disk.sh6.3 客户端一键部署脚本:3 行命令完成所有客户端配置
给 100 台机器手动改sources.list.d?不现实。写一个幂等脚本,支持 SSH 批量执行:
# 保存为 deploy-client.sh(在服务端运行) #!/bin/bash CLIENT_IPS="192.168.1.101 192.168.1.102 192.168.1.103" # 替换为实际 IP APT_SERVER_IP="192.168.1.100" for ip in $CLIENT_IPS; do echo "Deploying to $ip..." ssh "root@$ip" " echo 'deb http://$APT_SERVER_IP noble main restricted universe multiverse' > /etc/apt/sources.list.d/internal-apt.list && echo 'deb http://$APT_SERVER_IP noble-security main restricted universe multiverse' >> /etc/apt/sources.list.d/internal-apt.list && echo 'deb http://$APT_SERVER_IP noble-updates main restricted universe multiverse' >> /etc/apt/sources.list.d/internal-apt.list && echo 'deb http://$APT_SERVER_IP noble-backports main restricted universe multiverse' >> /etc/apt/sources.list.d/internal-apt.list && echo 'Acquire::Check-Valid-Until \"false\";' > /etc/apt/apt.conf.d/99internal-no-gpg && echo 'Acquire::AllowInsecureRepositories \"true\";' >> /etc/apt/apt.conf.d/99internal-no-gpg && apt clean && rm -rf /var/lib/apt/lists/* && apt update -o Acquire::Check-Valid-Until=false 2>/dev/null " done执行前:确保服务端
~/.ssh/id_rsa.pub已分发到所有客户端root用户的~/.ssh/authorized_keys。
执行后:for ip in $CLIENT_IPS; do ssh root@$ip 'apt update -q | head -n 3'; done快速验证。
从那以后我每次部署内网 APT 源,都把这三步写进 checklist,打钩才交付。不是怕麻烦,是知道apt-mirror的黑匣子一旦出问题,排查成本远高于预防成本。希望帮到你。
本文还有配套的精品资源,点击获取