Skip to content

Blacklist

Anagnostakis Ioannis edited this page Jul 1, 2026 · 13 revisions

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

Blacklist

The blacklist freezes packages you do not want touched, and hides ones you do not want offered. Rules live in /etc/slacker/blacklist (one per line, # for comments), or are added and removed for you by the frozen and unfrozen commands.

The blacklist is different from command-line PATTERN matching. PATTERNs are substring + series + exact; blacklist rules are globs or unanchored regular expressions (plus series/ and @repo scoping) matched against the full package id name-version-arch-build, like slackpkg.


Rule syntax

[@repo] PATTERN
  • PATTERN is a Slackware series when it ends in / (e.g. kde/). Otherwise it is a glob or an unanchored regex matched against the full id — slacker decides by what you wrote:
    • No regex syntax → glob. * matches any run of characters, ? matches one, and every other character (including a literal ., as in webkit2gtk6.0 or python3.11) is taken verbatim. So vlc-*, webkit2gtk6.0*, *-l10n-* all work the way you'd expect.
    • Regex syntax → regex. A pattern containing a [ ] ( ) { } | ^ $ \ character, or the .* / .+ "any characters" idiom, is taken as a regex verbatim. So xf86-.*-202.* catches a 202x build, ^vlc-[0-9] anchors to the vlc package, and a bare vlc matches any id containing vlc. Anchor with ^...$ for an exact match.
  • The optional @repo prefix scopes the rule to one repository — matched by repo name or build tag: for an available package, its candidate repo; for an installed one, its source. So @testing xf86-.* scopes to the testing repo, while @_SBo foo scopes to packages carrying the _SBo build tag.

Frozen vs hidden

The match is… Effect
installed that candidate is frozen — treated as if its repo did not offer the package; the package itself is never listed by clean-system
not installed hidden from install-new, upgrades, and check-updates, but still shown by search/info marked [blacklisted]

The blacklist is honoured by every mutating command (including reinstall).

Freeze is a fallback, not a pin

A freeze does not simply pin the installed version. A frozen candidate is treated as if its repository did not offer the package at all, and resolution then proceeds normally by priority over the remaining (non-frozen) candidates. An installed package is held unchanged only when every candidate it would otherwise consider is frozen.

  • An unscoped frozen xf86-.* freezes that name in every repo → it is held everywhere.
  • A scoped @testing xf86-.* freezes only the testing candidate → resolution falls through to the next repo by priority (e.g. slackware), and that repo's updates keep flowing.

The fallback never drops below the priority of the source the package is currently installed from, so a freeze can never become a downgrade; if the only non-frozen candidate would rank lower than that, the package is held instead. A pin restricts the candidate set first and the freeze applies within it, so a package that is both pinned and frozen is held.


The frozen command

frozen validates rules and appends them to the blacklist for you.

slacker frozen "@alienbob vlc-[0-9]"     # freeze only alienbob's vlc (regex)
slacker frozen "vlc-*"                     # a glob: anything starting "vlc-"
slacker frozen "webkit2gtk6.0*"           # a glob; the dot is literal
slacker frozen kde/                       # freeze the whole kde series
slacker frozen "xf86-.*-202.*"            # a regex rule
slacker frozen "@conraid ^ffmpeg-"        # exact-ish, scoped to conraid
  • Each argument is one rule; quote any rule that contains spaces (an @repo rule, for instance).
  • slacker flags a likely mistake - an @repo that names no active repo, or a regex containing whitespace (no package id has spaces, so that is usually a forgotten @ or a quoting slip) - and asks whether to declare it anyway.
  • It prints what each rule will freeze and asks for confirmation. --yes skips the prompts. Rules already present are skipped.

The unfrozen command

unfrozen is the counterpart to frozen: it removes rules from the blacklist.

slacker unfrozen                          # list the current rules (no root needed to read)
slacker unfrozen emacs                     # remove the rule "emacs"
slacker unfrozen "@alienbob vlc-[0-9]"     # remove a scoped rule (quote it)
slacker unfrozen "xf86-.*-202.*"           # special characters matched literally

The match is exact and literal - never a pattern. Each argument must equal an existing rule character-for-character; the regex metacharacters in a rule (.*, *, -, [, ], /) are compared verbatim, not interpreted. So unfrozen "fcitx5*" removes only the rule fcitx5* and never touches fcitx5-qt, and unfrozen fcitx5 (a shorter string) matches nothing rather than removing fcitx5* by accident. This is deliberate: a blacklist is full of special characters, and an exact match is the only safe way to remove the right line.

  • Run it with no argument to print the current rules, so you can copy the exact text to remove.
  • Comment lines, blank lines, and any rule you did not name are preserved verbatim; a rule that is not found is reported, and nothing is written unless at least one rule actually matched.
  • Quote any rule that contains spaces or shell-special characters (an @repo rule, a trailing *), exactly as you would for frozen.

Removing a rule from the file by hand works too - unfrozen just does it safely, with the exact-match guarantee and the current-rules listing.


A worked example: freeze just one repo's vlc

Say you keep vlc from alienbob and never want it replaced or removed:

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

Why vlc-[0-9] and not just vlc? The rule is matched unanchored over the full id. vlc alone would also match vlc-plugin-foo or anything containing the letters; vlc-[0-9] anchors to the version boundary so it matches the vlc package itself. For a strict match you could write ^vlc-[0-9]. (The glob vlc-* is also accepted — it compiles to vlc-.* and freezes the whole vlc- family, plugins included; use the ^vlc-[0-9] regex when you want only the vlc package.)


Pins: take a package only from one repo

The same blacklist file also stores pins — the positive opposite of a freeze. A freeze says never take this package (or not from this repo); a pin says take this package only from this repo, ignoring priority.

Manage pins with two commands:

slacker pin alienbob:vlc     # vlc now comes only from alienbob, even if a
                             # higher-priority repo offers a different build
slacker unpin vlc            # back to normal priority-based resolution
slacker unpin                # (no argument) list the current pins

A pin is written into the blacklist file with a 100% marker, so you can also add or read it by hand:

@alienbob 100% vlc

How it behaves:

  • Every command honours it — install, upgrade, and upgrade-all all source the package only from the pinned repo, regardless of priority. A plan that includes a pinned package lists it under "pinned (taken only from their repo, ignoring priority)", the way frozen packages are surfaced.
  • Pins use an exact package name, never a pattern (vlc, not vlc*). A literal dot is fine — python3.11 and webkit2gtk6.0 are valid pin names. To freeze a pattern, use frozen instead (it accepts globs and regexes).
  • A package has at most one pin. Pinning it to a different repo replaces the old pin.
  • If the pinned repo does not currently offer the package, the package simply stays as it is (it is never pulled from anywhere else) until that repo provides it. slacker status flags a pin whose repo is not active, and del-repo warns you if packages are pinned to the repo you are removing.
  • In clean-system, a pin alone does not protect a package. But a foreign package that is pinned and was actually installed from the repo it is pinned to is offered in a separate step — [R]emove all / [K]eep all / [P]rompt each, defaulting to Keep (a pin is an explicit choice). A pinned name whose installed copy came from another source is ignored by that step and follows the normal clean-system logic.
  • A freeze always wins over a pin on the same package: if vlc is both frozen and pinned, the freeze takes effect and the pin does nothing until you unfrozen it.

Pin vs the scoped freeze from the worked example above: @alienbob vlc freezes alienbob's vlc (and lets other repos update it by priority); @alienbob 100% vlc pins vlc to alienbob (and lets no other repo provide it). They are opposites.


Blacklist vs repo quarantine

These solve different problems:

Blacklist (frozen) Quarantine (distrust-repo)
Scope specific packages (by regex/series) a whole repository
Effect freeze / hide those packages the repo provides no packages at all
Use it for "never touch this package" "do not trust this source right now"

See Security for the quarantine model.

Clone this wiki locally