这个场景解决什么
内网服务器没有外网时,装包要先解决依赖闭包问题:在联网机器上把目标包连同它需要的全部依赖下载下来,再传输到目标机安装。临时应急可以用一次性传输的办法,长期方案则是自建内网仓库——前者容易漏依赖,后者一次搭好后续都省事。
基本信息
| 场景 | 无外网环境安装或升级软件包 |
|---|---|
| RPM 侧工具 | dnf download --resolve --alldeps;目标机用 dnf install 加本地文件 |
| DEB 侧工具 | apt-get install --download-only 或 apt-get download;目标机用 dpkg -i 加依赖补齐 |
| 长期方案 | createrepo_c 生成仓库元数据,内网静态服务,客户端加仓库配置 |
典型使用场景
- 隔离环境部署:生产网段无外网,需要一次性把所需软件带进去
- 版本锁定:内网仓库固定版本,避免不同机器装到不同版本
- 批量铺开:给几十台机器安装同一组包,用内网仓库比逐个拷贝可靠
- 应急补包:业务出故障需要立刻补一个工具,走一次性下载通道
- 审计要求:需要留存安装包的来源与版本记录
RPM 侧:下载全量依赖
RPM 侧:下载全量依赖
# 联网机(与目标机发行版、架构、版本一致)
dnf download --resolve --alldeps --destdir=/tmp/pkgs nginx -y
# 传输到目标机后离线安装
cd /tmp/pkgs && dnf install -y --disablerepo='*' ./*.rpm
rpm -qp --requires /tmp/pkgs/nginx*.rpm | head # 安装前可核对依赖清单
rpm -ivh /tmp/pkgs/nginx*.rpm # 不用 dnf 时的底层写法,不自动解依赖DEB 侧与内网仓库
DEB 侧与内网仓库
apt-get install --download-only -y nginx # 包落在 /var/cache/apt/archives/
ls /var/cache/apt/archives/*.deb
dpkg -i /tmp/debs/*.deb # 目标机安装(顺序不对会报缺依赖)
# 内网仓库(RPM)
createrepo_c /srv/repo # 生成仓库元数据
# 客户端新增 /etc/yum.repos.d/local.repo,baseurl 指向内网地址,并配置 gpgcheck
# 内网仓库(DEB)
cd /srv/repo && dpkg-scanpackages -m . > Packages && gzip -k Packages方案对照
| 方案 | 优点 | 局限 |
|---|---|---|
| 一次性下载依赖并传输 | 起效快,适合应急 | 容易漏依赖,跨版本时更麻烦 |
| 内网仓库(RPM/DEB) | 依赖自动解析,可版本化 | 需要一台常驻服务与定期同步 |
| 离线镜像同步 | 覆盖全量包,适合规模化 | 占用存储大,同步周期长 |
| 容器镜像替代交付 | 把依赖打包进镜像,隔离性好 | 需要容器运行时与镜像分发通道 |
下载依赖时联网机与目标机必须一致:发行版大版本、架构、以及启用的仓库都要对齐。el8 上下的包混用到 el9,依赖关系会直接冲突。
离线安装时禁用仓库要写清楚:--disablerepo='*' 是为了避免客户端尝试联网超时,漏写会让安装卡在等待网络,看起来像是「命令卡死」。