跳转到内容
搜索 AlmaLinux 文档

    浏览当前文档目录

    AlmaLinux 9:审计包来源,避免多仓库打架

    在 almalinux:9 容器(AlmaLinux 9.8)里建了一个本地仓库(含 tree、wget 及依赖),实际执行:--disablerepo="*" --enablerepo=multi list available、加 includepkgs=tree 后再查、改成 excludepkgs=wget 后再查。日志:plans/content-expansion/evidence/logs/alma-repo-priority.log。

    cost 的行为在 Rocky 上做过对照(未改变选择结果),Alma 上未重复该实验;本页只按已实测的两种手段写。

    AlmaLinux 默认只有 baseos、appstream、extras 三个源;一旦加了 EPEL、CRB、Remi 或自建仓库,同一个包名就可能出现在多个源里。装到哪个源的版本,取决于你启用了哪些源,而不是取决于「哪个更新」。

    先看清楚:

    Terminal window
    dnf repolist --all | head -20

    输出里 enabled 列会告诉你哪些源当前是开的。

    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="*" 先全关、再开你要的那一个:这条命令只会从 multi 解析,且不影响 /etc/yum.repos.d/ 的永久配置。

    手段二:在仓库定义里收紧可见包

    Section titled “手段二:在仓库定义里收紧可见包”
    [multi]
    name=Multi
    baseurl=file:///srv/multi
    enabled=0
    gpgcheck=0
    includepkgs=tree
    Available Packages
    tree.aarch64 1.8.0-10.el9 multi

    只剩 tree。反向用 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 被排除,其余照常可见。两个指令都写包名,不是文件名。

    结论:先收紧,再谈「优先级」

    Section titled “结论:先收紧,再谈「优先级」”

    仓库优先级这件事,最容易踩的坑是以为「有个配置项能自动决定」。实测下来更可靠的做法是:

    1. 按命令关全部、只开一个(--disablerepo="*" --enablerepo=<id>);
    2. 在仓库定义里用 includepkgs/excludepkgs 把不想要的包挡在外面;
    3. 需要长期固定来源时,直接把该仓库 enabled=1、其余 enabled=0,让「哪些源参与」变成显式配置。
    • 只想临时用却永久打开:enabled=1 的第三方源会参与后续 dnf update;
    • 忘了 dnf clean all:改了 repo 文件但元数据缓存还在,list available 看起来没变化;
    • 把依赖包一起排除:excludepkgs 写宽了会把依赖也挡掉,装包时报依赖缺失。
    Terminal window
    sudo dnf --disablerepo="*" --enablerepo=multi install -y tree
    rpm -q tree

    检查:

    1. rpm -q tree 有版本
    2. 在 multi.repo 加 includepkgs=tree 并 dnf clean all 后,dnf --disablerepo="*" --enablerepo=multi list available | grep -c wget → 0
    3. 改成 excludepkgs=wget 后同上仍为 0,但其他包可见

    常见问题

    为什么同一个包装出来的版本和我看到的不一样?

    dnf 只会从「当前启用的源」里选。第三方源或自建源被启用后,可能提供同名但不同构建的包;先 `dnf repolist --all` 看哪些源开着,再用 --enablerepo 精确指定。

    includepkgs 和 excludepkgs 能同时写吗?

    可以,但语义容易绕:includepkgs 先限定「只看这些包」,excludepkgs 再排除其中一部分。生产上建议只用一种,避免自己也算不清最终可见集合。

    有没有类似 yum-plugin-priorities 的东西?

    EL9 默认仓库里没有可直接用的 priority 插件(dnf-plugins-core 不含它)。可靠做法是显式控制启用哪些源,以及用 includepkgs/excludepkgs;不要依赖某个「优先级数字」自动决定。