多仓库冲突:--enablerepo、includepkgs 与 cost(Rocky 9 实测)
什么时候该用它
Section titled “什么时候该用它”装一个包,dnf 却从你没预期的仓库拿;或者两个仓库都提供同名包,你想固定用其中一个。Rocky 9 上能用的手段有三类:临时开关仓库、在仓库定义里过滤包、cost 权重。第三类这次实测没达到预期,下面如实写。
手段一:临时开关仓库
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="*" 先关掉全部,再用 --enablerepo= 打开你信得过的那一个——这是最可预测的做法,而且只对本次命令生效,不会把危险仓库永久打开。
手段二:在仓库定义里过滤包
Section titled “手段二:在仓库定义里过滤包”[multi]name=Multibaseurl=file:///srv/multienabled=1gpgcheck=0includepkgs=treeAvailable Packagestree.aarch64 1.8.0-10.el9 multiincludepkgs=tree 让这个仓库只暴露 tree,其余包(含 wget 与依赖)都不可见。
反过来用 excludepkgs 排除:
excludepkgs=wgetAvailable Packageslibpsl.aarch64 0.21.1-5.el9 multipublicsuffix-list-dafsa.noarch 20210518-3.el9 multitree.aarch64 1.8.0-10.el9 multiwget 从列表里消失了,其余三个包照常可见。
手段三:cost —— 这次实测没成功
Section titled “手段三:cost —— 这次实测没成功”两个本地仓库提供同一个 rpm,分别设 cost=10 与 cost=20,用 repoquery --location 看 dnf 最终选哪个:
sudo dnf --disablerepo="*" --enablerepo=A,B repoquery --location treefile:///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看起来「没生效」。
练习:只从指定仓库装一个包
Section titled “练习:只从指定仓库装一个包”前置:Rocky 9,已有一个自建本地仓库(见 离线环境装包)。
sudo dnf --disablerepo="*" --enablerepo=multi install -y tree检查:
dnf --disablerepo="*" --enablerepo=multi list available | grep -c tree→ 1- 在
/etc/yum.repos.d/multi.repo里加includepkgs=tree,dnf clean all后重跑第 1 步 → wget 不再出现 - 加
excludepkgs=wget(去掉 includepkgs)后 → 列表里没有 wget
- 自建仓库:离线环境装包
- 仓库与默认启用项:Rocky 仓库
- 装错了想回滚:dnf history undo