引言

Linux 系统安装完成后,除了网络配置,软件源的设置同样至关重要。软件源决定了系统从哪里获取、更新软件包,是进行软件安装与升级的前提基础。本文先演示 RPM 与 DEB 这两种 Linux 底层软件包格式的安装方法,继而介绍 yum 与 apt 这两种包管理器的基本操作,然后展开网络源的配置、将离线 ISO 挂载为本地源,最后,演示如何搭建一个私有镜像源。

RPM/DEB 包

RPM与DEB都是 Linux 系统下的安装包。RPM 格式主要应用于 Red Hat 系(例如 RHEL、CentOS、Rocky Linux、openEuler),而 DEB 格式则应用于 Debian 系(例如 Debian、Ubuntu)。这些包文件类似于 Windows 环境下的 .exe.msi 安装包。

在无法连接外网的离线环境或特定单机部署场景中,通常需要直接下载这类原始包。获取渠道一般为官方镜像站(如阿里云、清华大学开源软件镜像站)的特定版本目录,或是软件官网的 Release 页面。

RPM 包

这里以 Rocky Linux 9 来演示一下安装 Nginx ,镜像站选择阿里云的。

首先,在镜像站的软件仓库找到需要的 Nginx 的 RPM 包,在阿里云上面,Nginx 的包在https://mirrors.aliyun.com/rockylinux/9/AppStream/x86_64/os/Packages/n/这个路径下

这里选择nginx-1.20.1-24.el9.x86_64.rpm这个包来进行演示。

使用wgetcurl来下载这个包:

image-20260518154230315

接着,开始安装

# 这里的几个参数分别代表着:安装,显示详细信息,显示进度条
rpm -ivh nginx-1.20.1-24.el9.x86_64.rpm

image-20260518154553165

可以看到,这里提示了依赖的问题,说明缺少了这些依赖库。

使用 rpm -q nginx 来查询是否安装

image-20260518154802296

如图所示,没有安装,这个时候,需要先去安装缺少的依赖包,上面已经很明显地提示了,也可以通过命令来直接查看这个包需要哪些依赖:rpm -qpR nginx-1.20.1-24.el9.x86_64.rpm,参数分别代表:查询,本地 rpm 文件,列出这个包所有需要的依赖。

因为 rpm 包内多处脚本或者说模块重复声明了相同依赖所以会显示重复,用 rpm -qpR 包名 | sort -u 即可去重查看。

image-20260518160037102

由上文可以知道,目前缺少了nginx-core = 1.20.1-24.el9nginx-filesystem = 1.20.1-24.el9system-logos-httpd这几个包,2:是版本号前缀标记,不用管。根据这些名称,再去找到这些依赖进行下载安装。

# nginx-core = 1.20.1-24.el9
wget https://mirrors.aliyun.com/rockylinux/9/AppStream/x86_64/os/Packages/n/nginx-core-1.20.1-24.el9.x86_64.rpm
# nginx-filesystem = 1.20.1-24.el9
wget https://mirrors.aliyun.com/rockylinux/9/AppStream/x86_64/os/Packages/n/nginx-filesystem-1.20.1-24.el9.noarch.rpm
# 该包基于 RHEL9 编译依赖system-logos-httpd,而 Rocky9 将该包重命名为rocky-logos-httpd,二者功能是一致的,所以下载后者。
wget https://mirrors.aliyun.com/rockylinux/9/AppStream/x86_64/os/Packages/r/rocky-logos-httpd-90.16-1.el9.noarch.rpm

下载好后,先把依赖都安装了。

rpm -ivh nginx-filesystem-1.20.1-24.el9.noarch.rpm
rpm -ivh nginx-core-1.20.1-24.el9.x86_64.rpm
rpm -ivh rocky-logos-httpd-90.16-1.el9.noarch.rpm

依赖安装完毕后,就可以来安装最开始下载的 Nginx 的包了。

rpm -ivh nginx-1.20.1-24.el9.x86_64.rpm

image-20260518161837196

验证一下是否安装

rpm -q nginx

image-20260518161937017

出现这个样子就说明已经安装好了,可以用 nginx 的命令来确认一下。

image-20260518162051627

如果想卸载掉已安装的软件包的话,可以用 rpm -e nginx 来卸载。

DEB 包

这里以 Ubuntu 24.04 来演示一下安装 Nginx ,镜像站选择清华大学开源镜像站。

首先,在镜像站的软件仓库找到需要的 Nginx 的 DEB 包,在清华大学开源镜像站上,Nginx的包在https://mirrors.tuna.tsinghua.edu.cn/ubuntu/pool/main/n/nginx/这个路径下

这里选择nginx_1.18.0-6ubuntu14.11_amd64.deb这个包来进行演示。

使用wgetcurl来下载这个包。

wget https://mirrors.tuna.tsinghua.edu.cn/ubuntu/pool/main/n/nginx/nginx_1.18.0-6ubuntu14.11_amd64.deb

下载好后,开始安装,提前查看所需依赖可以用 dpkg -I <包名> | grep Depends

dpkg -i nginx_1.18.0-6ubuntu14.11_amd64.deb

image-20260518164808004

从图中可以看出,当前 nginx 主包需要安装nginx‑core/nginx‑full/nginx‑light/nginx‑extras中的任意一个包

版本在1.18.0‑6ubuntu14.11 ~ 1.18.0‑6ubuntu14.11.1之间,这里下载 nginx-core 并进行安装

wget https://mirrors.tuna.tsinghua.edu.cn/ubuntu/pool/main/n/nginx/nginx-core_1.18.0-6ubuntu14.11_amd64.deb
dpkg -i nginx-core_1.18.0-6ubuntu14.11_amd64.deb

image-20260518170453096

nginx-core 这个包也存在依赖没有安装,同样需要下载并安装

wget https://mirrors.tuna.tsinghua.edu.cn/ubuntu/pool/main/n/nginx/libnginx-mod-http-image-filter_1.18.0-6ubuntu14.11_amd64.deb
wget https://mirrors.tuna.tsinghua.edu.cn/ubuntu/pool/main/n/nginx/libnginx-mod-http-xslt-filter_1.18.0-6ubuntu14.11_amd64.deb
wget https://mirrors.tuna.tsinghua.edu.cn/ubuntu/pool/main/n/nginx/libnginx-mod-http-geoip2_1.18.0-6ubuntu14.11_amd64.deb
wget https://mirrors.tuna.tsinghua.edu.cn/ubuntu/pool/main/n/nginx/libnginx-mod-mail_1.18.0-6ubuntu14.11_amd64.deb
wget https://mirrors.tuna.tsinghua.edu.cn/ubuntu/pool/main/n/nginx/libnginx-mod-stream_1.18.0-6ubuntu14.11_amd64.deb
wget https://mirrors.tuna.tsinghua.edu.cn/ubuntu/pool/main/n/nginx/libnginx-mod-stream-geoip2_1.18.0-6ubuntu14.11_amd64.deb
wget https://mirrors.tuna.tsinghua.edu.cn/ubuntu/pool/main/n/nginx/nginx-common_1.18.0-6ubuntu14.11_all.deb
wget https://mirrors.tuna.tsinghua.edu.cn/ubuntu/pool/main/p/pcre3/libpcre3_8.39-12ubuntu0.1_amd64.deb


dpkg -i libnginx-mod-http-image-filter_1.18.0-6ubuntu14.11_amd64.deb
dpkg -i libnginx-mod-http-xslt-filter_1.18.0-6ubuntu14.11_amd64.deb
dpkg -i libnginx-mod-http-geoip2_1.18.0-6ubuntu14.11_amd64.deb
dpkg -i libnginx-mod-mail_1.18.0-6ubuntu14.11_amd64.deb
dpkg -i libnginx-mod-stream_1.18.0-6ubuntu14.11_amd64.deb
dpkg -i libnginx-mod-stream-geoip2_1.18.0-6ubuntu14.11_amd64.deb
dpkg -i nginx-common_1.18.0-6ubuntu14.11_all.deb
dpkg -i libpcre3_8.39-12ubuntu0.1_amd64.deb

执行安装时,又会发现缺少依赖,继续下载并安装

wget https://mirrors.tuna.tsinghua.edu.cn/ubuntu/pool/main/libx/libxslt/libxslt1.1_1.1.28-2.1_amd64.deb
dpkg -i libxslt1.1_1.1.28-2.1_amd64.deb
wget https://mirrors.tuna.tsinghua.edu.cn/ubuntu/pool/main/libm/libmaxminddb/libmaxminddb0_1.12.2-1_amd64.deb
dpkg -i libmaxminddb0_1.12.2-1_amd64.deb

下载并安装好所有依赖后,安装 nginx 主包

dpkg -i nginx_1.18.0-6ubuntu14.11_amd64.deb

image-20260518174243010

验证安装是否成功

dpkg -s nginx

image-20260518174401925

image-20260518174429386

如果想卸载掉已安装的软件包的话,可以用 dpkg -r nginx 或者 dpkg -P nginx 来卸载,前者会保留配置文件,后者是完全清除。

Yum/Apt 包管理器

直接用 rpmdpkg 手动装软件,最大的痛点就是需要解决“俄罗斯套娃”般的依赖关系。比如装 A 需要 B,装 B 需要 C 和 D,没完没了了。人工去镜像站一个个找这些包,不仅耗时间,还容易找错版本。

绝大多数时候,都是用包管理器来装软件:Yum(Red Hat 系,CentOS 7 及更早;新版本用 DNF,但是命令几乎一样)和 Apt(Debian / Ubuntu 系)。只需要输入安装命令,包管理器就会自动去预先配置好的软件源(仓库)里,计算出所有需要的依赖,然后一次性全部下载安装好。

Yum 包管理器

1.更新软件源缓存

刚装完系统或者源配置有变动,先刷新一下本地缓存:

yum makecache

这条命令会把服务器上的软件包信息拉取到本地,后续搜索和安装会更快。
CentOS 8 以上用 dnf makecache,但 yum 命令仍然可用,通过了软链接的方式。

2.查看系统中有哪些包可以更新

yum check-update

它会列出所有可以更新的包。如果只是想看有没有更新,而不是真的升级,用这个就可以。

3.升级所有可更新的软件包

yum update

这条命令在生产环境最好慎用,应该先在测试机跑一遍,避免版本更新后出现兼容性问题。如果只想升级某个特定包,比如 nginx,就在后面跟上名称即可。

yum update nginx

4.安装一个软件

比如安装 httpd

yum install httpd

输入 y 确认,包管理器就会自动下载 httpd 以及它依赖的所有包,一次性全部装好。
如果想安装一个本地已经有了的 .rpm 包,想让它自动去拉依赖的话,可以用:

yum localinstall ./xxx.rpm

5.反查命令属于哪个包

在日常使用中可能会遇到这种问题:例如执行 netstat 提示“command not found”,但又不知道这个命令属于哪个包,可以用:

yum provides netstat

输出显示 netstat 来自 net-tools 这个包。然后直接 yum install net-tools 就可以了。

6.查看一个包的详细信息

yum info nginx

可以看到版本、大小、简介等。

7.查看一个包的依赖关系

yum deplist nginx

会输出包括依赖的包名,可以知道这个包拉取了哪些东西。

8.列出所有可用和已安装的包

yum list

输出内容会很长,所以通常会配合 grep

yum list | grep nginx

9.卸载软件

yum remove nginx

会同时卸载依赖它的其他包(如果有的话),但不会卸载被其他包共享的依赖(比如 openssl 一般不会被删掉)。

10.清理缓存

yum clean all

当软件源变动或缓存报错时使用,然后使用 yum makecache 重新生成缓存。


Apt 包管理器

1.更新软件包索引列表

# 这条命令不会安装或升级任何软件,它只是去源服务器上拉取“有哪些包、哪个版本可用”的清单。
apt update

2.查看哪些包可以升级

apt list --upgradable

3.升级所有可升级的软件包

apt upgrade

会按照依赖关系安全地升级,如果想同时处理一些过时依赖的自动移除,可以用 apt full-upgrade

4.安装一个软件

比如安装 nginx

apt install nginx

包管理器会自动计算依赖,并提示将安装哪些额外包。

5.反查命令属于哪个包

例如,在执行 netstat 提示没有这个命令,需要先安装一个辅助工具 apt-file

apt install apt-file
apt-file update   # 更新它的数据库

然后就可以反查了:

apt-file search netstat

输出会显示 netstat 属于 net-tools 包。
另外,dpkg -S 也可以反查,但它只能查已经安装的文件,而 apt-file 可以查整个仓库里所有包。

6.查看一个包的详细信息

apt show nginx

可以看到版本、维护者、依赖、大小、描述等。

7.查看一个包的依赖关系

apt-cache depends nginx

或者更直观的树形依赖:

apt-cache rdepends nginx   # 反向依赖:看看哪些包依赖 nginx

8.列出所有可用的包

apt list

常用的是筛选已安装的:

apt list --installed

9.卸载软件

apt remove nginx           # 保留配置文件
apt purge nginx            # 连配置文件一起删干净

如果想顺便把自动安装且不再被需要的依赖也干掉:

apt autoremove

10.清理下载的包缓存

apt clean

包管理器下载的 .deb 文件默认放在 /var/cache/apt/archives/apt clean 会全部删掉。如果只想删过时的,用 apt autoclean

网络源

网络源的配置核心在于建立本地包管理器与远端软件仓库目录的正确映射。配置的关键在于辨识远端镜像站的目录结构,因为不同包管理器的仓库目录结构是不同的。

元数据目录

无论是 Yum 还是 Apt,包管理器都依赖一个核心的元数据索引来识别软件。因此,配置网络源的本质是:在镜像站中找到存放元数据的那个目录,将其 URL 填入配置文件

下面演示一下两类系统怎么定位。

Yum 体系:找 repodata

Yum 仓库的目录结构通常为:发行版/版本号/仓库类型/架构/,进入该目录后,应能看到 repodata 文件夹。这里以阿里巴巴开源镜像站(https://mirrors.aliyun.com/rockylinux/9/AppStream/x86_64/os/)为例演示一下:

image-20260601165121654

从图中可以看到,这个目录下有 repodata 文件夹,因此,这个目录的 URL 就是 baseurl

Apt 体系:找 dists

Apt 仓库的目录结构不同。镜像站上一般会有一个 dists 文件夹,里面按发行版代号(如 noblejammy)和组件(mainuniverse)组织。这里依旧以阿里巴巴开源镜像站(https://mirrors.aliyun.com/ubuntu/)来演示:

image-20260601165809671

从图中可以看到,这个目录下有 dists 文件夹,因此,这个目录的 URL 就是 sources.list 中需要填写的基准地址。

注意:刚安装的系统默认软件源通常有效,但直接安装软件仍可能失败,常见原因之一是镜像站的软件包索引尚未同步到最新版本。此时应先执行索引更新操作(yum makecacheapt update)。若更新后仍无法安装,再进一步检查软件源配置是否正确。

下面分别演示一下两类系统的网络源配置步骤:

Yum 体系网络源配置

一键配置

主流镜像站通常会提供现成的 .repo 配置文件,直接用 wget 下载下来就能用:

# 阿里云 CentOS 7 源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

执行完后,清除并重建本地缓存。

yum clean all
yum makecache

如果镜像站没有提供现成配置,或者想自己定制,可以参考下面的手动配置方式。

手动配置

在开始配置之前,需要了解一下 Yum 仓库中常见的几个概念:

使用变量可以让同一个 .repo 文件在不同架构或不同版本的系统中通用。例如:
baseurl=https://mirrors.aliyun.com/rockylinux/$releasever/AppStream/$basearch/os/

不同镜像站的具体目录名称可能略有差异,但核心逻辑是一致的。

首先,进入配置目录。 对于 Yum 来说,配置文件通常存放在 /etc/yum.repos.d/ 目录下,以 .repo 结尾。

# 进入配置目录
cd /etc/yum.repos.d/
# 为了避免干扰,先将自带的网络源配置备份,这是因为很多镜像的默认软件源配置的仓库地址是在国外的,不太稳定或已经被废弃。
mkdir /etc/yum.repos.d/backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/

接着,创建并编辑一个以 .repo 结尾的配置文件。以阿里云镜像站为例,操作系统为 Rocky Linux 9,仓库类型为 AppStream,架构为 x86_64。

# 文件路径: /etc/yum.repos.d/Rocky9-AppStream.repo

# repository ID,用来区分不同源的内部标识,在整个 .repo 文件中唯一
[rocky9-appstream]
# 源的名称,可以自定义
name=Rocky Linux $releasever AppStream - $basearch
# baseurl 指向在镜像站上找到的、包含 repodata 文件夹的那个路径
# $releasever 自动替换为系统版本号(如9),$basearch 自动替换为系统架构(如x86_64)
baseurl=https://mirrors.aliyun.com/rockylinux/$releasever/AppStream/$basearch/os/
# 是否启用这个源(1为启用,0为禁用)
enabled=1
# 是否校验软件包签名
gpgcheck=1
# 校验密钥的地址
gpgkey=https://mirrors.aliyun.com/rockylinux/RPM-GPG-KEY-Rocky-9

image-20260601174820290

BaseOS 同理,只需将路径中的 AppStream 替换为 BaseOS 即可。

# 文件路径: /etc/yum.repos.d/Rocky9-BaseOS.repo

[rocky9-baseos]
name=Rocky Linux $releasever BaseOS - $basearch
baseurl=https://mirrors.aliyun.com/rockylinux/$releasever/BaseOS/$basearch/os/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/rockylinux/RPM-GPG-KEY-Rocky-9

image-20260601174914835

最后,清除并重建本地缓存。

yum clean all
yum makecache

Apt 体系网络源配置

首先,备份系统原有的数据源配置文件。

cp /etc/apt/sources.list /etc/apt/sources.list.bak

接着,修改配置文件,填入包含 dists 目录的远端镜像站路径。

# 文件路径: /etc/apt/sources.list
# 格式:类型 镜像站URL 发行版代号 软件分类分支
deb https://mirrors.aliyun.com/ubuntu/ noble main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ noble-updates main restricted universe multiverse

image-20260519154034786

也可以用 sed 直接替换源地址

# 通常默认源地址是http://archive.ubuntu.com,这里替换为阿里云镜像地址
sed -i 's|http://archive.ubuntu.com|https://mirrors.aliyun.com|g' /etc/apt/sources.list

最后,更新本地索引列表。

apt update

离线 ISO 源

如果服务器内网或隔离环境中,没有任何外网权限,网络源就彻底失效了。这时候,系统 ISO 镜像文件是最直接的本地基础软件库。

注意:通常系统镜像中包含大量基础组件,但默认状态下包管理器并不会自动检索光盘。必须进行手动挂载,并将源文件显式指向挂载路径(file://

下面我将用 VMware 虚拟机 来演示整个过程:如何把 ISO 文件作为虚拟光驱连进系统,找到光驱设备,挂载它,查看里面有哪些包,然后再配置本地源。

Yum 体系本地 ISO 源配置

首先在 VMware 中选择对应的那一台虚拟机,这里我使用Rocky 9.5 的那一台

打开虚拟机设置,CD/DVD 驱动器,勾选“启动时连接”,然后选择“使用 ISO 映像文件”,浏览到镜像文件。

image-20260520110611230

然后启动虚拟机,执行命令

lsblk

image-20260520110821753

这个 sr0 就是虚拟光驱设备,大小为 1.8G,类型是 rom。也可以查看 /dev/cdrom ,通常是软链接指向 sr0

ls -l /dev/cdrom

image-20260520111027817

接着,创建挂载点并挂载光驱

mkdir -p /mnt/cdrom
mount /dev/sr0 /mnt/cdrom

需要卸载挂载时,使用umount /mnt/cdrom

挂载成功后,df -hlsblk 能看到 /mnt/cdrom

image-20260520111541496

ISO 挂载后,里面的包一般来说,在CentOS 7 及之前的是存放在 Packages 里面的,而在CentOS 8及其之后,一般是存放在 BaseOS/Packages/ 或者 AppStream/Packages/里面的。

ls /mnt/cdrom/

image-20260520111947893

本次实验使用的是 Rocky Linux 9.5 Minimal(最小化)系统镜像。按照常规经验,Red Hat 9 系列的 RPM 包应该规整地存放在 BaseOS/Packages/ 目录下。但当我切进去后发现里面空空如也,经过一番排查,最终发现 Minimal 镜像将所有的软件包和元数据全部精简并归档在了 /mnt/cdrom/minimal/Packages/ 目录下。

ls /mnt/cdrom/minimal/Packages/ | wc -l

image-20260520112738347

可以看到这个镜像有 610 个包。

如果想知道某个包是否存在,比如 vim,可以在挂载目录下用 find 配合 grep 搜索:

find /mnt/cdrom/minimal/ -name "*.rpm" | grep -i vim

image-20260520112934387

这样就能知道当前 ISO 里到底有哪些软件,能不能满足需求了。

接下来配置一下 Yum 本地源

先移走原有的网络源配置,防止干扰:

mkdir /tmp/repo_bak
mv /etc/yum.repos.d/*.repo /tmp/repo_bak

新建一个本地源配置文件:

vi /etc/yum.repos.d/local.repo
[local-minimal]
name=Local Rocky Minimal Appstream
baseurl=file:///mnt/cdrom/minimal
enabled=1
gpgcheck=0

需要注意的是,如果 ISO 是 CentOS 8 及其之后的话,它一般是有嵌套结构的(BaseOS + AppStream),需要分别配置两个 repo,指向各自目录下的 repodata 所在位置,那样的话就按照下面这样配置。

[local-BaseOS]
name=Local BaseOS
baseurl=file:///mnt/cdrom/BaseOS
enabled=1
gpgcheck=0

[local-AppStream]
name=Local AppStream
baseurl=file:///mnt/cdrom/AppStream
enabled=1
gpgcheck=0

刷新缓存并测试

yum clean all
yum makecache

然后尝试安装一个已知存在于 ISO 里的包,这里为了方便展示,选择 tcpdump 命令,先验证一下我是没有提前安装的。

image-20260520141944976

接着确认一下 ISO 里面是存在这个包的

image-20260520142130111

最后,开始安装

image-20260520142259428

可以看到,安装成功了,说明本地源配置成功了。

Apt 体系本地 ISO 源配置

这里以 Ubuntu 24.04 为例,先选择对应的虚拟机,然后进入虚拟机设置,CD/DVD,使用 ISO 映像文件,选择镜像文件。

启动虚拟机,执行命令

lsblk

image-20260520143425958

同样会看到了 sr0,类型为 rom。或者:

ls -l /dev/cdrom

image-20260520143616553

接着,创建挂载点并挂载

mkdir -p /mnt/cdrom
mount /dev/sr0 /mnt/cdrom

image-20260520143809792

挂载成功后,ls /mnt/cdrom 能看到 pool/ 目录,这是因为 Ubuntu 的软件包都放在 pool/ 下,按首字母分类。

Ubuntu 的 ISO 里,deb 包分布在 pool/main/pool/restricted/ 等子目录下。

find /mnt/cdrom/pool/ -name "*.deb" | wc -l

image-20260520144841336

如果想知道某个包是否存在,比如 ntfs-3g,可以在挂载目录下用 find 配合 grep 搜索:

find /mnt/cdrom/ -name "*.deb" | grep -i ntfs-3g

image-20260520145708841

由于我用的是 Ubuntu Server ISO ,它本身包含的包就很少,所以选择了 ntfs-3g 来演示。

接着来配置一下 Apt 本地源,Apt 提供了专门的工具 apt-cdrom,可以自动识别挂载的光盘并写入源列表:

apt-cdrom -m -d=/mnt/cdrom add

执行后,它会扫描 /mnt/cdrom,找到 dists/ 目录,然后在 /etc/apt/sources.list 里自动添加一行,类似:

deb file:///mnt/cdrom noble main restricted

也可以选择手动编辑 /etc/apt/sources.list,把其它网络源临时注释掉,添加上面这一行。

注意:Ubuntu ISO 的仓库组件通常是 mainrestricted。可以先 ls /mnt/cdrom/pool/ 看看有哪些组件目录。

这里移除一下 /etc/apt/sources.list.d/ 下的配置,避免干扰

mv /etc/apt/sources.list.d/* /tmp

更新索引并测试

apt update

然后安装一个存在于 ISO 里的包,比如 amd64-microcode,先验证一下,是没有安装的且 ISO 里面是有的。

dpkg -s amd64-microcode

image-20260520152948383

image-20260520153128978

apt install amd64-microcode

image-20260520153231678

可以看到,安装成功,说明本地源配置成功了。

定制软件仓库镜像

当面对已经上线运行、但处于完全断网环境的服务器时,将特定业务所需的全部级联依赖包提前收集,并制作成专用的软件仓库镜像进行分发,是最方便的方式。

核心逻辑是:在联网机器上下载好完整的依赖包,使用索引工具在本地生成元数据,最后利用光盘镜像制作工具打包。

Yum 体系定制软件仓库镜像

首先,在联网机器上,下载需要用到的软件及其所有级联依赖包到指定目录,不进行安装。如果在上一节中配置了离线 ISO 源,需要改回去。

mkdir -p /tmp/custom_iso
yum install -y --downloadonly --downloaddir=/tmp/custom_iso nginx redis

接着,安装本地索引工具,并在包存放目录下生成 repodata 元数据。

yum install -y createrepo
createrepo /tmp/custom_iso/

最后,安装光盘镜像制作工具 genisoimage,将整个目录打包为 ISO 文件。

yum install -y genisoimage

# -R 启用 Rock Ridge 扩展(保留 Linux 文件属性)
# -J 启用 Joliet 扩展(确保长文件名不被截断)
# -v 显示打包详细过程
# -o 指定输出的 ISO 文件路径
genisoimage -R -J -v -o /root/custom.iso /tmp/custom_iso/

注意:以这种方式生成的 ISO 镜像,内部已自带 repodata 索引。将它挂载后,本地 .repo 配置文件中的 baseurl 指向挂载点路径即可,可以参考配置离线ISO源的那一个章节。

Apt 体系定制软件仓库镜像

在 Apt 体系下,批量下载一个软件及其完整的依赖树稍微有些棘手。因为默认的 apt-get download 命令只会下载指定的那个包本身,并不会自动下载它的依赖包。为了打破这一限制,同时规避旧缓存的污染,这里使用 apt-get install -d 并配合 -o 参数执行临时路径重定向,从而一键将所需的高频组件及其全量级联依赖包完整收集。

首先,在联网机器上创建工作目录,通过临时重定向缓存路径批量拉取高频组件:

# 创建包的存放目录
mkdir -p /tmp/custom_apt_iso/packages

# -d 是 --download-only 的缩写,表示只下载、不安装,利用 Dir::Cache::Archives 强行将落盘路径改为目标工作目录
apt-get install -d -y -o Dir::Cache::Archives=/tmp/custom_apt_iso/packages \
  nginx redis

然后,进入工作根目录,使用 dpkg-scanpackages 扫描包并生成 Packages.gz 压缩索引。

# 安装用于生成索引的开发工具包
apt-get install -y dpkg-dev
# 切换到工作根目录
cd /tmp/custom_apt_iso
# 扫描 packages/ 目录下的所有 deb 包,并将元数据通过 gzip 压缩为 Packages.gz
dpkg-scanpackages packages /dev/null | gzip > Packages.gz

最后,利用 genisoimage 工具将整个目录结构打包。

apt-get install -y genisoimage
genisoimage -R -J -v -o /root/ubuntu-nginx-custom.iso /tmp/custom_apt_iso/

值得注意的是:在离线服务器挂载该自定义 Apt ISO 镜像后,修改 /etc/apt/sources.list 时必须加上 [trusted=yes] 参数(例如:deb [trusted=yes] file:///mnt/cdrom /),因为本地手打的专属包索引默认没有配置 GPG 密钥签名,必须显式跳过签名校验,包管理器才能正常读取。

这里有一个底层逻辑需要注意dpkg-scanpackages 工具是在根目录下扫描 packages 目录的,因此它记录的软件相对路径都会带有 packages/ 前缀(如 packages/nginx.deb)。我们将 Packages.gz 生成在光盘根目录下,并让客户端直接指向根目录 /,包管理器在拼接路径时(光盘根目录 + 相对路径前缀)就能做到 100% 精准匹配,绝不报 404 错误。

私有镜像源

挂载 ISO 适合机器比较少的情况。但如果有几十甚至上百台机器,难道每台都要挂载 ISO 一遍吗?显然不是,可以搭建一台基于 HTTP 协议的私有镜像服务器。

搭建私有源的关键,不在于包放在哪里,而在于生成元数据索引。没有索引,一堆包放在那里,包管理器也只当它们是普通的废文件。

Yum 体系私有源搭建

首先,在服务端创建存放 RPM 包的目录,并归档相关安装包。

# 存放包的目录
mkdir -p /data/repo/rocky9
# 下载需要的 RPM 包,或者把已经准备好的包传进去
yum install -y --downloadonly --downloaddir=/data/repo/rocky9 nginx redis

接着,安装索引生成工具并构建元数据索引,生成 repodata 目录。

yum install -y createrepo
# 执行后,该目录下会多出一个 repodata 文件夹
createrepo /data/repo/rocky9/

然后,配置 Nginx 将该目录通过 HTTP 协议暴露,然后重载 Nginx。

server {
    listen 80;
    server_name 192.168.92.129;
    location / {
        root /data/repo;
        autoindex on; # 开启目录列表浏览功能
    }
}
systemctl reload nginx

最后,在内网客户端机器上配置 .repo 文件指向该服务端地址,并刷新缓存。

# 文件路径: /etc/yum.repos.d/internal.repo
[internal]
name=Internal Private Repo
baseurl=http://192.168.92.129/rocky9
enabled=1
gpgcheck=0
yum clean all
yum makecache

Apt 体系私有源搭建

首先,在服务端创建存放 DEB 包的目录并归档文件。

mkdir -p /data/repo/ubuntu/packages
cd /data/repo/ubuntu/packages
# 下载需要的 DEB 包,或者把已经准备好的包传进去
# -d 是 --download-only 的缩写,表示只下载、不安装,利用 Dir::Cache::Archives 强行将落盘路径改为目标工作目录
apt-get install -d -y -o Dir::Cache::Archives=/data/repo/ubuntu/packages \
  nginx redis

接着,安装专用索引工具,扫描软件包并生成兼容的 Packages.gz 压缩索引。

apt-get install -y dpkg-dev
cd /data/repo/ubuntu
dpkg-scanpackages packages /dev/null | gzip > packages/Packages.gz

然后,配置 Nginx 暴露该静态目录。

server {
    listen 80;
    server_name 192.168.92.130;
    location / {
        root /data/repo;
        autoindex on; # 开启目录列表浏览功能
    }
}

最后,在内网客户端机器上配置 sources.list,指向服务端的 HTTP 映射路径,并更新索引。

# 文件路径: /etc/apt/sources.list
deb [trusted=yes] http://192.168.92.130/ubuntu/ packages/
apt update

更新索引无报错后,即可在客户端直接执行 apt install nginx,此时系统将自动通过你搭建的 HTTP 私有源拉取并完成全量依赖的安装。