Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
en Score, da viele Pakete vom Notification‐Daemon<br />
abhängen, es aber kein echtes<br />
Paket dafür gibt. Eine weitere Rolle<br />
spielen die Wünsche des Users: Wählt<br />
er ein Paket explizit zur Installation oder<br />
zum Löschen aus, steigt der Wert, um<br />
den Wunsch zu berücksichtigen.<br />
Löschen oder behalten<br />
Ist die Wertigkeit der Pakete festgestellt,<br />
beginnt die eigentliche Arbeit des Problem-Resolvers.<br />
Er iteriert über die nach<br />
Punkten sortierten Pakete. Trifft er auf<br />
nicht erfüllte Abhängigkeiten oder Konflikte,<br />
übernimmt Apt und prüft die am<br />
stärksten betroffenen Exemplare einzeln.<br />
Es versucht nicht erfüllte Abhängigkeiten<br />
mit Hilfe von »keep« oder »delete« zu lösen.<br />
Bleibt dies erfolglos, versucht Apt als<br />
Nächstes, das Paket mit den nicht erfüllten<br />
Abhängigkeiten zurückzuhalten oder<br />
zu löschen. Dies wiederholt es so lange,<br />
bis der Paket-Cache einen konsistenten<br />
Zustand erreicht.<br />
Listing 2 zeigt den Problem-Resolver von<br />
Ubuntu 12.04 in einer Pbuilder-Chroot-<br />
Umgebung bei der Arbeit. Hier lässt sich<br />
gut beobachten, wie das Löschen von<br />
»dpkg‐dev« dazu führt, dass das ebenfalls<br />
installierte Paket »build‐essential« jetzt<br />
eine verletzte Abhängigkeit aufweist (es<br />
hängt von »dpkg‐dev« ab). Der Resolver<br />
entscheidet daraufhin »build‐essential«<br />
ebenfalls zu löschen, um das System<br />
wieder in einen konsistenten Zustand zu<br />
versetzen.<br />
Die Zahlen »10001« hinter »dpkg‐dev« und<br />
»0« hinter »build‐essential« geben jeweils<br />
die Wertigkeit des Pakets an. Der hohe<br />
Wert von »dpkg‐dev« rührt daher, dass<br />
ein expliziter Wunsch des Users existiert,<br />
das Paket zu löschen: Der Problemlöser<br />
verändert seinen Zustand daher nicht,<br />
sondern passt vielmehr die anderen Pakete<br />
mit niedrigerer Wertigkeit an.<br />
Auf los! geht’s los<br />
Befindet sich der Cache endlich in einem<br />
konsistenten Zustand, pflegt Apt die Änderungen<br />
ein. Hierzu unterteilt das Tool<br />
die Installation in die Schritte »remove«,<br />
»unpack« und »configure«, um dann<br />
»dpkg« für die einzelnen Pakete aufzurufen.<br />
Dabei fasst Apt Pakete in Gruppen<br />
zusammen, sodass sich »dpkg« auf größere<br />
Gruppen von ihnen anwenden lässt,<br />
was die Installation beschleunigt. Dank<br />
der Option »‐o Debug::pkgDpkgPM=1«<br />
kann ein Admin im Vorfeld verfolgen,<br />
was »dpkg« tun würde.<br />
In Listing 3 lässt sich beobachten, dass<br />
Apt »dpkg« aufruft und damit explizit<br />
die Architektur im Paketnamen angibt,<br />
um auf einem Multiarchitektur-System<br />
eindeutige Paketnamen zu erzeugen.<br />
Spezialfälle<br />
Für Ubuntu gibt es zusätzlich das Paket<br />
»ubuntu‐release‐upgrader«. Es bringt das<br />
Kommando »sudo do‐release‐upgrade«<br />
mit, über das ein Ubuntu-Nutzer sein<br />
System auf eine neue Version aktualisiert.<br />
Ergänzt er die Option »‐‐devel«, springt<br />
Ubuntu auf die Entwicklungsversion,<br />
zurzeit die 13.10.<br />
Der Release-Upgrader übernimmt Aufgaben,<br />
die sonst ein Admin erledigen<br />
müsste, etwa das Aktualisieren der Konfigurationsdatei<br />
für die Paketquellen<br />
(»/etc/apt/sources.list«). Zudem löst er<br />
Sonderfälle beim Berechnen der Aktualisierung.<br />
So stellt er sicher, dass auf<br />
einem Desktop-Ubuntu stets das Metapaket<br />
»ubuntu‐desktop« existiert.<br />
Daneben deckt der Release-Upgrader Spezialfälle<br />
ab. Ein solcher tritt zum Beispiel<br />
ein, wenn ein Nutzer vom proprietären<br />
»fglrx«- auf den freien »ati«-Grafikkartentreiber<br />
wechselt, weil die neue Version<br />
des proprietären Treibers die Hardware<br />
des Rechners nicht mehr unterstützt. Intern<br />
benutzt der Release-Upgrader die<br />
Bibliothek Libapt, um das Upgrade zu<br />
berechnen und Konflikte zu lösen.<br />
Unattended Upgrades<br />
Ein weiterer Spezialfall entsteht mit dem<br />
Wunsch, Updates automatisch vom System<br />
installieren zu lassen. Dafür sorgen<br />
Unattended Upgrades – wenn man sie<br />
entsprechend einrichtet. Sie installieren<br />
meist Sicherheitsupdates für stabile Versionen<br />
von Debian oder Ubuntu. Automatische<br />
Sicherheitsupdates sind per<br />
sudo dpkg‐reconfigure ‐plow unattendedU<br />
‐upgrades<br />
zu aktivieren. Es gibt noch weitere Konfigurationsoptionen,<br />
die der Admin in der<br />
Datei »/etc/apt/apt.conf.d/50unattended<br />
‐up grades« einrichtet. Mehr Informationen<br />
zum Thema Paketmanager gibt der<br />
Artikel zu Beginn des Schwerpunkts.<br />
Apt plus Python<br />
Neben den Debug-Optionen für »apt‐get«<br />
lässt sich nicht zuletzt mittels »python‐apt«<br />
genau beobachten, wie das<br />
System arbeitet. Das Skript aus Listing<br />
4 verdeutlicht dies, indem es »Problem‐<br />
Resolver« aktiviert (Zeile 3), das Paket<br />
»dbus« löscht (Zeile 6), die kaputten Abhängigkeiten<br />
im Cache betrachtet (Zeile<br />
7) und den »ProblemResolver« erneut<br />
startet, um das Hindernis zu beseitigen<br />
(Zeile 9). Ein finaler Check (Zeile 10)<br />
zeigt, dass der Cache keine kaputten Pakete<br />
mehr enthält. (kki) <br />
n<br />
Der Autor<br />
Michael Vogt ist seit dem Jahr 2000 Debian-<br />
Entwickler und seit 2004 bei Ubuntu als Core<br />
Developer aktiv. Arbeitet er mal nicht an einem<br />
Programmierprojekt wie Apt, Python-apt,<br />
Software-Center, Synaptic oder Unattended Upgrades,<br />
trinkt er mit Vorliebe grünen Tee oder<br />
spielt Hockey.<br />
Listing 3: Apt löscht<br />
01 $ apt‐get remove ‐o Debug::pkgDpkgPM=true dpkg‐dev<br />
02 Reading package lists... Done<br />
03 Building dependency tree<br />
04 Reading state information... Done<br />
05 The following packages will be REMOVED:<br />
06 build‐essential dpkg‐dev<br />
07 0 upgraded, 0 newly installed, 2 to remove and 0 not<br />
upgraded.<br />
08 After this operation, 1228 kB disk space will be<br />
freed.<br />
09 Do you want to continue [Y/n]?<br />
10 /usr/bin/dpkg ‐‐status‐fd 57 ‐‐force‐depends<br />
‐‐force‐remove‐essential ‐‐remove<br />
build‐essential:amd64 dpkg‐dev:all<br />
Listing 4: Python und Apt<br />
01 #!/usr/bin/python<br />
02 import apt<br />
03 apt.apt_pkg.config.set("Debug::pkgProblemResolver"<br />
, "1")<br />
04 cache = apt.Cache()<br />
05 pkgname="dbus"<br />
06 cache[pkgname].mark_delete(auto_fix=False)<br />
07 print cache.broken_count<br />
08 resolver=apt.cache.ProblemResolver(cache)<br />
09 resolver.resolve()<br />
10 print cache.broken_count<br />
Apt intern 09/2013<br />
Titelthema<br />
www.linux-magazin.de<br />
33