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 上未重复该实验;本页只按已实测的两种手段写。
为什么要先审计来源
Section titled “为什么要先审计来源”AlmaLinux 默认只有 baseos、appstream、extras 三个源;一旦加了 EPEL、CRB、Remi 或自建仓库,同一个包名就可能出现在多个源里。装到哪个源的版本,取决于你启用了哪些源,而不是取决于「哪个更新」。
先看清楚:
dnf repolist --all | head -20输出里 enabled 列会告诉你哪些源当前是开的。
手段一:按命令指定来源
Section titled “手段一:按命令指定来源”sudo dnf --disablerepo="*" --enablerepo=multi list availableAvailable Packageslibpsl.aarch64 0.21.1-5.el9 multipublicsuffix-list-dafsa.noarch 20210518-3.el9 multitree.aarch64 1.8.0-10.el9 multiwget.aarch64 1.21.1-11.el9_8 multi--disablerepo="*" 先全关、再开你要的那一个:这条命令只会从 multi 解析,且不影响 /etc/yum.repos.d/ 的永久配置。
手段二:在仓库定义里收紧可见包
Section titled “手段二:在仓库定义里收紧可见包”[multi]name=Multibaseurl=file:///srv/multienabled=0gpgcheck=0includepkgs=treeAvailable Packagestree.aarch64 1.8.0-10.el9 multi只剩 tree。反向用 excludepkgs=wget:
Available Packageslibpsl.aarch64 0.21.1-5.el9 multipublicsuffix-list-dafsa.noarch 20210518-3.el9 multitree.aarch64 1.8.0-10.el9 multiwget 被排除,其余照常可见。两个指令都写包名,不是文件名。
结论:先收紧,再谈「优先级」
Section titled “结论:先收紧,再谈「优先级」”仓库优先级这件事,最容易踩的坑是以为「有个配置项能自动决定」。实测下来更可靠的做法是:
- 按命令关全部、只开一个(
--disablerepo="*" --enablerepo=<id>); - 在仓库定义里用
includepkgs/excludepkgs把不想要的包挡在外面; - 需要长期固定来源时,直接把该仓库
enabled=1、其余enabled=0,让「哪些源参与」变成显式配置。
- 只想临时用却永久打开:
enabled=1的第三方源会参与后续dnf update; - 忘了
dnf clean all:改了 repo 文件但元数据缓存还在,list available看起来没变化; - 把依赖包一起排除:
excludepkgs写宽了会把依赖也挡掉,装包时报依赖缺失。
练习:只从本地源装包
Section titled “练习:只从本地源装包”sudo dnf --disablerepo="*" --enablerepo=multi install -y treerpm -q tree检查:
rpm -q tree有版本- 在
multi.repo加includepkgs=tree并dnf clean all后,dnf --disablerepo="*" --enablerepo=multi list available | grep -c wget→0 - 改成
excludepkgs=wget后同上仍为0,但其他包可见
常见问题
为什么同一个包装出来的版本和我看到的不一样?
dnf 只会从「当前启用的源」里选。第三方源或自建源被启用后,可能提供同名但不同构建的包;先 `dnf repolist --all` 看哪些源开着,再用 --enablerepo 精确指定。
includepkgs 和 excludepkgs 能同时写吗?
可以,但语义容易绕:includepkgs 先限定「只看这些包」,excludepkgs 再排除其中一部分。生产上建议只用一种,避免自己也算不清最终可见集合。
有没有类似 yum-plugin-priorities 的东西?
EL9 默认仓库里没有可直接用的 priority 插件(dnf-plugins-core 不含它)。可靠做法是显式控制启用哪些源,以及用 includepkgs/excludepkgs;不要依赖某个「优先级数字」自动决定。
- 仓库与 SIG:AlmaLinux 仓库
- 第三方源:第三方仓库
- 离线装包:离网装包