本次介绍的是红帽系列的操作系统下载软件包用于离线暗转的方法,Debian系列的方式请自行搜索,这里不做介绍。
软件包的下载使用yum或dnf的downloadonly插件。这个插件是大多数现代 Linux 发行版(如 CentOS 7+, Fedora, RHEL 7+)默认包含的,所以你一般不需要额外安装。这个插件也是目前最直接、最推荐的方式。使用的时候需要添加--downloadonly 和 --downloaddir 这两个选项。
选项说明
- --downloadonly: 核心选项,告诉 yum 或 dnf 只下载软件包,不要进行安装或其他操作。
- --downloaddir=<目录路径>: 指定一个目录来存放下载好的 RPM 包。如果省略此选项,RPM 包会默认下载到 /var/cache/yum/ 目录下,推荐你指定一个有写权限的目录,比如你自己的家目录下的一个文件夹,这样方便查找。
- -y (可选): 表示 "yes",在需要确认时自动回答"是",避免交互式提示。在下载-only 模式下通常不需要,但加上也无妨。
另外还有一个命令也是推荐使用的,yumdownloader命令,下面分别介绍这几个命令的用法。
假设我们要下载一个名为 httpd 的软件包,并存放到我们创建的 my_downloads 文件夹中。
bash
# 在你的家目录下创建一个文件夹
mkdir -p ~/my_downloads
#使用 dnf (适用于 Fedora, CentOS 8+, RHEL 8+ 等):
# dnf 下载 httpd 包到 ~/my_downloads 目录
dnf install httpd --downloadonly --downloaddir=~/my_downloads
# 如果你的系统较老,使用 yum (适用于 CentOS 7, RHEL 7 等):
# yum 下载 httpd 包到 ~/my_downloads 目录
yum install httpd --downloadonly --downloaddir=~/my_downloads
如果想要下载已经安装的软件包的更新的离线安装包和依赖,可以使用如下命令:
bash
# 下载系统中 httpd 包的更新
dnf update httpd --downloadonly --downloaddir=~/my_downloads
# 或者
yum update httpd --downloadonly --downloaddir=~/my_downloads
命令的对应关系总结如下:
| 目的 | 命令 (使用 dnf) |
命令 (使用 yum) |
|---|---|---|
| 下载单个软件包 | sudo dnf install <包名> --downloadonly --downloaddir=<目录> |
sudo yum install <包名> --downloadonly --downloaddir=<目录> |
| 下载软件包及其依赖 | sudo dnf groupinstall "<环境组名>" --downloadonly --downloaddir=<目录> |
sudo yum groupinstall "<环境组名>" --downloadonly --downloaddir=<目录> |
| 下载软件包的更新 | sudo dnf update <包名> --downloadonly --downloaddir=<目录> |
sudo yum update <包名> --downloadonly --downloaddir=<目录> |
| 下载所有可用更新 | sudo dnf update --downloadonly --downloaddir=<目录> |
sudo yum update --downloadonly --downloaddir=<目录> |
接下来介绍一下yumdownloader命令的用法。
首先要明确一个核心概念:yumdownloader 不是一个 yum 的子命令,它是一个独立的命令行工具。它专门被设计用来解决"下载软件包及其依赖项"这一个核心问题,并且非常高效。
- yumdownloader 的核心作用与优势
yumdownloader 的主要目标是:从软件仓库(repository)中精确地下载一个或多个 RPM 软件包,并自动解决其所有依赖关系,将依赖包一并下载下来。
相比于 yum install --downloadonly 方式,yumdownloader 有几个显著的优势:
- 轻量级:它本身没有 yum 那么多的配置管理和解析逻辑,启动更快,专注于下载任务。
- 灵活性:提供了丰富的命令行选项,允许更精细地控制下载行为,例如不下载依赖、下载源码包等。
- 明确的结果:yumdownloader 只下载,不缓存。如果你指定了目录,所有 .rpm 文件都会明明白白地放在那里,不像 yum 会放到系统深层的缓存目录中。
接下来介绍一下yumdownloader的常用选项的详解
bash
# 创建一个下载目录
mkdir -p ~/downloaded_rpms
# 下载 httpd 包及其依赖到 ~/downloaded_rpms 目录
yumdownloader --destdir=~/downloaded_rpms httpd
--destdir=<目录路径>: 指定 RPM 包的下载目录。这是最重要的选项,强烈推荐始终使用它,否则包会下载到当前目录。注意--resolve是默认的,也可以显式的写在命令中,增加可读性。
bash
# 显式的写上选项--resolve,下载服务以及依赖包
yumdownloader --destdir=~/downloaded_rpms --resolve httpd
如果你明确知道只需要一个特定的包,不需要它的任何依赖(例如,你已经有了依赖包,或者只是为了分析包内容),可以使用 --resolve 的反向选项 --noresolve。
如果你的系统是 64 位的,但需要某个软件的 32 位版本,可以通过 --arch 选项指定。
bash
# 下载 32 位的 libwebkitgtk 包及其依赖
yumdownloader --destdir=~/downloaded_rpms --arch=i686 --resolve libwebkitgtk
如果你想为系统上已经安装的某个软件包重新下载其原始的 .rpm 安装文件。yumdownloader 提供了一个非常方便的 --url 选项来实现这个功能。
bash
# 假设系统中已安装了 docker-ce
# 查看其安装后的包名,通常是 docker-ce 和 docker-ce-cli 等
# 这里以确保下载的是备份了 .repo 文件中的源的路径准确的包
yumdownloader --destdir=~/downloaded_rpms --resolve --url docker-ce
--url: 这个选项告诉 yumdownloader 不仅要下载包,还要去找到原始仓库服务器上该包的 URL。这对于后续的离线安装或问题排查非常有帮助。不加 --url 时,它可能会从缓存下载,路径可能不指向官方源。