Title: Reuse of OpenBSD packages for trying runtime | |
Author: Solène | |
Date: 19 September 2021 | |
Tags: openbsd unix | |
Description: | |
# Introduction | |
So, I'm currently playing with OpenBSD trying each end user package | |
(providing binaries) and see if they work when installed alone. I | |
needed a simple way to keep packages downloaded and I didn't want to go | |
the hard way by using rsync on a package mirror because it would waste | |
too much bandwidth and would take too much time. | |
The most efficient way I found rely on a cache and ordering the source | |
of packages. | |
# pkg_add mastery | |
pkg_add has a special variable named PKG_CACHE that when it's set, | |
downloaded packages are copied in this directory. This is handy | |
because every time I will install a package, all the packages | |
downloaded by will kept in that directory. | |
The other variable that interests us for the job is PKG_PATH because we | |
want pkg_add to first look up in $PKG_CACHE and if not found, in the | |
usual mirror. | |
I've set this in my /root/.profile | |
```shell file | |
export PKG_CACHE=/home/packages/ | |
export PKG_PATH=${PKG_CACHE}:http://ftp.fr.openbsd.org/pub/OpenBSD/snapshots/pa… | |
``` | |
Every time pkg_add will have to get a package, it will first look in | |
the cache, if not there it will download it in the mirror and then | |
store it in the cache. | |
# Saving time removing packages | |
Because I try packages one by one, installing and removing dependencies | |
takes a lot of time (I'm using old hardware for the job). Instead of | |
installing a package, deleting it and removing its dependencies, it's | |
easier to work with manually installed packages and once done, remove | |
dependencies, this way you will keep already installed dependencies | |
that will be required for the next package. | |
```script shell | |
#!/bin/sh | |
# prepare the packages passed as parameter as a regex for grep | |
KEEP=$(echo $* | awk '{ gsub(" ","|",$0); printf("(%s)", $0) }') | |
# iterate among the manually installed packages | |
# but skip the packages passed as parameter | |
for pkg in $(pkg_info -mz | grep -vE "$KEEP") | |
do | |
# instead of deleting the package | |
# mark it installed automatically | |
pkg_add -aa $pkg | |
done | |
# install the packages given as parameter | |
pkg_add $* | |
# remove packages not required anymore | |
pkg_delete -a | |
``` | |
This way, I can use this script (named add.sh) "./add.sh gnome" and | |
then reuse it with "./add.sh xfce", the common dependencies between | |
gnome and xfce packages won't be removed and reinstalled, they will be | |
kept in place. | |
# Conclusion | |
There are always tricks to make bandwidth and storage more efficient, | |
it's not complicated and it's always a good opportunity to understand | |
simple mechanisms available in our daily tools. |