Rocky 10:模块化(module stream)没了,脚本怎么改
两组实测:
| 环境 | 用途 |
|---|---|
almalinux:9 容器(EL9 AppStream) | 展示 module stream 原本的样子 |
Rocky Linux 10.2 虚拟机 + almalinux:10 容器(dnf 4.20.0) | 展示 EL10 上的实际行为 |
日志:plans/content-expansion/evidence/logs/module-streams-el9-el10.log;截图:public/evidence/module-streams/rocky-no-modules.png。
EL9 的 stream 是什么
Section titled “EL9 的 stream 是什么”在 EL9 上,同一个软件有多个版本轨:
$ dnf module listName Stream Profiles Summarynodejs 18 common [d], development, ... Javascript runtimenodejs 20 common [d], development, ... Javascript runtimenodejs 22 common [d], development, ... Javascript runtimenodejs 24 common [d], development, ... Javascript runtimenginx 1.22 common [d] nginx webserverphp 8.1 common [d], devel, minimal PHP scripting language...选定后装出来的包名里带模块标记:
# dnf -y module install nodejs:22/common$ node -vv22.23.2$ rpm -q nodejsnodejs-22.23.2-2.module_el9.8.0+322+f4aa738c.x86_64.module_el9.8.0+322+f4aa738c 就是模块构建标记——EL10 上不会再出现。
EL10 上 module 只剩一个警告
Section titled “EL10 上 module 只剩一个警告”$ dnf module listWARNING: modularity is deprecated, and functionality will be removed in a future release of DNF5.(没有列表)
$ dnf module list nodejsWARNING: modularity is deprecated, and functionality will be removed in a future release of DNF5.Error: No matching Modules to list
$ dnf module enable nodejs:20Error: Problems in request:missing groups or modules: nodejs:20
/var/lib/dnf/ 下也只有 history.sqlite、repos 之类的常规内容,没有任何 module 元数据。
替代方案:版本化包名 + 并行安装
Section titled “替代方案:版本化包名 + 并行安装”EL10 把「多版本」从 stream 改成了普通包名:
$ dnf -q list --available 'php8*'php8.4.x86_64 8.4.24-1.el10_2 appstreamphp8.4-cli.x86_64 8.4.24-1.el10_2 appstream也就是说:
- 默认
php是 8.3,想要 8.4 就装php8.4,两个可以并存; nodejs直接是 22.x(nodejs-22.23.2-3.el10_2),没有 18/20/24 的 stream 可选;- 需要精确版本时用 NEVRA 锁定:
dnf install nodejs-22.23.1-4.el10_2。
迁移清单:脚本里出现这些就要改
Section titled “迁移清单:脚本里出现这些就要改”| EL9 写法 | EL10 对应 |
|---|---|
dnf module enable nodejs:20 | 删掉;直接 dnf install nodejs(默认 22.x) |
dnf module install php:8.2/common | dnf install php8.4(或对应版本命名包) |
dnf module list --enabled | 无替代,用 dnf list --installed |
依赖 rpm -q 里的 .module_el9 标记 | 改为按版本号判断 |
Ansible dnf: name=@nodejs:20/common | 改为 name=nodejs |
- 重试一次就好? 不会。
dnf module enable在 EL10 上是硬错误,CI 里会一直失败; - 以为包丢了:
dnf list --available nodejs能看到,只是没有别的版本轨; - 跨大版本升级时:EL9 上「启用过 stream」的系统升级后,包名不带模块标记,
rpm -q对比会显示成不同的包; - 多版本共存:EL10 同名的多个主版本靠不同包名(
php8.4与php),不是 stream。
练习:把一条 module 命令改掉
Section titled “练习:把一条 module 命令改掉”dnf module list nodejs 2>&1 | tail -2dnf -q list --available nodejs php8.4 2>/dev/null | head -4检查:
- 第一条在 EL10 上应报
No matching Modules to list; - 第二条能列出
nodejs与php8.4的具体版本; - 把脚本里的
module enable/install全部替换成普通包名; - 用
rpm -q确认装上的包不带.module_el*标记。
常见问题
EL10 以后会恢复模块化吗?
不会。警告明确写着 modularity is deprecated,DNF5 会移除相关命令;新写法就是普通包。
那 EL9 的 stream 还能用多久?
EL9 生命周期内可用;但迁移到 EL10 时必须在脚本里改掉,否则升级后立即失败。
多版本仍需要怎么办?
优先用版本化包名(php8.4 等);仓库没提供的版本用 SCL/第三方仓库,或用容器隔离运行环境。
- 仓库与冲突:/repo-priority/
- 离线装包:/offline-updates/
- 事务回滚:/dnf-history-rollback/