
1. 项目背景与核心需求解析最近在折腾一台新装的 CentOS Stream 9 服务器第一件事就是配置软件源。默认的官方源在国内访问速度慢得让人抓狂一个简单的dnf update都能卡成幻灯片。这几乎是所有国内 Linux 用户无论是运维、开发者还是爱好者上手新系统后必做的“开光”操作。把默认的国外源换成国内的镜像源比如阿里云、清华、网易这些下载速度能从几KB/s飙升到几十MB/s体验完全是天壤之别。这个操作看似简单就是替换几个配置文件但里面其实有不少细节和坑。尤其是在 CentOS Stream 9 这个相对较新的版本上它的仓库结构和命名规则与 CentOS 7/8 有些不同直接照搬老版本的配置方法大概率会出错导致dnf命令报各种“找不到仓库”、“元数据无效”的错误。更麻烦的是如果源配置错了后续安装任何软件比如你想装的 MySQL、Git、Node.js、JDK 甚至是一些开发环境像 VSCode、PyCharm 的依赖都会失败整个系统就“瘸了”。所以今天我就来手把手拆解一下在 CentOS Stream 9 上如何一步到位、干净利落地将 yum/dnf 源切换为阿里云镜像源。我会把每一步的原理、为什么要这么做、以及可能遇到的坑都讲清楚。无论你是刚接触 Linux 的新手还是习惯了 CentOS 7 想迁移到新版本的老手跟着做一遍以后配置源就再也不是问题了。2. CentOS Stream 9 的仓库架构与阿里云镜像解析在动手改配置之前我们必须先搞清楚 CentOS Stream 9 的软件仓库到底是怎么组织的以及阿里云镜像站是如何映射这些仓库的。知其然更要知其所以然这样才能在配置出错时自己排查而不是一味地复制粘贴。2.1 理解 CentOS Stream 9 的仓库组成CentOS Stream 9 的官方软件仓库主要分为以下几个核心部分BaseOS: 这是系统最基础、最核心的软件包仓库。包含了启动系统、运行基本命令行环境所必需的所有软件包比如内核 (kernel)、系统库 (glibc)、包管理器 (dnf、rpm) 本身等。这个仓库的软件版本相对稳定不会频繁进行大版本更新。AppStream: 这是“应用流”仓库是 CentOS/RHEL 8 之后引入的重要概念。它包含了大量的用户级应用程序、运行时环境、开发工具和数据库等。比如你想安装的nginx,python3.9,mariadb,git,nodejs等软件都在这里。AppStream 的精妙之处在于它允许同一个软件如 Python同时提供多个主要版本例如 python3.9 和 python3.11并通过“模块”(module) 来管理用户可以选择启用哪个版本的流(stream)。Extras: 额外软件包仓库包含一些不隶属于上述两个主要仓库但又被广泛需要的软件。一些第三方驱动、额外的工具可能会放在这里。CRB(CodeReady Linux Builder): 在 RHEL 中称为“CodeReady Builder”在 CentOS 中通常对应PowerTools或类似的仓库。它包含了用于构建其他软件包所需的开发库和工具链比如gcc-c,make,cmake等更完整的版本。如果你需要从源码编译软件或者某些软件包依赖了这里面的库就需要启用它。当你执行dnf repolist命令时就能看到系统当前启用的仓库列表。默认的官方源地址是mirror.centos.org对于国内用户来说延迟高、带宽小。2.2 阿里云开源镜像站的目录结构阿里云维护了一个非常全面的开源软件镜像站 (mirrors.aliyun.com)。对于 CentOS Stream 9其镜像路径遵循一个清晰的规则。首先访问https://mirrors.aliyun.com/centos/你会看到很多目录。对于 CentOS Stream 9关键目录是centos-stream/而不是老版本用的centos/。这一点非常重要配错了路径就全错了。进入https://mirrors.aliyun.com/centos-stream/你会看到类似这样的结构centos-stream/ ├── 9-stream/ │ ├── BaseOS/ │ ├── AppStream/ │ ├── extras/ │ └── crb/ (可能对应PowerTools等) └── ... (其他版本)这个9-stream/目录就是 CentOS Stream 9 所有仓库的根目录。阿里云镜像站会实时或定期从上游官方源同步这些目录下的所有 RPM 包和元数据。所以我们的目标就是把系统里所有指向mirror.centos.org的仓库配置文件其baseurl或mirrorlist替换成指向mirrors.aliyun.com/centos-stream/9-stream/下对应目录的地址。注意CentOS Stream 的生命周期和版本号与传统的 RHEL/CentOS 略有不同。9-stream表示的是 Stream 9 的持续更新流它始终指向当前最新的 9.x 版本。因此在配置中我们使用$releasever变量或者直接写9-stream都是可以的阿里云镜像站也同时支持这两种路径格式。为了清晰和稳定我推荐在配置中直接使用9-stream。3. 实战备份与配置阿里云源全流程理论清楚了现在开始动手。整个过程可以分为三步备份原有配置、下载阿里云提供的现成配置文件、验证配置。我会详细解释每个命令的作用。3.1 第一步至关重要的备份操作在修改任何系统关键配置之前备份是铁律。这能让你在操作失误时一键回滚到原始状态。# 切换到 yum/dnf 仓库配置文件的目录 cd /etc/yum.repos.d/ # 创建一个备份目录比如以日期命名 sudo mkdir -p repo_backup_$(date %Y%m%d) # 将所有现有的 .repo 文件移动到备份目录 sudo mv *.repo repo_backup_$(date %Y%m%d)/为什么这么做/etc/yum.repos.d/目录下所有以.repo结尾的文件都会被dnf读取。CentOS Stream 9 默认会有好几个.repo文件例如CentOS-Stream-AppStream.repo,CentOS-Stream-BaseOS.repo,CentOS-Stream-Extras.repo等。直接移动而不是删除是因为万一阿里云源暂时不可用或者新配置有问题你可以快速恢复sudo mv repo_backup_xxxx/*.repo ./。执行完上述命令后/etc/yum.repos.d/目录应该是空的除了你刚建的备份目录。此时运行dnf repolist会显示没有任何仓库启用这是正常的。3.2 第二步下载并应用阿里云官方仓库配置文件阿里云镜像站非常贴心为每个主流系统版本都提供了预配置好的.repo文件。我们直接下载即可这比自己手动编写要准确、高效得多。# 下载 CentOS Stream 9 的阿里云源配置文件压缩包 sudo curl -o /etc/yum.repos.d/CentOS-Stream-Aliyun.repo https://mirrors.aliyun.com/repo/Centos-stream-9.repo命令拆解与注意事项curl -o 文件路径 URL:-o参数指定将下载的内容输出到指定文件。这里我们直接下载到目标目录/etc/yum.repos.d/下并命名为CentOS-Stream-Aliyun.repo。名字可以自定义但后缀必须是.repo。URL 是关键https://mirrors.aliyun.com/repo/Centos-stream-9.repo这个地址是阿里云官方为 CentOS Stream 9 维护的配置文件。请注意Centos的 ‘C’ 是大写stream和9之间有一个短横线-并且文件名是9.repo而不是9-stream.repo。这个文件内部已经帮我们处理好了版本变量和路径映射。权限问题由于/etc/yum.repos.d/是系统目录所以必须使用sudo以 root 权限执行下载和写入操作。下载完成后让我们查看一下这个文件的内容理解它做了什么sudo cat /etc/yum.repos.d/CentOS-Stream-Aliyun.repo你会看到类似以下的内容节选[baseos] nameCentOS Stream $releasever - BaseOS - mirrors.aliyun.com baseurlhttps://mirrors.aliyun.com/centos-stream/$stream/BaseOS/$basearch/os/ https://mirrors.aliyun.com/centos-stream/$stream/BaseOS/$basearch/os/ gpgcheck1 enabled1 gpgkeyhttps://mirrors.aliyun.com/centos-stream/RPM-GPG-KEY-CentOS-Official [appstream] nameCentOS Stream $releasever - AppStream - mirrors.aliyun.com baseurlhttps://mirrors.aliyun.com/centos-stream/$stream/AppStream/$basearch/os/ https://mirrors.aliyun.com/centos-stream/$stream/AppStream/$basearch/os/ gpgcheck1 enabled1 gpgkeyhttps://mirrors.aliyun.com/centos-stream/RPM-GPG-KEY-CentOS-Official核心配置解读[baseos]和[appstream]: 这是仓库的ID在系统中必须唯一。name: 仓库的描述信息会显示在dnf repolist的输出里。baseurl: 这是最重要的配置项指明了软件包的实际下载地址。可以看到它使用了变量$stream: 这个变量在阿里云的这个文件里被巧妙地定义了通常在文件开头它会被解析为9-stream。$basearch: 自动识别你的系统架构如x86_64或aarch64。所以最终的下载路径就是https://mirrors.aliyun.com/centos-stream/9-stream/BaseOS/x86_64/os/与我们之前分析的目录结构完全吻合。gpgcheck1: 启用GPG签名检查。这是一个关键的安全特性确保下载的软件包来自可信源且未被篡改。必须保持为1。gpgkey: 指定用于验证签名的公钥地址。阿里云镜像站也同步提供了官方的GPG密钥。enabled1: 启用该仓库。这个配置文件通常已经包含了baseos,appstream,extras,crb等所有常用仓库并且都指向了阿里云镜像。3.3 第三步清理缓存并测试新源配置文件就位后需要让dnf重新读取并下载元数据。# 清理旧的缓存数据避免新旧元数据冲突 sudo dnf clean all # 建立新的缓存从阿里云源下载所有仓库的元数据软件包列表、依赖关系等 sudo dnf makecachednf makecache过程详解这个命令会依次连接你在.repo文件中配置的所有enabled1的仓库的baseurl下载repomd.xml等元数据文件。你会看到终端开始滚动输出显示正在下载各个仓库的元数据CentOS Stream 9 - BaseOS - mirrors.aliyun.com [ ] --- B/s | 0 B --:-- ETA如果网络通畅且配置正确这个过程会非常快相比官方源。完成后会提示 “元数据缓存已建立”。关键验证步骤查看启用的仓库运行dnf repolist。你应该能看到来自mirrors.aliyun.com的baseos,appstream等仓库并且状态是 “启用” 的。这证明配置文件被正确读取。进行一次试更新运行sudo dnf update --refresh。--refresh参数会强制检查元数据是否最新即使刚做完makecache。这个命令会列出所有可更新的软件包。如果它能正常列出包而不报错如“无法下载元数据”、“仓库不可用”并且下载速度显著提升那就说明阿里云源配置成功了尝试安装一个软件用一个常见的软件来最终测试比如sudo dnf install -y wget。如果能够快速下载并安装成功那就是最好的证明。4. 常见问题排查与深度优化配置即使按照上述步骤有时也会遇到问题。此外对于一些特殊需求我们还可以对源配置进行优化。4.1 配置后dnf命令报错排查指南如果dnf makecache或dnf update失败别慌按以下思路排查错误1: “Could not resolve host: mirrors.aliyun.com” 或 “Network is unreachable”原因网络连接问题DNS解析失败或服务器无法访问阿里云。排查测试网络连通性ping -c 4 114.114.114.114国内DNS。如果能通说明网络是好的。测试DNS解析nslookup mirrors.aliyun.com。如果解析不出IP需要检查/etc/resolv.conf文件确保里面有可用的DNS服务器地址如nameserver 114.114.114.114或nameserver 8.8.8.8。如果公司有代理或防火墙可能需要配置系统代理。错误2: “Status code: 404 for https://... (IP: 443)”原因baseurl配置的路径错误阿里云镜像站上没有对应的目录。这是最常见的问题往往是因为用了错误的版本号或路径格式。排查仔细检查下载的.repo文件中的baseurl。手动在浏览器中打开这个baseurl地址去掉$basearch/os/部分看看是否能看到一个文件列表页面。例如打开https://mirrors.aliyun.com/centos-stream/9-stream/BaseOS/你应该能看到x86_64/等架构目录。确认你的系统版本cat /etc/redhat-release或cat /etc/os-release。确保你下载的.repo文件版本与之匹配CentOS Stream 9 就用9.repo。检查变量确保路径中的$stream或$releasever能被正确替换。有时在极简安装或容器环境中这些系统变量可能未正确定义。可以尝试在.repo文件中将$stream直接硬编码为9-stream。错误3: “GPG key retrieval failed” 或 “GPG check FAILED”原因无法下载或验证GPG密钥。排查临时禁用GPG检查进行测试在dnf命令后加--nogpgcheck如sudo dnf makecache --nogpgcheck。如果这样能成功问题就出在GPG密钥上。手动导入GPG密钥sudo rpm --import https://mirrors.aliyun.com/centos-stream/RPM-GPG-KEY-CentOS-Official。然后再试。检查gpgkey的URL是否能正常访问。错误4: “Repository ‘appstream’ is missing name or baseurl”原因.repo文件格式错误可能是下载不完整或手动编辑时语法错误如缺少括号、等号两边有空格。排查用cat -A /etc/yum.repos.d/CentOS-Stream-Aliyun.repo查看文件检查是否有奇怪的换行符^M或语法错误。最简单的办法是删除现有文件重新用curl命令下载一次。4.2 进阶优化速度与稳定性的取舍默认的阿里云源配置已经很快了但根据你的网络环境和需求还可以微调。1. 使用mirrorlist还是baseurl阿里云的.repo文件通常直接配置了baseurl。baseurl是指定一个确切的镜像地址而mirrorlist是一个URL它会返回一个可用的镜像服务器列表dnf会从中自动选择最快的。baseurl优点稳定直连一个确定的服务器。mirrorlist优点理论上能自动选择最优节点可能更快。我的建议对于国内用户阿里云的单点baseurl已经非常快且稳定。使用mirrorlist有时反而会因为DNS或列表更新问题引入不确定性。如果你追求极致速度可以尝试将baseurl行注释掉取消注释mirrorlist行如果配置文件里有的话但要做好排查问题的准备。2. 启用fastestmirror插件DNF 有一个内置插件fastestmirror它会自动测试所有已配置镜像的速度并选择最快的进行下载。检查是否启用dnf config-manager --dump | grep fastestmirror通常默认是启用的。如果没启用可以编辑/etc/dnf/dnf.conf在[main]部分确保有fastestmirror1。注意这个插件在镜像站很多时效果明显但对于国内主要用阿里云一个源的情况提升有限有时测试环节还会稍微拖慢一点初始速度。3. 配置 DNF 持久化参数编辑/etc/dnf/dnf.conf可以设置一些全局参数来提升体验[main] # 保持缓存避免每次都要下载元数据除非元数据过期 keepcache1 # 设置最大并行下载线程数根据带宽调整默认3可设为5或6 max_parallel_downloads5 # 安装完成后自动删除缓存的软件包如果keepcache1这个可以设为0以保留包方便重装 clean_requirements_on_remove04.3 针对其他热词需求的源配置延伸从提供的热词可以看到大家的需求远不止配置基础源。很多热词如mysql安装配置教程、git安装及配置教程、nodejs安装及配置、jdk环境配置、maven安装配置等其前提都是有一个正确、高速的 yum/dnf 源。因为安装这些软件要么直接来自AppStream如git,nodejs:16要么需要从EPEL、软件官方仓库或Remi等第三方源安装。以安装 MySQL 8.0 为例CentOS Stream 9 的AppStream默认可能只提供 MariaDB。要安装 Oracle MySQL通常需要添加 MySQL 官方的 yum 仓库或 Remi 仓库。这时一个快速的基系统源能让你在添加这些第三方源时快速下载所需的依赖包如perl,net-tools等。添加 EPEL 源EPEL (Extra Packages for Enterprise Linux) 提供了大量AppStream中没有的优质软件包。配置好阿里云的基础源后添加 EPEL 源也会飞快# 安装 epel-release 包它会自动配置 EPEL 源 sudo dnf install -y https://mirrors.aliyun.com/epel/epel-release-latest-9.noarch.rpm # 安装完成后EPEL 的源配置文件也在 /etc/yum.repos.d/ 下默认可能指向 fedoraproject.org我们可以同样将其替换为阿里云镜像 sudo sed -i s|^metalink|#metalink|g /etc/yum.repos.d/epel*.repo sudo sed -i s|^#baseurl|baseurl|g /etc/yum.repos.d/epel*.repo sudo sed -i s|download.fedoraproject.org/pub|mirrors.aliyun.com|g /etc/yum.repos.d/epel*.repo这样安装像htop,nginx特定版本python3-pip等来自 EPEL 的软件也会享受阿里云的速度。5. 配置本地源与特殊场景下的思考虽然阿里云等网络源是主流但在某些无外网或网络极差的环境如内网开发服务器、保密环境配置本地 yum 源就是必须技能了。这与配置网络镜像源思路相通但操作对象从远程服务器变成了本地文件系统或内部HTTP服务器。5.1 为何需要以及如何准备本地源场景你管理着一个机房里面有几十台同样系统的服务器或者你有一台无法连接互联网的生产服务器。为每一台都从外网下载相同的软件包既浪费带宽也慢。此时你可以选择在一台能上网的机器或某台服务器上使用reposync工具将完整的仓库同步到本地然后通过 Nginx、Apache 或简单的python -m http.server搭建一个 HTTP 文件服务器供内网其他机器使用。核心步骤简述在同步机可上网上安装工具并同步# 安装 reposync 工具 sudo dnf install -y dnf-utils # 创建本地存储目录 sudo mkdir -p /data/local-repos/centos-stream/9-stream/ # 同步 BaseOS 仓库这是一个耗时很长的操作需要巨大磁盘空间 sudo reposync -p /data/local-repos/centos-stream/9-stream/ --repobaseos --download-metadata --newest-only # 同步 AppStream 仓库 sudo reposync -p /data/local-repos/centos-stream/9-stream/ --repoappstream --download-metadata --newest-only创建仓库元数据同步下来的只是 RPM 包需要用createrepo_c命令为每个目录创建元数据。sudo dnf install -y createrepo_c sudo createrepo_c /data/local-repos/centos-stream/9-stream/BaseOS/os/x86_64/ sudo createrepo_c /data/local-repos/centos-stream/9-stream/AppStream/os/x86_64/在内网搭建文件服务器以 Nginx 为例# 在 Nginx 配置中将 /centos-stream 路径映射到本地目录 location /centos-stream { alias /data/local-repos/centos-stream; autoindex on; # 开启目录列表方便浏览器查看 }在内网其他机器上配置源将baseurl指向这台内网服务器的地址例如http://192.168.1.100/centos-stream/9-stream/BaseOS/$basearch/os/。这个过程比配置网络源复杂得多但它解决了无网环境的根本问题。它的原理是彻底理解了baseurl指向的是一个包含特定目录结构repodata/目录存放元数据Packages/目录存放 rpm 包的 HTTP/HTTPS/FTP 服务器。5.2 容器与自动化部署中的源配置在 Dockerfile 或 Ansible、SaltStack 等自动化脚本中配置软件源也是一个高频操作。原则是快速、静默、幂等。Dockerfile 示例FROM centos:stream9 # 备份并替换 repo 文件 RUN cd /etc/yum.repos.d/ \ mkdir -p backup \ mv *.repo backup/ \ curl -o /etc/yum.repos.d/CentOS-Stream-Aliyun.repo https://mirrors.aliyun.com/repo/Centos-stream-9.repo \ dnf makecache -y \ dnf update -y --nogpgcheck \ # 安装常用工具 dnf install -y wget curl vim net-tools要点在构建镜像时通常可以安全地使用--nogpgcheck以加速构建并避免因容器内环境不完整导致的密钥验证问题。但在生产环境的基础镜像构建中最好还是维护好GPG检查。Ansible Playbook 示例- name: Configure Aliyun Yum repo for CentOS Stream 9 hosts: all tasks: - name: Backup existing repos ansible.builtin.shell: cmd: | cd /etc/yum.repos.d/ mkdir -p backup_{{ ansible_date_time.date }} mv *.repo backup_{{ ansible_date_time.date }}/ args: warn: false # 忽略目录可能为空的警告 - name: Download Aliyun repo file ansible.builtin.get_url: url: https://mirrors.aliyun.com/repo/Centos-stream-9.repo dest: /etc/yum.repos.d/CentOS-Stream-Aliyun.repo mode: 0644 - name: Clean and make dnf cache ansible.builtin.shell: cmd: dnf clean all dnf makecache自动化配置的关键在于处理好备份和幂等性即使任务重复执行结果也一致。6. 从配置源延伸出的系统维护习惯配置好一个高速可靠的软件源只是高效系统管理的起点。围绕dnf这个核心工具可以养成一些非常好的习惯这些习惯能让你在后续安装mysql、git、nodejs、配置vscode开发环境、部署cacti监控时事半功倍。习惯一在安装任何软件前先搜索和查询不要盲目dnf install。先了解软件包的具体信息。dnf search 关键词: 在所有启用的仓库中搜索包含关键词的软件包。比如dnf search mysql会列出所有与 mysql 相关的包。dnf info 包名: 查看软件包的详细信息包括版本、仓库来源、大小、描述、依赖关系等。这能帮你确认是不是你要的版本比如是mysql还是mariadb。dnf provides 文件或命令: 如果你知道需要一个命令如ifconfig但不知道是哪个包提供的用这个命令反向查找。例如dnf provides */ifconfig会告诉你需要安装net-tools。习惯二理解“模块”(Module) 以管理多版本软件这是 CentOS/RHEL 8 和 Stream 版本中AppStream仓库的强大功能。以 Python 为例dnf module list python*: 列出所有可用的 Python 模块流。你可能会看到python39,python310等。每个模块有默认的流(stream)。dnf module enable python39: 启用python39流。之后dnf install python3安装的就是 Python 3.9。dnf module install nodejs:18: 直接安装指定流的 Node.js 18。习惯三使用dnf history进行回滚dnf会记录所有事务安装、更新、删除。如果你安装了一个软件导致系统问题可以回滚。dnf history: 查看事务历史列表。dnf history info 事务ID: 查看某个事务的详细信息安装了哪些包。sudo dnf history undo 事务ID: 回滚到该事务之前的状态。这是一个非常强大的“后悔药”。习惯四定期更新但要有策略sudo dnf update --refresh: 刷新元数据并更新所有包。对于生产服务器建议先在测试环境验证然后制定维护窗口进行更新。sudo dnf upgrade: 与update类似但会处理过时的包如用新包替换旧包。对于内核更新 (kernel)更新后需要重启才能生效。dnf会保留旧内核所以如果新内核启动失败可以在 GRUB 菜单中选择旧内核启动。配置阿里云源本质是优化了系统获取软件这个最基础、最频繁的通道。这个通道顺畅了后面所有基于包管理的操作无论是安装一个简单的wget还是搭建复杂的LAMP环境或是配置vscode的C、Python开发套件都会变得流畅而高效。它节省的是每一次等待的几分钟积累起来就是巨大的时间收益和顺畅的操作体验。把这个基础打牢你在 CentOS Stream 9 上的探索之路就会平坦很多。