paccache – usuwanie starych pakietów z cache

03 marzec 2016

Większość użytkowników Archa i Manjaro na pewno wie, że pacman sam w sobie potrafi usuwać nieużywane pakiety z pamięci podręcznej. Przełącznik -Sc pozostawi tylko te, które obecnie są zainstalowane, a -Scc usunie wszystkie. Żadna z nich nie bierze pod uwagę, że ktoś (na przykład ja) może chcieć zachować więcej pakietów niż obecnie zainstalowane. Z pomocą przychodzi skrypt paccache dostarczany wraz z pacmanem.

Sam skrypt ciężko nazwać skomplikowanym, co widać po jego helpie:

paccache (pacman) v5.0.1

A flexible pacman cache cleaning utility.

Usage: paccache <operation> [options] [targets...]

  Operations:
    -d, --dryrun          perform a dry run, only finding candidate packages.
    -m, --move <dir>      move candidate packages to "dir".
    -r, --remove          remove candidate packages.

  Options:
    -a, --arch <arch>     scan for "arch" (default: all architectures).
    -c, --cachedir <dir>  scan "dir" for packages. can be used more than once.
                          (default: read from /etc/pacman.conf).
    -f, --force           apply force to mv(1) and rm(1) operations.
    -h, --help            display this help message and exit.
    -i, --ignore <pkgs>   ignore "pkgs", comma-separated. Alternatively, specify
                          "-" to read package names from stdin, newline-
                          delimited.
    -k, --keep <num>      keep "num" of each package in the cache (default: 3).
        --nocolor         remove color from output.
    -q, --quiet           minimize output
    -u, --uninstalled     target uninstalled packages.
    -v, --verbose         increase verbosity. specify up to 3 times.
    -z, --null            use null delimiters for candidate names (only with -v
                          and -vv).

W praktyce potrzebne są dwa wykonania skryptu żeby rzeczywiście pozbyć się za starych i odinstalowanych pakietów. Poniższe polecenie zachowa pakiety w najnowszej i poprzedniej wersji:

paccache --remove --verbose --keep 2 # paccache -rvk2

Kolejne usunie wszystkie odinstalowane:

paccache --remove --verbose --uninstalled --keep 0 # paccache -rvuk0

Wspominam o tych prostych poleceniach z jednego powodu: jestem leniwym człowiekiem i nie chcę myśleć o regularnym usuwaniu zbędnych pakietów z cache. Oba nadają się idealnie do stworzenia usługi i timera dla systemd, które zajmie się wykonywaniem ich bez mojej uwagi.

# /etc/systemd/system/paccache.service
[Unit]
Description=Remove unneeded pacman packages from cache

[Service]
Type=oneshot
ExecStart=/usr/bin/paccache --remove --verbose --keep 2
ExecStart=/usr/bin/paccache --remove --verbose --uninstalled --keep 0
# /etc/systemd/system/paccache.timer
[Unit]
Description=Remove unneeded pacman packages from cached weekly

[Timer]
OnCalendar=weekly
AccuracySec=6h
Persistent=yes

[Install]
WantedBy=multi-user.target

Po wrzuceniu powyższych plików do /etc/systemd/system/ i przeładowaniu dostępnych unitów (systemctl daemon-reload), wystarczy włączyć timer i cieszyć się beztroskim życiem.

$ systemctl list-timers
NEXT                         LEFT          LAST                         PASSED     UNIT            ACTIVATES
Mon 2016-03-07 00:00:00 CET  3 days left   Mon 2016-02-29 00:14:14 CET  3 days ago paccache.timer  paccache.service