Skip to content

Blacklist.zh

Anagnostakis Ioannis edited this page Aug 12, 2026 · 4 revisions

EN · EL · FR · ES · IT · RU · ZH · AR · HI · PT · DE

黑名单(blacklist)

黑名单会冻结你不想被触动的软件包,并隐藏你不想被推荐的软件包。规则存放在 /etc/slacker/blacklist(每行一条,# 表示注释),也可由 frozenunfrozen 命令替你添加和移除。

黑名单与命令行的 PATTERN 匹配不同。PATTERN 是子串 + 系列 + 精确;而黑名单 规则是 glob 或未锚定的正则表达式(外加 series/@repo 限定),针对完整的 标识符 name-version-arch-build 进行匹配,就像 slackpkg 那样。


规则语法

[@repo] PATTERN
  • PATTERN/ 结尾时,它是一个 Slackware 系列(例如 kde/)。否则 它是一个 glob 一个未锚定的正则,针对完整标识符匹配 —— slacker 依你所 写来判定:
    • 无正则语法 → glob。 * 匹配任意一串字符,? 匹配一个,其余每个字符 (包括字面的 .,如 webkit2gtk6.0python3.11)都按原样对待。于是 vlc-*webkit2gtk6.0**-l10n-* 都如你所料地工作。
    • 有正则语法 → 正则。 包含 [ ] ( ) { } | ^ $ \ 字符,或包含 .* / .+ 这种「任意字符」惯用法的模式,会按原样当作正则。于是 xf86-.*-202.* 能捕获 202x 的构建,^vlc-[0-9] 锚定到 vlc 包,而单独的 vlc 会匹配任何vlc 的标识符。用 ^...$ 锚定以求精确匹配。
  • 可选的 @repo 前缀把规则限定到一个仓库 —— 按仓库名称或构建标签匹配: 对可用软件包,是它的候选仓库;对已安装的,是它的来源。于是 @testing xf86-.* 限定到 testing 仓库,而 @_SBo foo 限定到带有 _SBo 构建标签的软件包。

冻结 vs 隐藏

命中的对象… 效果
已安装 该候选被冻结 —— 视同其仓库并不提供该软件包;软件包本身永不被 clean-system 列出
未安装 install-new、升级和 check-updates被隐藏,但仍会在 search/info 中以 [blacklisted] 标记显示

黑名单受每一条会改动系统的命令所遵守(包括 reinstall)。

冻结是回退,而非固定

冻结并不只是把已安装的版本钉住。一个被冻结的候选会被视同其仓库根本不提供该软件包, 于是解析便照常在其余(未冻结的)候选之间按优先级继续进行。只有当一个软件包会考虑的 每一个候选都被冻结时,它才会被保持不变。

  • @repofrozen xf86-.* 会在每一个仓库冻结该名称 → 它在各处都被保持。
  • 限定的 @testing xf86-.* 只冻结 testing 的候选 → 解析按优先级回退到下一个仓库 (例如 slackware),而那个仓库的更新继续照常流入。

回退绝不会低于该软件包当前安装来源的优先级,因此冻结绝不会变成降级;若唯一未冻结的 候选会排得更低,则该软件包转而被保持。pin 会先限定候选集合,冻结再在其内应用,因此 一个同时被 pin 又被冻结的软件包会被保持。


frozen 命令

frozen 校验规则并替你把它们追加进黑名单。

slacker frozen "@alienbob vlc-[0-9]"     # 只冻结 alienbob 的 vlc(正则)
slacker frozen "vlc-*"                     # 一个 glob:任何以 "vlc-" 开头的
slacker frozen "webkit2gtk6.0*"           # 一个 glob;点是字面的
slacker frozen kde/                       # 冻结整个 kde 系列
slacker frozen "xf86-.*-202.*"            # 一条正则规则
slacker frozen "@conraid ^ffmpeg-"        # 近乎精确,限定到 conraid
  • 每个参数是一条规则;任何含空格的规则都要加引号(例如一条 @repo 规则)。
  • slacker 会标出可能的错误 —— 一个未指向任何活动仓库的 @repo,或一个含空格的正则 (任何软件包标识符都没有空格,所以这通常是漏写了 @ 或引号失误)—— 并询问是否 仍要声明它。
  • 它会打印每条规则将冻结什么,并请求确认。--yes 会跳过这些提示。已存在的规则会被 跳过。

unfrozen 命令

unfrozenfrozen 的对应命令:它从黑名单移除规则。

slacker unfrozen                          # 列出当前规则(读取无需 root)
slacker unfrozen emacs                     # 移除规则 "emacs"
slacker unfrozen "@alienbob vlc-[0-9]"     # 移除一条限定规则(加引号)
slacker unfrozen "xf86-.*-202.*"           # 特殊字符按字面匹配

匹配是精确且按字面的 —— 绝非模式。每个参数都必须与一条已有规则逐字符相等;规则 中的正则元字符(.**-[]/)按原样比较,被解释。于是 unfrozen "fcitx5*" 只移除规则 fcitx5*,绝不触及 fcitx5-qt;而 unfrozen fcitx5(一个更短的字符串)什么都不匹配,而不会误删 fcitx5*。这是有意 为之:黑名单满是特殊字符,精确匹配是移除正确那一行的唯一安全方式。

  • 无参数运行它,可打印当前规则,便于你复制要移除的确切文本。
  • 注释行、空行,以及任何你未指名的规则,都按原样保留;找不到的规则会被报告,且除非 至少有一条规则确实命中,否则什么也不会写入。
  • 任何含空格或 shell 特殊字符的规则(一条 @repo 规则、一个结尾的 *)都要加 引号,与 frozen 完全一致。

手动从文件里移除一条规则也行 —— unfrozen 只是更安全地做这件事,带着精确匹配的 保证以及当前规则的列表。


一个完整示例:只冻结某一个仓库的 vlc

假设你保留来自 alienbobvlc,并且永远不希望它被替换或移除:

slacker frozen "@alienbob vlc-[0-9]"

为什么用 vlc-[0-9] 而不只是 vlc?规则是在完整标识符上未锚定地匹配的。单独的 vlc 也会匹配 vlc-plugin-foo,或任何含这几个字母的东西;vlc-[0-9] 锚定到版本 边界,从而匹配 vlc 包本身。若要严格匹配,你可以写 ^vlc-[0-9]。(glob vlc-* 也被接受 —— 它编译为 vlc-.* 并冻结整个 vlc- 家族,插件也包括在内;当你只想要 vlc 包时,请用正则 ^vlc-[0-9]。)


Pin:只从一个仓库取某个软件包

同一个 blacklist 文件也存放 pin —— 冻结的正面相反面。冻结是说永不取这个包 (或不从这个仓库取);pin 是说只从这个仓库取这个包,无视优先级。

用两条命令管理 pin:

slacker pin alienbob:vlc     # vlc 现在只来自 alienbob,即使一个更高优先级的仓库
                             # 提供了另一个构建
slacker unpin vlc            # 回到正常的按优先级解析
slacker unpin                # (无参数)列出当前的 pin

pin 会以一个 100% 标记写入 blacklist 文件,因此你也可以手动添加或读取它:

@alienbob 100% vlc

它的行为:

  • 每一条命令都遵守它 —— installupgradeupgrade-all 都只从被 pin 的 仓库取该软件包,无视优先级。包含被 pin 软件包的方案,会把它列在 *「pinned (taken only from their repo, ignoring priority)」*之下,正如被冻结的 软件包被凸显那样。
  • pin 使用精确的软件包名,绝非模式(vlc,而非 vlc*)。字面的点是允许的 —— python3.11webkit2gtk6.0 都是有效的 pin 名称。要冻结一个模式,请改用 frozen(它接受 glob 与正则)。
  • 一个软件包至多一个 pin。把它 pin 到另一个仓库会替换旧的。
  • 如果被 pin 的仓库当前并不提供该软件包,它就保持原样(永不从别处取),直到那个仓库 提供它。slacker status 会标出其仓库未激活的 pin,而 del-repo 会在你要移除 的仓库上有软件包被 pin 时提醒你。
  • clean-system 中,仅有 pin 并不保护一个软件包。但一个既被 pin 确实是从 它所 pin 到的仓库安装的外来软件包,会以单独的一步提供 —— [R]emove all / [K]eep all / [P]rompt each,默认 Keep(pin 是一种明确的选择)。一个 pin 名称若其已安装 副本来自其他来源,则该步骤会忽略它,并按正常的 clean-system 逻辑处理。
  • 对同一个软件包,冻结总是胜过 pin:如果 vlc 同时被冻结又被 pin,则冻结生效, pin 不起作用,直到你对它执行 unfrozen

Pin 与上面示例中的限定冻结之别:@alienbob vlc 冻结 alienbob 的 vlc(并允许其他 仓库按优先级更新它);@alienbob 100% vlc 把 vlc pin 到 alienbob(并不允许任何 其他仓库提供它)。二者相反。


黑名单 vs 仓库隔离

它们解决不同的问题:

黑名单(frozen 隔离(distrust-repo
范围 特定的软件包(按正则/系列) 一整个仓库
效果 冻结 / 隐藏那些软件包 该仓库不提供任何软件包
用于 「永不触动这个软件包」 「此刻不要信任这个来源」

仓库隔离模型参见 Security

Clone this wiki locally