26.02.2014 Aufrufe

Linux-Magazin Clean Linux (Vorschau)

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!