Table of Contents
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(每行一条,# 表示注释),也可由 frozen 和 unfrozen
命令替你添加和移除。
黑名单与命令行的 PATTERN 匹配不同。PATTERN 是子串 + 系列 + 精确;而黑名单 规则是 glob 或未锚定的正则表达式(外加
series/和@repo限定),针对完整的 标识符name-version-arch-build进行匹配,就像slackpkg那样。
规则语法
[@repo] PATTERN
- 当
PATTERN以/结尾时,它是一个 Slackware 系列(例如kde/)。否则 它是一个 glob 或一个未锚定的正则,针对完整标识符匹配 —— slacker 依你所 写来判定:- 无正则语法 → glob。
*匹配任意一串字符,?匹配一个,其余每个字符 (包括字面的.,如webkit2gtk6.0或python3.11)都按原样对待。于是vlc-*、webkit2gtk6.0*、*-l10n-*都如你所料地工作。 - 有正则语法 → 正则。 包含
[ ] ( ) { } | ^ $ \字符,或包含.*/.+这种「任意字符」惯用法的模式,会按原样当作正则。于是xf86-.*-202.*能捕获 202x 的构建,^vlc-[0-9]锚定到vlc包,而单独的vlc会匹配任何含vlc的标识符。用^...$锚定以求精确匹配。
- 无正则语法 → glob。
- 可选的
@repo前缀把规则限定到一个仓库 —— 按仓库名称或构建标签匹配: 对可用软件包,是它的候选仓库;对已安装的,是它的来源。于是@testing xf86-.*限定到testing仓库,而@_SBo foo限定到带有_SBo构建标签的软件包。
冻结 vs 隐藏
| 命中的对象… | 效果 |
|---|---|
| 已安装 | 该候选被冻结 —— 视同其仓库并不提供该软件包;软件包本身永不被 clean-system 列出 |
| 未安装 | 从 install-new、升级和 check-updates 中被隐藏,但仍会在 search/info 中以 [blacklisted] 标记显示 |
黑名单受每一条会改动系统的命令所遵守(包括 reinstall)。
冻结是回退,而非固定
冻结并不只是把已安装的版本钉住。一个被冻结的候选会被视同其仓库根本不提供该软件包, 于是解析便照常在其余(未冻结的)候选之间按优先级继续进行。只有当一个软件包会考虑的 每一个候选都被冻结时,它才会被保持不变。
- 无
@repo的frozen 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 命令
unfrozen 是 frozen 的对应命令:它从黑名单移除规则。
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
假设你保留来自 alienbob 的 vlc,并且永远不希望它被替换或移除:
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
它的行为:
- 每一条命令都遵守它 ——
install、upgrade和upgrade-all都只从被 pin 的 仓库取该软件包,无视优先级。包含被 pin 软件包的方案,会把它列在 *「pinned (taken only from their repo, ignoring priority)」*之下,正如被冻结的 软件包被凸显那样。 - pin 使用精确的软件包名,绝非模式(
vlc,而非vlc*)。字面的点是允许的 ——python3.11和webkit2gtk6.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。
slacker
Getting started
Using slacker
- Commands
- Common Workflows
- Distribution Upgrade
- Repositories and Priority
- Package History
- Dependencies
- Docker
- Templates
- Blacklist
Trust & safety
Reference
For contributors
slacker - slackpkg + slackpkg+ in one - Apache-2.0 - by Ioannis Anagnostakis (rizitis) - beta / WIP, for Slackware -current (64-bit & 32-bit)