FreeBSD Systempflege: Konsistenzcheck in 3 Schritten

Autor: Raphael Eiselstein <rabe_at_uugrn.org>
Datum: Sun, 27 May 2012 17:27:41 +0200
Hallo zusammen,

ich habe in letzter Zeit einige Jails aktualisiert, v.a. aus Ports. Wer
sowas schonmal über längere Zeit hinweg gemacht hat, wird irgendwann
bemerkt haben, dass die Dinge inkonsistent werden und dass sich das nur
schwer erkennen oder auflösen lässt.

Ich verwende zur Konsistenzprüfung 3 Tools:

pkgdb -F: prüft, ob alle Abhängigkeiten formal erfüllt sind. pkgdb -F
sollte in unter einer Minute durchgelaufen sein und keinen output
erzeugen, wenn alles okay ist. Falls nicht, hat man gleich was zu tun.

Es kann passieren, dass sich verschiedene Ports / Packages gegenseitig
Files überschreiben und beim Update dann in einer ungünstigen
Reihenfolge deinstallieren. Im Ergebnis fehlen nachher Files oder das
was gerade im Filesystem liegt stimmt nicht mit dem überein, was laut
Paketmanagement installiert sein sollte.

pkg_info -ag vergleicht anhand der Infos aus dem Paketmanagement die
Existenz und Checksummen aller Dateien. Einzelne Wenige Files sind dabei
*immer* mit einer falschen Checksumme dabei, weil es sich hier zB um
index-Files handelt, wo dann andere Ports später noch eigene Sachen
anhängen oder modifizieren. Das ist okay. 

Kritisch sollte man sein bei checksummen von binaries (*bin/*) und 
Libraries (zB *.so). Mit dem Tool "pkg_which /path/to/file" kann man das
paketmanagement befragen, welcher Port das File geliefert hat, kann
passieren, dass hier 2 Ports erscheinen, zB ghostscript8 und
ghostscript9. In jedem Fall sollten konkurrierende Versionen behoben
werden und zur Sicherheit der jeweilige Port / Package neu installiert
werden.

Wenn "pkgdb -F" und "pkg_info -ag" dann gut aussehen, kann man mit dem
Tool "libchk" nochmal über alle Binaries checken, dass benötigte
libraries auch tatsächlich gefunden werden. Es werden auch "Unreferenced
Libraries" angezeigt, das ist aber unkritisch, nicht alle gelieferten
Libs werden auch tatsächlich referenziert oder aber werden zur Laufzeit
nachgeladen, was dann üblicherweise nicht durch "ldd" erkannt wird.

Wenn  "pkgdb -F", "pkg_info -ag" und "libchk" gut aussehen, dann sollte
es keine schlimmen Bugs im System mehr geben.

Noch 2 Tools zur Systempflege:

Für Upgrades empfehle ich "portupgrade", wobei das Tool viele Dinge gut
kann aber bei unbedachtem Einsatz von "-O" und "-f" gerne auch mal Chaos
verursacht.

Im Laufe der Zeit installiert man sich über Abhängigkeiten irgendwelche
Libs, die später dann nicht mehr benötigt werden. Das Tool
"pkg_cutleaves" zeigt alle Pakete an, die nicht von einem anderen Paket
benötigt werden, zum Beispiel "bash" oder "coreutils". Üblicherweise
will man die aber dennoch behalten. Zeigt das Tool irgendwas mit
"libXY-47.11" an und man kann sich nicht erinnern, wozu das gut ist,
kann man es deinstallieren lassen. Etwaige Abhängigkeiten von diesem
Paket werden dann in der 2. Runde abgefragt.

Bei UUGRN und Stadtwiki e.V. betreibe ich das ganze allerdings etwas
zentralisierter. In einem Buildsystem update ich alle Ports und baue
alle benötigten Packages. Dabei treten immer irgendwelche Probleme auf, 
die ich fixe. Ich erzeuge aus jedem Port, den ich benötige ein Package, 
aktuell knapp unter 1000 Ports). 

Sobald alle Packages auf die aktuelle Version upgedatet sind und alle 
Checks (pkg_info -ag, pkgdb -F, libchk, ... ) gut aussehen, mache ich 
noch einen letzten Package-Dependency-Check, d.h. dass die in den Packages
referenzierten Abhängigkeiten auch in exakt der angeforderten Version
vorliegen. Sollte das irgendwo nicht der Fall sein, dann löse ich das
durch Neubau der entsprechenden Packages auf.

Sobald alle QS-Maßnahmen erfolgreich sind, lade ich /usr/ports und damit
auch /usr/ports/packages/ auf den UUGRN-Server hoch ("release").
Basierend auf diesen Ports+Packages update ich dann die Jails auf dem
Vereinsserver.

Das hat den Vorteil, dass ich mich beim Upgrade der jeweiligen Jails
sehr stark darauf verlassen kann, dass durch "Drüberinstallieren" von
Packages die Welt konsistenter wird, in schlimmen Fällen kann ich dann
auch Übeltäter aus dem Jail einfach raushauen (pkg_delete -f) und per
pkg_add einfach ein frisches Package drüberlegen. "portupgrade -arfPPOk"
in einem Jail sorgt dafür, dass *alle* Packages neu installiert werden
und auch alle Abhängigkeiten aus Packages nachinstalliert werden.

Nach so einer Upgrade-Session verwende ich die drei eingangs erwähnten 
Tools, um die Konsistenz sicher zu stellen. Probleme die dabei auffallen 
lassen sich dann oft einfach iterativ durch "pkg_delete -f" und 
"pkg_add /usr/ports/packages/All/foo-47.11.tbz" beheben.

Gruß
Raphael

-- 
Raphael Eiselstein <rabe@uugrn.org>               http://rabe.uugrn.org/
xmpp:freibyter@gmx.de  | https://www.xing.com/profile/Raphael_Eiselstein   
GnuPG:                E7B2 1D66 3AF2 EDC7 9828  6D7A 9CDA 3E7B 10CA 9F2D
.........|.........|.........|.........|.........|.........|.........|..


-- 
UUGRN e.V. http://www.uugrn.org/
http://mailman.uugrn.org/mailman/listinfo/uugrn
Wiki: https://wiki.uugrn.org/UUGRN:Mailingliste
Archiv: http://lists.uugrn.org/

Empfangen am 27.05.2012

Dieses Archiv wurde generiert von hypermail 2.2.0 : 27.05.2012 CEST