dnf 模块流(modules):Fedora 45 上已经没有模块了
如果你搜到一篇讲 dnf module enable nodejs:20 的教程,在 Fedora 45 上会失败——不是因为命令写错,而是因为 Fedora 已经没有模块流了。
先给结论,再讲来龙去脉。
实测:F45 上没有任何模块
Section titled “实测:F45 上没有任何模块”sudo dnf module listUpdating and loading repositories: Fedora 45 - x86_64 - Updates 100% | 33.0 KiB/s | 6.0 KiB | 00m00s Fedora 45 - x86_64 100% | 143.5 KiB/s | 27.4 KiB | 00m00sRepositories loaded.No matches found: no module streams exist.no module streams exist 不是”你没启用”,是仓库里根本没有模块元数据。
再试一个常见的:
sudo dnf module enable nodejs:20No match for argument: nodejs:20You can try to add to command line: --skip-unavailable to skip unavailable packages
dnf5 的 module 子命令还在,但只剩五个
Section titled “dnf5 的 module 子命令还在,但只剩五个”dnf module --helpQuery Commands: list List module streams info List module streamsStream Management Commands: enable Enable module streams and make their packages available. reset Reset module state so it's no longer enabled or disabled. disable Disable modules including all their streams.对比 dnf4 时代最常用的那条:
dnf module install nodejsUnknown argument "install" for command "module". Add "--help" for more information about the arguments.dnf5 里没有 module install——dnf4 的 module install / module remove / module update / module switch-to 都没有对应的子命令。这些命令留着 enable、reset、disable,是为了让旧脚本不至于连”语法”都不对,但实际没有模块可操作。
模块流当年解决什么问题
Section titled “模块流当年解决什么问题”一句话:在同一个发行版里提供同一个软件的多个版本线。
| 概念 | 含义 | 例子 |
|---|---|---|
| module | 一组包 | nodejs |
| stream | 一条版本线 | nodejs:20、nodejs:22 |
| profile | 安装子集 | nodejs:20/minimal |
| default | 默认启用的流 | 不写版本时用哪条 |
它想解决的是「系统要 Python 3.12,我的项目要 3.11」这类冲突——同一时间只能启用一条流,这就是它的根本限制。
现在该用什么
Section titled “现在该用什么”Fedora 放弃模块流之后,版本选择回到了更直接的机制:
| 需求 | 现在怎么做 |
|---|---|
| 要另一个语言版本 | 用发行版给的版本,项目侧用 venv / Toolbx / 容器隔离(见工具链) |
| 要并存的多个版本 | 装版本化的包名,例如 python3.13、php8.3 这类独立包 |
| 要上游最新 | 自建仓库或容器镜像,不要动系统包 |
| 要 EL 那种稳定性 | 用 CentOS Stream / RHEL,模块流在那边还活着 |
dnf search python3.1 # 找版本化的包名dnf search php8 # PHP 也是同样的套路关键区别:模块流是”切换系统里那一个版本”;版本化包名是”同时装多个版本”。后者对开发环境更友好。
迁移检查清单
Section titled “迁移检查清单”从旧系统或旧文档过来时,按这四条对齐:
dnf module list有没有输出——没有模块就是没有,别硬找;- 脚本里有没有
dnf module install——改成dnf install <包名>; - 有没有
dnf module enable nodejs:xx——改成装对应版本化的包,或用容器; - 配置文件里有没有
/etc/dnf/modules.d/——F45 上这个目录通常不存在,残留的.module文件可以清掉。
ls /etc/dnf/modules.d/ 2>/dev/null || echo "no module state"为什么会这样
Section titled “为什么会这样”模块流在 Fedora 里一直有争议:它让仓库元数据变复杂、让”装了哪个版本”变得不直观,而且和容器化的方向重复。Fedora 逐步把内容从模块迁回普通包,最终在近几个版本里清空。
这个决定的影响是降低了复杂度:dnf install 就是装最新,想知道装了什么看 rpm -q 就够,不用再查”当前启用的是哪条流”。
- Fedora 仓库与 dnf5 — 仓库配置与包管理
- 从 dnf 迁到 dnf5 的实操差异 — 子命令层面的全部差异
- Fedora 工具链与多版本共存 — 需要多版本时的正确做法
- 版本矩阵 — F43/F44/F45 组件对照
- 报错速查 —
No match for argument一类报错 - 官方:Fedora 模块化文档(历史)