在生产环境中,服务器往往处于内网环境,无法直接连接互联网。这时,Ubuntu离线安装软件包就成为一项必备技能。例如,搭建离线的 Nginx 反向代理服务器,用于内部服务的负载均衡,就需要先离线安装 Nginx 及其依赖。 本文将深入探讨 Ubuntu 系统下离线安装软件包的各种方法,并分享实战中的避坑经验。
问题场景重现
假设我们需要在一台无法连接外网的 Ubuntu 服务器上安装一个软件包,比如 nginx。如果直接使用 apt install nginx 命令,会因为无法访问软件源而报错。
sudo apt install nginx
# 报错信息示例
E: Unable to locate package nginx
底层原理深度剖析
apt 是 Ubuntu 系统下常用的软件包管理工具,它依赖于软件源列表 (/etc/apt/sources.list) 中配置的地址来下载和安装软件包。当我们执行 apt install nginx 命令时,apt 会先从软件源列表中的地址下载 nginx 的软件包及其依赖,然后进行安装。
离线安装的核心思想是:将软件包及其依赖提前下载好,然后手动安装。
解决方案一:使用 apt-get download 和 dpkg
在可以连接外网的 Ubuntu 机器上下载软件包及其依赖。

可以使用
apt-get download命令下载软件包,但它只会下载指定的软件包,不会下载其依赖。因此,我们需要借助apt-get install --download-only --reinstall来下载所有依赖包到/var/cache/apt/archives/目录。为了获取 nginx 的所有依赖包,我们可以先尝试安装 nginx,然后利用 apt 自动解决依赖的功能,下载所有需要的 deb 包。sudo apt-get update # 更新软件包列表 sudo apt-get install --download-only --reinstall nginx # 只下载,不安装 sudo apt-get -d install --reinstall nginx # 为了获取完整的依赖关系,使用 -d 选项下载完成后,所有的
.deb文件都保存在/var/cache/apt/archives/目录下。将下载好的
.deb文件复制到离线机器上。可以使用
scp、U盘等方式将/var/cache/apt/archives/目录下的所有.deb文件复制到离线机器的某个目录下,比如/tmp/debs/。
在离线机器上安装软件包。
使用
dpkg -i命令安装软件包。注意,需要按照依赖关系的顺序依次安装,否则可能会因为缺少依赖而安装失败。可以借助gdebi命令自动解决依赖关系,但gdebi本身也可能需要先离线安装。cd /tmp/debs/ sudo dpkg -i *.deb # 尝试安装所有 deb 包 sudo apt-get -f install # 修复依赖关系如果
dpkg -i报错,提示缺少依赖,可以使用apt-get -f install命令尝试修复依赖关系。这个命令会尝试从已下载的.deb文件中解决依赖关系。
解决方案二:使用 apt-offline
apt-offline 是一个专门为离线安装软件包设计的工具。它可以自动生成一个签名文件,然后你在可以联网的机器上使用这个签名文件下载软件包及其依赖,最后再将下载好的文件复制到离线机器上进行安装。
在离线机器上安装
apt-offline。你需要先找到
apt-offline的.deb文件,然后使用dpkg -i命令安装。apt-offline本身也可能需要先离线安装其依赖。生成签名文件。
sudo apt-offline get update --apt-offline-signature update.sig这个命令会生成一个名为
update.sig的签名文件。
在可以连接外网的机器上使用签名文件下载软件包及其依赖。
sudo apt-offline get --apt-offline-signature update.sig --bundle apt-offline-bundle.zip这个命令会生成一个名为
apt-offline-bundle.zip的压缩包,里面包含了所有需要的软件包及其依赖。将
apt-offline-bundle.zip复制到离线机器上。在离线机器上安装软件包。
sudo apt-offline install apt-offline-bundle.zip
实战避坑经验总结
- 提前规划: 在部署离线环境之前,务必提前规划好需要安装的软件包及其依赖。可以使用虚拟机或 Docker 容器模拟离线环境,进行测试。
- 依赖关系: 离线安装最大的挑战在于解决依赖关系。
apt-offline可以简化这个过程,但仍然需要仔细检查依赖是否完整。 - 软件包版本: 确保下载的软件包版本与离线机器上的 Ubuntu 版本兼容。不同版本的软件包可能会存在兼容性问题。
- 软件源配置: 即使是离线安装,也建议在
/etc/apt/sources.list中配置正确的软件源。这样,apt-get -f install命令才能更好地解决依赖关系。 - 使用缓存服务器: 如果内网环境有多台 Ubuntu 服务器需要离线安装软件包,可以搭建一个内部的 apt 缓存服务器(例如使用
apt-cacher-ng)。这样,只需要在一台机器上下载软件包,其他机器就可以从缓存服务器上获取,节省带宽和时间。
例如,在搭建内部的 Docker Registry 时,经常会遇到离线安装 Docker 相关软件包的问题。 除了使用以上方法,还可以考虑直接将已经配置好的 Docker 镜像导出,然后导入到离线环境中,这通常比手动安装软件包更简单高效。
希望以上内容能帮助大家更好地解决 Ubuntu离线安装软件包 的问题。
冠军资讯
键盘上的咸鱼