3 Blacklist.zh
Anagnostakis Ioannis edited this page 2026-06-30 21:10:06 +03:00
This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 前缀把规则限定到一个仓库:对可用软件包,是它的候选仓库;对已 安装的,是它的来源。

冻结 vs 隐藏

命中的对象… 效果
已安装 被冻结 —— 永不被安装、升级、重装或移除,也永不被 clean-system 列出
未安装 install-new、升级和 check-updates被隐藏,但仍会在 search/info 中以 [blacklisted] 标记显示

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


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 会标出其仓库未激活的 pindel-repo 会在你要移除 的仓库上有软件包被 pin 时提醒你。
  • 对同一个软件包,冻结总是胜过 pin:如果 vlc 同时被冻结又被 pin则冻结生效 pin 不起作用,直到你对它执行 unfrozen

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


黑名单 vs 仓库隔离

它们解决不同的问题:

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

仓库隔离模型参见 Security