跳转到内容
搜索 Rocky Linux 文档

    浏览当前文档目录

    多仓库冲突:--enablerepo、includepkgs 与 cost(Rocky 9 实测)

    装一个包,dnf 却从你没预期的仓库拿;或者两个仓库都提供同名包,你想固定用其中一个。Rocky 9 上能用的手段有三类:临时开关仓库、在仓库定义里过滤包、cost 权重。第三类这次实测没达到预期,下面如实写。

    Terminal window
    sudo dnf --disablerepo="*" --enablerepo=multi list available
    Available Packages
    libpsl.aarch64 0.21.1-5.el9 multi
    publicsuffix-list-dafsa.noarch 20210518-3.el9 multi
    tree.aarch64 1.8.0-10.el9 multi
    wget.aarch64 1.21.1-11.el9_8 multi

    --disablerepo="*" 先关掉全部,再用 --enablerepo= 打开你信得过的那一个——这是最可预测的做法,而且只对本次命令生效,不会把危险仓库永久打开。

    [multi]
    name=Multi
    baseurl=file:///srv/multi
    enabled=1
    gpgcheck=0
    includepkgs=tree
    Available Packages
    tree.aarch64 1.8.0-10.el9 multi

    includepkgs=tree 让这个仓库只暴露 tree,其余包(含 wget 与依赖)都不可见。

    反过来用 excludepkgs 排除:

    excludepkgs=wget
    Available Packages
    libpsl.aarch64 0.21.1-5.el9 multi
    publicsuffix-list-dafsa.noarch 20210518-3.el9 multi
    tree.aarch64 1.8.0-10.el9 multi

    wget 从列表里消失了,其余三个包照常可见。

    手段三:cost —— 这次实测没成功

    Section titled “手段三:cost —— 这次实测没成功”

    两个本地仓库提供同一个 rpm,分别设 cost=10 与 cost=20,用 repoquery --location 看 dnf 最终选哪个:

    Terminal window
    sudo dnf --disablerepo="*" --enablerepo=A,B repoquery --location tree
    file:///srv/repoB/tree-1.8.0-10.el9.aarch64.rpm

    把两个 cost 对调(A=99、B=1)再跑,结果仍然指向 repoB。也就是说:在这个场景里 cost 没有改变选择结果。

    结论:不要把 cost 当作跨仓库优先级的可靠手段。需要固定来源时,用 --enablerepo 显式指定,或用 excludepkgs 把不想要的来源排除掉。

    • 永久 enabled=1 打开第三方仓库:后续 dnf update 可能把系统包替换成第三方版本;优先用 --enablerepo 临时开;
    • includepkgs 写的是包名不是文件名:写 tree,不是 tree-1.8.0-10.el9.aarch64;
    • 改了 repo 文件不 clean all:元数据缓存还在,list available 看起来「没生效」。

    前置:Rocky 9,已有一个自建本地仓库(见 离线环境装包)。

    Terminal window
    sudo dnf --disablerepo="*" --enablerepo=multi install -y tree

    检查:

    1. dnf --disablerepo="*" --enablerepo=multi list available | grep -c tree → 1
    2. 在 /etc/yum.repos.d/multi.repo 里加 includepkgs=tree,dnf clean all 后重跑第 1 步 → wget 不再出现
    3. 加 excludepkgs=wget(去掉 includepkgs)后 → 列表里没有 wget