Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Titelthema<br />
www.linux-magazin.de Apt intern 09/2013<br />
32<br />
Der Problem-Resolver weist jedem Paket<br />
einen Punktewert zu (Score), der seine<br />
Wichtigkeit ausdrückt. Eine hohe Zahl<br />
verweist auf ein wichtiges Paket. Um die<br />
Scores einzelner Pakete zu betrachten,<br />
ruft man die Option »‐o Debug::pkgProblemResolver::ShowScores=true«<br />
auf. Die<br />
Berechnung dieses Wertes ist relativ kompliziert,<br />
denn es fließen einige Faktoren<br />
ein wie die Priority und das »Essential:<br />
yes«-Flag. Auch erhalten installierte Pakete<br />
eine höhere Priorität.<br />
Als Nächstes wird untersucht, wie viele<br />
andere Pakete ein bestimmtes Paket als<br />
Abhängigkeiten voraussetzen (Reverse<br />
Dependencies). Jede Abhängigkeit erhöht<br />
den Score. Dies stellt sicher, dass zentrale<br />
Bibliotheken einen hohen Stellenwert erhalten.<br />
So hat etwa die »libgcc1« auf einem<br />
typischen Desktop einen Wert von<br />
mehr als 2000.<br />
An dieser Stelle werden auch Provides<br />
berücksichtigt. Zum Beispiel erhalten<br />
Pakete, die den »notification‐daemon« in<br />
ihrer Provides-Liste führen, einen höheinstalliert<br />
solche Pakete, indem er die Option<br />
»‐‐install‐suggests« aktiviert, und<br />
sudo apt‐get install ‐‐install‐suggests<br />
‐‐fix‐policy<br />
schaut nach, welche »suggests« auf dem<br />
System fehlen – in der Regel sind das<br />
recht viele.<br />
Kommt es zu Konflikten, wird zwischen<br />
Conflicts und Breaks unterschieden. Ein<br />
Konflikt tritt auf, wenn sich zwei Pakete,<br />
die identische Dateien enthalten, zur selben<br />
Zeit auf dem Dateisystem befinden,<br />
etwa »/usr/sbin/sendmail«. Ein Break<br />
weist auf einen schwächeren Konflikt<br />
hin: Er tritt auf, wenn sich zwei Pakete<br />
zur gleichen Zeit im Installed-Zustand<br />
befinden – unpacked dürfen sie hingegen<br />
sein.<br />
Typischerweise nutzen Breaks eine Versionsnummer,<br />
zum Beispiel »Break: foo<br />
( ( devel )<br />
08 Broken build‐essential:amd64 Depends on dpkg‐dev [<br />
amd64 ] < 1.16.1.2ubuntu7.1 > ( utils ) (>= 1.13.5)<br />
09 Considering dpkg‐dev:amd64 10001 as a solution to<br />
build‐essential:amd64 0<br />
10 Removing build‐essential:amd64 rather than change<br />
dpkg‐dev:amd64<br />
11 Done<br />
ändert, wodurch es für ältere Versionen<br />
anderer Software, die dieses Interface<br />
ebenfalls nutzen, unbenutzbar wird. Apt<br />
versucht daher im obigen Beispiel, das<br />
Paket »foo« auf eine Version 1.0 oder<br />
besser zu aktualisieren.<br />
Installation und Upgrades<br />
Gibt der User eine Installation oder ein<br />
Upgrade in Auftrag, schaut Apt zunächst<br />
in seinem Cache nach, ob es den Paketnamen<br />
kennt. Abhängig von der Policy<br />
wählt es die Candidate-Version aus und<br />
markiert diese für eine Installation oder<br />
ein Upgrade. Als Nächstes iteriert Apt<br />
über die Liste der Abhängigkeiten und<br />
markiert alle noch nicht erfüllten oder<br />
neuen Abhängigkeiten zur Installation.<br />
Alle negativen Abhängigkeiten (wie<br />
Conflicts und Breaks) markiert es zum<br />
Löschen.<br />
Der Admin kann Apt bei diesem Teil<br />
der Arbeit beobachten, indem er das<br />
Flag »‐o Debug::pkgDepCache::Auto Install=true«<br />
setzt. Listing 1 visualisiert<br />
über die eingerückten »Installing«-<br />
Anweisungen, wie Libapt die Abhängigkeiten<br />
auflöst, indem sie Schritt für<br />
Schritt den Abhängigkeitsbaum durchwandert.<br />
Noch weitere Details fördert<br />
»-o Debug::pkgDepCache::Marker=1«<br />
zutage.<br />
Anders als bei einer Installation betrifft<br />
ein Upgrade meist eine große Zahl von<br />
Paketen. Das Kommandozeilentool<br />
Apt‐get unterscheidet zwei Arten von<br />
Upgrades: »sudo apt‐get upgrade« installiert<br />
alle neuen Versionen von Software,<br />
die nicht die Installation oder das Löschen<br />
weiterer Pakete erfordern. Beim<br />
Kommando »sudo apt‐get dist‐upgrade«<br />
gibt es diese Einschränkung nicht. Weil<br />
etwa ein neuer Kernel aufgrund von ABI-<br />
Änderungen auch die stabilen Varianten<br />
neuer Pakete einfordert, ist ein »sudo<br />
apt‐get dist‐upgrade« für Upgrades im<br />
Allgemeinen die bessere Wahl.<br />
Der Algorithmus für »upgrade« arbeitet<br />
sehr einfach: Er iteriert über alle installierten<br />
Pakete und markiert sie für ein<br />
Upgrade, wobei er die Option »AutoInstall«<br />
explizit ausklammert. Der »ProblemResolver«<br />
setzt dann problematische<br />
Abhängigkeit zurück auf »keep«.<br />
Der Algorithmus für »dist‐upgrade« arbeitet<br />
ähnlich, allerdings nutzt er »AutoInstall«,<br />
um neue Abhängigkeiten zu<br />
installieren. Auch neue Pakete vom Typ<br />
»Essential: yes« landen damit auf dem<br />
Rechner. Anschließend startet der »ProblemResolver«,<br />
um die verbleibenden<br />
fehlerhaften Abhängigkeiten in Ordnung<br />
zu bringen.<br />
Der Problemlöser<br />
Operationen wie »install«, »dist‐upgrade«<br />
oder »remove« führen unter Umständen<br />
dazu, dass der Cache inkonsistent wird,<br />
das heißt, Abhängigkeiten verletzt oder<br />
Konflikte nicht aufgelöst werden. Dies<br />
kann zum Beispiel passieren, wenn die<br />
Installation von Paket A ein Paket B installiert,<br />
das in Konflikt mit einem bereits<br />
installierten Paket steht.<br />
An dieser Stelle kommt der so genannte<br />
Problem-Resolver von Apt ins Spiel. Er<br />
soll eine Lösung für die Inkonsistenzen<br />
finden, seine Handlungen lassen sich über<br />
»‐o Debug::pkgProblemResolver=true«<br />
beobachten. Neben dem Problem-Resolver<br />
gibt es noch weitere Implementierungen:<br />
So bringt Aptitude eine eigene<br />
Variante mit, daneben gibt es externe<br />
Tools wie »aspcud«.<br />
Pakete mit Punkten