跳转到内容
搜索 Rocky Linux 文档

    浏览当前文档目录

    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 上,同一个软件有多个版本轨:

    $ dnf module list
    Name Stream Profiles Summary
    nodejs 18 common [d], development, ... Javascript runtime
    nodejs 20 common [d], development, ... Javascript runtime
    nodejs 22 common [d], development, ... Javascript runtime
    nodejs 24 common [d], development, ... Javascript runtime
    nginx 1.22 common [d] nginx webserver
    php 8.1 common [d], devel, minimal PHP scripting language
    ...

    选定后装出来的包名里带模块标记:

    # dnf -y module install nodejs:22/common
    $ node -v
    v22.23.2
    $ rpm -q nodejs
    nodejs-22.23.2-2.module_el9.8.0+322+f4aa738c.x86_64

    .module_el9.8.0+322+f4aa738c 就是模块构建标记——EL10 上不会再出现。

    $ dnf module list
    WARNING: modularity is deprecated, and functionality will be removed in a future release of DNF5.
    (没有列表)
    $ dnf module list nodejs
    WARNING: modularity is deprecated, and functionality will be removed in a future release of DNF5.
    Error: No matching Modules to list
    $ dnf module enable nodejs:20
    Error: Problems in request:
    missing groups or modules: nodejs:20

    Rocky Linux 10.2:dnf module list 只打印弃用警告

    /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 appstream
    php8.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/commondnf 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。
    Terminal window
    dnf module list nodejs 2>&1 | tail -2
    dnf -q list --available nodejs php8.4 2>/dev/null | head -4

    检查:

    1. 第一条在 EL10 上应报 No matching Modules to list;
    2. 第二条能列出 nodejs 与 php8.4 的具体版本;
    3. 把脚本里的 module enable/install 全部替换成普通包名;
    4. 用 rpm -q 确认装上的包不带 .module_el* 标记。

    常见问题

    EL10 以后会恢复模块化吗?

    不会。警告明确写着 modularity is deprecated,DNF5 会移除相关命令;新写法就是普通包。

    那 EL9 的 stream 还能用多久?

    EL9 生命周期内可用;但迁移到 EL10 时必须在脚本里改掉,否则升级后立即失败。

    多版本仍需要怎么办?

    优先用版本化包名(php8.4 等);仓库没提供的版本用 SCL/第三方仓库,或用容器隔离运行环境。