-
Notifications
You must be signed in to change notification settings - Fork 1
Blacklist.zh
EN · EL · FR · ES · IT · RU · ZH · AR · HI · PT · DE
黑名单会冻结你不想被触动的软件包,并隐藏你不想被推荐的软件包。规则存放在
/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构建标签的软件包。
| 命中的对象… | 效果 |
|---|---|
| 已安装 | 该候选被冻结 —— 视同其仓库并不提供该软件包;软件包本身永不被 clean-system 列出 |
| 未安装 | 从 install-new、升级和 check-updates 中被隐藏,但仍会在 search/info 中以 [blacklisted] 标记显示 |
黑名单受每一条会改动系统的命令所遵守(包括 reinstall)。
冻结并不只是把已安装的版本钉住。一个被冻结的候选会被视同其仓库根本不提供该软件包, 于是解析便照常在其余(未冻结的)候选之间按优先级继续进行。只有当一个软件包会考虑的 每一个候选都被冻结时,它才会被保持不变。
- 无
@repo的frozen xf86-.*会在每一个仓库冻结该名称 → 它在各处都被保持。 - 限定的
@testing xf86-.*只冻结 testing 的候选 → 解析按优先级回退到下一个仓库 (例如slackware),而那个仓库的更新继续照常流入。
回退绝不会低于该软件包当前安装来源的优先级,因此冻结绝不会变成降级;若唯一未冻结的
候选会排得更低,则该软件包转而被保持。pin 会先限定候选集合,冻结再在其内应用,因此
一个同时被 pin 又被冻结的软件包会被保持。
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 是 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只是更安全地做这件事,带着精确匹配的 保证以及当前规则的列表。
假设你保留来自 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]。)
同一个 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(并不允许任何
其他仓库提供它)。二者相反。
它们解决不同的问题:
黑名单(frozen) |
隔离(distrust-repo) |
|
|---|---|---|
| 范围 | 特定的软件包(按正则/系列) | 一整个仓库 |
| 效果 | 冻结 / 隐藏那些软件包 | 该仓库不提供任何软件包 |
| 用于 | 「永不触动这个软件包」 | 「此刻不要信任这个来源」 |
仓库隔离模型参见 Security。
slacker - slackpkg + slackpkg+ in one - Apache-2.0 - by Ioannis Anagnostakis (rizitis) - beta / WIP, for Slackware -current (64-bit & 32-bit)
Getting started
Using slacker
- Commands
- Common Workflows
- Distribution Upgrade
- Repositories and Priority
- Package History
- Dependencies
- Docker
- Templates
- Blacklist
Trust & safety
Reference
For contributors