Pflege und Aufzucht von FreeBSD Ports und Packages

Im UUGRN::Jailkonzept ist nur kurz beschrieben, dass es ein gemeinsames /usr/ports für alle Jails gibt, das in den Jails jeweils read-only zur Verfügung steht. Nicht dokumentiert ist, wie /usr/ports (aktuell) gepflegt wird.

Derzeit gibt es ein Jail, welches ausschließlich zur Pflege der Ports und dem Bau der Packages verwendet wird. Ein besonderes Augenmerk liegt dabei auf Konsistenz der Packages bzw. deren Abhängigkeiten zueinander.

Welche Aspekte gehören zur Pflege der Ports?

  1. /usr/ports muss regelmäßig aktualisiert werden, das passiert hier mittels cvsup
  2. Die Datei /usr/ports/INDEX-7 wird benötigt. Daraus abgeleitet auch INDEX-7.db (für portupgrade) und INDEX-7.bz2 (für portsdb -F)
  3. Jeder Port liefert eine Datei pkg-descr. Wir bieten einen Gesamtindex dieser Dateien in /usr/ports/pkg-desc_ALL.
  4. Das Buildjail muss auch insich sauber sein, deswegen werden hier die persistierten Dependencies der installierten Packages anhand der aktuellen Ports aktualisiert. Das erledigt pkgdb -L und das kann durchaus eine Weile brauchen.
  5. Um Platz zu sparen, werden alte Distfiles (Source-Tarballs) gelöscht, die veraltet sind. portsclean -D macht das.
  6. Veraltete Packages werden ebenfalls entfernt, portsclean -P
  7. Ausgehend von der frisch kompilierten INDEX-7.db (alle verfügbaren Ports) und der /var/db/pkg/pkgdb.db (alle derzeit installierten Packages) wird verglichen, welche Updates anstehen. Dabei werden auch zusätzliche Informationen wie /usr/ports/MOVED berücksichtigt oder auch Einstellungen in /etc/make.conf und /usr/local/etc/pkgtools.conf. Das erledigt portversion -FvL= recht zuverlässig.
  8. Zusätzlich zu den entfernten obsoleten Packages unter /usr/ports/packages/All/ soll ermittelt werden, für welche installierten Packages keine Package-Tarballs in /usr/ports/packages/All liegen. Dabei vergleichen wir die Liste der installierten Packages mit der Liste der verfügbaren Package-Dateien:
    pkg_info | awk '{print $1;}' | sort > /root/installed.lst
    /usr/local/bin/gfind /usr/ports/packages/All/ -name "*.tbz" -printf "%f\n" | sed -e 's,^\(.*\)\.tbz$,\1,' | sort > /root/packages.lst
    diff -u /root/installed.lst /root/packages.lst
  9. Wenn die Ausgabe von diff Packages mit “+” vorne enthält bedeutet das, dass hier ein obsoletes Package in /usr/ports/packages/All herumliegt. Das sollte normal aber nicht passieren, weil wir oben schon portsclean -P ausgeführt haben. Im Zweifel die Datei von Hand löschen.
  10. Wenn die Ausgabe von diff Packages mit “-” vorne enthält, fehlt das jeweilige Package als Datei in /usr/ports/packages/All und sollte daher (frisch) gebaut werden, auch wenn es schon installiert ist: portupgrade -fp tut das.
  11. Beim manuellen Löschen von Packages müssen außerdem auch die Symlinks gelöscht werden:
    find  /usr/ports/packages/ -type l -exec file {} \+ | grep "broken symbolic link to"

    bzw.

    find  /usr/ports/packages/ -type l -exec file {} \+ | grep "broken symbolic link to" | cut -f 1 -d ":" | xargs rm -v
  12. Schlussendlich wird dass komplett aktualisierte /usr/ports/ aus dem Buildjail mitsamt aller Distfiles und Packages per rsync auf das gemeinsame /usr/ports/ übertragen und kann dann verwendet werden.

In einem UUGRN-Jail kann man dann auf die vorkompilierten Packages zurückgreifen:

  1. Zuerst benötigen wir einen lokalen INDEX-7.db, das erledigt portsdb -Fu. Die Jails sind so konfiguriert, dass hierbei nicht der INDEX-7.bz2 von www.freebsd.org gezogen wird sondern  /usr/ports/INDEX-7.bz2 verwendet wird
  2. optional: pkgdb -L zum Abgleichen der Package-Dependencies mit den aktuellen Ports
  3. mit portversion -FvOL kann man sich anstehende Updates anzeigen lassen. Etwaige nicht erfüllte Dependencies werden hierbei ignoriert.
  4. Statt dem bei FreeBSD üblichen Selbstkompilieren aller Ports kann man unkompliziert die vorkompilierten Packages verwenden: portupgrade -arPPOk tut das. Falls ein Update von portupgrade oder ruby in der obigen Liste auftaucht, sollte man das vorher getrennt updaten:
    # pkg_delete -f ruby\* portupgrade\*
    # pkg_add -v /usr/ports/packages/Latest/ruby.tbz /usr/ports/packages/Latest/ruby18-bdb.tbz /usr/ports/packages/Latest/portupgrade-devel.tbz
  5. Tipp: im Laufe der Zeit ändern sich Abhängigkeiten und installierte Packages werden eigentlich garnicht mehr benötigt. Das Tool “pkg_cutleaves” fragt interaktiv alle installierten Packages nach, die nicht von anderen Paketen benötigt werden. Findet man hier etwa libfoo-0.7.1 und hat die nicht explizit installiert, kann man sie hier zur Deinstallation markieren.
  6. Grundsätzlich fährt man mit den vorkompilierten Packages sicherer als mit dem Selbstbau aus den Ports (Sourcen). Wenn es beim Update dennoch Probleme gibt (und die gibt es sicher, wenn man /usr/ports/UPDATING ignoriert!), kann man im Zweifel auch im UUGRN-Chat (irc.uugrn.org#uugrn) nachfragen.

Viel Spaß!
Raphael



4 Responses to “Pflege und Aufzucht von FreeBSD Ports und Packages”

  1.   UUGRN Admin » Blog Archive » Neues auf shell.uugrn.org Says:

    […] sind zwar auf den ersten Blick nur marginal, allerdings habe ich dabei weitere Details der Package-Produktion und Rollout verfeinert bzw. […]

  2.   Tricks und Kniffe für FreeBSD | blog/shl@INTERDOSE Says:

    […] sei auch noch dieser Artikel dem tapferen FreeBSD-Jail User ans Herz gelegt. var addthis_pub = ''; var addthis_language = […]

  3.   links for 2009-09-23 | blog/shl@INTERDOSE Says:

    […] UUGRN Admin » Blog Archive » Pflege und Aufzucht von FreeBSD Ports und Packages (tags: freebsd) var addthis_pub = ''; var addthis_language = 'en';var addthis_options = 'email, favorites, digg, delicious, myspace, google, facebook, reddit, live, more'; Related: Tricks und Kniffe für FreeBSD…Wie war das doch gleich…?…Z-Shell im Einsatz… […]

  4.   UUGRN Admin » Blog Archive » Neue Heimat für das UUGRN-Packagebuild-Jail: freebsd.forum41.uugrn.org Says:

    […] RELEASE auch die Packages gebaut. Wie das genau funktioniert habe ich im Juli 2009 im Artikel Pflege und Aufzucht von FreeBSD Ports und Packages […]

Leave a Reply

You must be logged in to post a comment.