// Datei: ./konzepte/software-in-paketen-organisieren/lokale-paketmarkierungen.adoc

// Baustelle: Fertig

[[lokale-paketmarkierungen]]
=== Lokale Paketmarkierungen ===

// Stichworte für den Index
(((Paketmarkierungen, Auswirkungen)))
(((Paketmarkierungen, Begriff)))
Ein installiertes Debianpaket kann zusätzliche, lokale Markierungen
besitzen. Diese beeinflussen z.B. dessen Aktualisierung oder -- wenn
kein anderes Paket mehr von ihm abhängt -- veranlassen oder verhindern
auch seine automatische Deinstallation.

==== Paketmarkierungen, die von verschiedenen Programmen genutzt werden ====

Diese Markierungen werden teilweise bereits automatisch von APT und
`aptitude` gesetzt, wenn es Pakete installiert, entfernt oder
aktualisiert. Als Systembetreuer können Sie jederzeit eingreifen und die
Markierungen eigenhändig setzen und entfernen.

// Stichworte für den Index
(((Paketmarkierungen, Annahmen)))
(((Paketmarkierungen, automatic)))
(((Paketmarkierungen, manual)))
(((Paketmarkierungen, hold)))
Die folgenden Paketmarkierungen sind in Benutzung:

automatisch installiert (_automatic_)::
das Paket wurde automatisch installiert, i.d.R. als Abhängigkeit
eines anderen Pakets (siehe ``Paketabhängigkeiten anzeigen'' in
<<paketabhaengigkeiten-anzeigen>>). Diese Markierung veranlasst, dass
dieses Paket wieder entfernt wird, wenn keine weiteren, installierten
Pakete mehr von diesem abhängen.

manuell installiert (_manual_)::
das Paket wurde manuell, d.h. explizit installiert. Diese Markierung
verhindert, dass dieses Paket automatisch mit entfernt wird, wenn kein
weiteres Paket mehr von ihm abhängt (siehe ``Umgang mit Waisen'' in
<<umgang-mit-waisen>>).

halten (_hold_)::
das Paket wird in der vorliegenden, installierten Version auf dem System
gehalten und nicht aktualisiert (_upgrade_) oder deinstalliert
(siehe ``Pakete aktualisieren'' in <<pakete-aktualisieren>> und ``Pakete
deinstallieren'' in <<pakete-deinstallieren>>).

Die Markierung 'manuell installiert' entspricht defacto dem
Nicht-Vorhandensein der Markierung 'automatisch installiert'. Ein Paket
hat jeweils immer genau eine der beiden Markierungen 'manuell
installiert' oder 'automatisch installiert'.

// Stichworte für den Index
(((Paketmarkierungen, Auswertung)))
(((Paketmarkierungen, /var/lib/apt/extended_states)))
(((Paketmarkierungen, /var/lib/aptitude/pkgstates)))
(((Paketmarkierungen, /var/lib/dpkg/status)))
Die vorgenannten Paketmarkierungen werden von `dpkg` (nur _hold_), APT und
`aptitude` ausgewertet. Die Unterscheidung 'automatisch/manuell
installiert' wird dazu in der Datei `/var/lib/apt/extended_states`
gespeichert, die 'hold'-Markierungen in
`/var/lib/dpkg/status`{empty}footnote:[In früheren
Debian-Veröffentlichungen wurden die 'hold'-Markierungen von
`aptitude` und `dpkg` getrennt gespeichert und `apt-get` wusste nichts
von der 'hold'-Markierung. Auch wurde die 'automatisch
installiert'-Markierung zuerst von `aptitude` eingeführt und
dementsprechend anfangs nur in `/var/lib/aptitude/pkgstates`
gespeichert.]

.Informationen zu jedem Paket in der Datei `/var/lib/apt/extended_states` (Ausschnitt)
----
...

Package: gnome-menus
Auto-Installed: 0
Architecture: i386

Package: libfont-afm-perl
Auto-Installed: 1
Architecture: i386

Package: libhtml-parser-perl
Auto-Installed: 1
Architecture: i386

...
----

.Ein Paket "auf hold" in der Datei `/var/lib/dpkg/status` (Ausschnitt)
----
...

Package: awesome
Status: hold ok installed
Priority: optional
Section: x11
Installed-Size: ...
...
----

==== Aptitude-spezifische Paketmarkierungen ====

// Stichworte für den Index
(((aptitude, add-user-tag)))
(((aptitude, forget-new)))
(((aptitude, search ?user-tag)))
(((Paketmarkierungen, /var/lib/aptitude/pkgstates)))
`aptitude` speichert weitere Informationen zu den Paketen eigenständig
in der Datei `/var/lib/aptitude/pkgstates`. Dazu gehören:

Verbotene Versionen ('forbid-version'/'ForbidVer')::
Von Ihnen als lokaler Administrator nicht erwünschte Version, die nicht
installiert wird, auf die nicht aktualisiert wird bzw. die beim
Aktualisieren übersprungen wird.

Neue Pakete ('New Packages'/'Unseen')::
`aptitude` pflegt eine Liste mit neuen Paketen, die in den Paketlisten
der abonnierten APT-Repositories aufgetaucht sind. Diese Markierung
können Sie mit dem Aufruf `aptitude forget-new` zurücksetzen.

Entfernungsgrund ('Remove-Reason')::
`aptitude` zeigt an, warum ein Paket entfernt wird: wegen nicht (mehr)
erfüllter Abhängigkeiten, wegen Konflikten mit anderen Paketen, oder
weil es nicht mehr gebraucht wird (sprich: kein Paket mehr davon
abhängt). Wird solch eine Paketentfernung nur vorgemerkt, so speichert
`aptitude` bis zur Entfernung auch den Grund für diese.

Benutzerspezifische Markierungen ('User Tags')::
Sie als Benutzer dürfen für Pakete mit dem Unterkommando `add-user-tag`
eigene Markierungen setzen. Nach diesen suchen Sie im Paketbestand mit
dem Muster `?user-tag(Muster)`. Muster bezeichnet hier einen Regulären
Ausdruck, mit dem Sie die Markierung spezifizieren.

.`aptitude`-spezifische Zusatzinformationen zu Paketen (Ausschnitt)
----
...

Package: python3-pkg-resources
Architecture: amd64
Unseen: no
State: 1
Dselect-State: 1
Remove-Reason: 0
ForbidVer: 18.8-1
User-Tags: broken-by-807773

...
----

Diese benutzerspezifischen Markierungen werden auch in der Textoberfläche
(text-based user interface, kurz TUI) von `aptitude` angezeigt, jedoch
können Sie diese dort nicht ändern.

[[lokale-paketmarkierungen-aptitude]]
==== Lesen und Anzeigen einer Markierung mit `aptitude` ====

// Stichworte für den Index
(((aptitude, show)))
(((Debian BTS)))
(((Debian Bug Tracking System)))
(((Debianpaket, python-pkg-resources)))
(((Paketmarkierungen, Darstellung im Terminal)))
Sichtbar werden alle Markierungen zu einem Paket, wenn Sie die Details
dazu erfragen – entweder direkt über die Kommandozeile oder in der
Textoberfläche zu `aptitude`. Wir verdeutlichen Ihnen das hier anhand
des installierten und gehaltenen Pakets 'python-pkg-resources'.

Auf der Kommandozeile rufen Sie hierfür `aptitude` mit dem Unterkommando
`show` gefolgt vom Paketnamen auf. In den Zeilen 2 und 3 der
nachfolgenden Ausgabe erfahren Sie einerseits, dass das Paket
'python-pkg-resources' automatisch installiert wurde und die Version 18.8-1
nicht lokal eingespielt werden darf. Darüberhinaus wurde eine manuelle
Markierung vergeben (`broken-by-807773`), die kennzeichnet, dass das
Paket defekt ist (`broken`). Die Ziffernfolge referenziert die Nummer
des Bugs im Debian Bug Tracking System (BTS) und ermöglicht Ihnen,
nachzulesen, warum der Eintrag da ist.

.Darstellung der Markierungen zum Paket 'python-pkg-resources' mittels `aptitude`
----
$ aptitude show python-pkg-resources
Paket: python-pkg-resources
Zustand: Installiert
Verbotene Version: 18.8-1
Automatisch installiert: ja
Version: 18.7-1
…
Benutzermarkierungen: broken-by-807773

...
$
----

// Stichworte für den Index
(((Paketmarkierungen, automatic)))
(((Paketmarkierungen, Darstellung in aptitude)))
(((Paketmarkierungen, hold)))
In der Textoberfläche von `aptitude` bekommt jeder Eintrag in der
Paketliste zusätzliche Buchstaben. Dabei stehen die Buchstaben `h` für
_hold_ und `A` für _automatic_ (siehe <<fig.aptitude-hold>>).

.Ausgabe der Paketmarkierungen in der Textoberfläche von `aptitude`
image::konzepte/software-in-paketen-organisieren/aptitude-hold.png[id="fig.aptitude-hold", width="50%"]

// Stichworte für den Index
(((aptitude, search ?automatic)))
(((aptitude, search ~M)))
(((Paketmarkierungen, automatic)))
`aptitude` kann ebenfalls nach allen Paketen fahnden, die automatisch
installiert wurden und somit das Flag _automatic_ tragen. Es kennt dazu
das spezielle Muster `?automatic` (Kurzform `~M`) zum Unterkommando
`search`. Ausführlicher besprechen wir das in ``Automatisch installierte
Pakete mit `aptitude` anzeigen'' in
<<automatisch-installierte-pakete-mit-aptitude>>.

[[lokale-paketmarkierungen-apt-mark]]
==== Lesen und Anzeigen einer Markierung mit `apt-mark` ====

// Stichworte für den Index
(((apt-mark, showauto)))
(((apt-mark, showhold)))
(((apt-mark, showinstall)))
(((apt-mark, showmanual)))
(((apt-mark, showpurge)))
(((apt-mark, showremove)))
(((Paketmarkierungen, anzeigen)))
(((Paketmarkierungen, automatic)))
(((Paketmarkierungen, hold)))
(((Paketmarkierungen, manual)))
(((Paketmarkierungen, install)))
(((Paketmarkierungen, remove)))
(((Paketmarkierungen, purge)))
Das Werkzeug `apt-mark` ist spezialisiert auf die Paketmarkierungen und
kann Ihnen die Pakete ausgeben, bei denen nur ein bestimmtes Paketflag
gesetzt ist. Es kennt dazu die folgenden sechs Unterkommandos 

`showauto`:: alle automatisch installierten Pakete

`showmanual`:: alle manuell installierten Pakete

`showinstall`:: alle Pakete, die zur Installation vorgemerkt sind

`showhold`:: alle Pakete, deren Zustand beibehalten wird

`showremove`:: alle Pakete, die zur Entfernung vorgemerkt sind

`showpurge`:: alle Pakete, die zur Entfernung inklusive der Konfiguration vorgemerkt sind

Nachfolgend sehen Sie beispielhaft nur das Ergebnis des Aufrufs für die 
manuell installierten Pakete. Auf automatisch installierte Pakete gehen wir 
genauer in <<automatisch-installierte-pakete-anzeigen>> ein. Dem Umgang mit 
dem Unterkommando `showhold` für die Verwendung des _hold_-Flags in der 
Praxis ist der Abschnitt ``Ausgewählte Pakete nicht aktualisieren'' in 
<<ausgewaehlte-pakete-nicht-aktualisieren>> gewidmet.

.Auflistung aller manuell installierten Pakete mittels `apt-mark`
----
# apt-mark showmanual
abiword
acpi
acpi-support
acpi-support-base
...
#
----

`apt-mark` erlaubt keine Eingrenzung, welche Pakete überprüft werden. Es
validiert stets den gesamten Paketbestand.

[[setzen-und-entfernen-einer-markierung-mit-apt-mark]]
==== Setzen und Entfernen einer Markierung mit `apt-mark` ====

// Stichworte für den Index
(((apt-mark, automatic)))
(((apt-mark, hold)))
(((apt-mark, manual)))
(((apt-mark, unhold)))
(((apt-mark, install)))
(((apt-mark, purge)))
(((apt-mark, remove)))
(((Paketmarkierungen, automatic)))
(((Paketmarkierungen, auto)))
(((Paketmarkierungen, hold)))
(((Paketmarkierungen, install)))
(((Paketmarkierungen, manual)))
(((Paketmarkierungen, purge)))
(((Paketmarkierungen, remove)))
(((Paketmarkierungen, setzen)))
Die Markierungen _automatic_ und _manual_ werden von den Programmen zur
Paketverwaltung eigenständig gesetzt, wenn Sie Pakete installieren.
Grundlage sind die ausgewerteten Paketabhängigkeiten. Trotzdem können
Sie stets eigenhändig eingreifen, sofern dazu Ihrerseits Bedarf besteht.
`apt-mark` kennt dafür diese sechs Schalter:

`auto`:: automatisch installiert

`install`:: Paket wird installiert

`manual`:: Paket wird manuell installiert

`hold`:: Paket wird beibehalten

`purge`:: Paket inklusive Konfiguration löschen

`remove`:: Paket löschen

Damit setzen Sie die entsprechende Markierung für ein angegebenes Paket
explizit. Dazu erwartet `apt-mark` als Parameter ein einzelnes Paket oder
eine Paketliste. Die nachfolgende Ausgabe zeigt das Setzen der
Markierung _manual_ für das Paket 'wireshark'.

.Setzen der Paketmarkierungen 'manual' für das Paket 'wireshark'
----
# apt-mark manual wireshark
wireshark wurde als manuell installiert festgelegt.
#
----

// Stichworte für den Index
(((apt-mark, hold)))
(((apt-mark, unhold)))
(((Paketmarkierungen, hold)))
(((Paketmarkierungen, unhold)))
Für das Halten eines Pakets existieren die Unterkommandos `hold` und
`unhold`. Welchen konkreten Nutzen das haben kann, erfahren Sie unter 
``Ausgewählte Pakete nicht aktualisieren'' in
<<ausgewaehlte-pakete-nicht-aktualisieren>>.

[TIP]
.Liste der Pakete eingrenzen, deren Markierung geändert wird
====
Um nur eine Auswahl an Paketen zu markieren, erlaubt `apt-mark` eine
Paketliste in Form einer Datei, die Sie beim Aufruf mit übergeben:

----
apt-mark -f=paketliste manual
----

Die Datei ist eine Textdatei, in der pro Zeile ein Paketname steht. Mit
obigem Aufruf werden alle Pakete auf ``manuell installiert'' gesetzt,
die in der übermittelten Paketliste angegeben sind.
====

==== Was passiert, wenn Paketmarkierungen geändert werden? ====

// Stichworte für den Index
(((Paketmarkierungen, ändern)))
(((Paketmarkierungen, Änderungen in der Paketauswahl)))
(((Paketmarkierungen, Seiteneffekte)))
Durch das Setzen von Paketmarkierungen verändert sich die Art und Weise,
wie die Paketabhängigkeiten bewertet werden. `dpkg`, `apt`, `apt-get`
und `aptitude` respektieren die von Ihnen gesetzten Markierungen. `apt`,
`apt-get` und `aptitude` empfehlen Ihnen bei einer Änderung des
Paketbestands beispielsweise andere Pakete als sonst, um die
Paketabhängigkeiten nicht zu verletzen. Oder sie schlagen vor, bestimmte
Pakete zu entfernen, da sie neu als nicht mehr gebraucht angesehen
werden.

// Stichworte für den Index
(((Paketmarkierungen, explizit setzen)))
(((Paketmarkierungen, explizit entfernen)))
(((Paketmarkierungen, hold)))
(((Paketmarkierungen, unhold)))
Setzen oder Entfernen Sie bewusst das _hold_-Flag und legen somit eine
Version explizit fest, nehmen Sie Einfluss auf den Zustand Ihres Systems.
Wobei Ihnen das von Nutzen sein kann, erklären wir unter ``Ausgewählte
Pakete nicht aktualisieren'' (<<ausgewaehlte-pakete-nicht-aktualisieren>>)
ausführlicher.

==== Setzen und Entfernen einer Markierung mit `aptitude` ====

// Stichworte für den Index
(((aptitude, markauto)))
(((aptitude, unmarkauto)))
(((Debianpaket, zshdb)))
(((Debianpaket, wireshark)))
(((Paketmarkierungen, aufheben)))
(((Paketmarkierungen, mit aptitude entfernen)))
(((Paketmarkierungen, mit aptitude setzen)))
Alternativ zu `apt-mark` bietet sich auch `aptitude` an. Dort heißen
die Unterkommandos etwas anders, ebenso agiert `aptitude` vielleicht
ungewohnt. In der Standardeinstellung will es Pakete entfernen, die
mangels geänderter Abhängigkeiten nicht mehr benötigt werden. Im u.g.
Beispiel gibt es z.B. Pakete, die eine Abhängigkeit auf das Paket
'wireshark' haben, aber keine, die eine Abhängigkeit auf 'zshdb' haben.
Entsprechend will `aptitude` es auch direkt entfernen.

.Setzen von Paketmarkierungen mit `aptitude`
----
# aptitude markauto wireshark zshdb
Die folgenden Pakete werden ENTFERNT:
  zshdb{u}
0 Pakete aktualisiert, 0 zusätzlich installiert, 1 werden entfernt und 26 nicht aktualisiert.
0 B an Archiven müssen heruntergeladen werden. Nach dem Entpacken werden 451 kB frei werden.
Möchten Sie fortsetzen? [Y/n/?] n
Abbruch.
#
----

Möchten Sie eine Markierung wieder aufheben, kennt `aptitude` den
Schalter `unmarkauto`. Das nachfolgende Beispiel demonstriert das
Vorgehen.

.Aufheben von Paketmarkierungen mit `aptitude`
----
# aptitude unmarkauto wireshark zshdb
Es werden keine Pakete installiert, aktualisiert oder entfernt.
0 Pakete aktualisiert, 0 zusätzlich installiert, 0 werden entfernt und 26 nicht aktualisiert.
0 B an Archiven müssen heruntergeladen werden. Nach dem Entpacken werden 0 B zusätzlich belegt sein.
#
----

// Stichworte für den Index
(((aptitude, hold)))
(((aptitude, search ~U)))
(((aptitude, search ?upgradable)))
(((aptitude, unhold)))
Dabei fällt auf, das `aptitude` im Gegensatz zu `apt-mark` nicht angibt,
dass sich eine Markierung geändert oder nicht geändert hat. Stattdessen
informiert es Sie darüber, dass es keine Pakete entfernt oder
aktualisiert. Kurioserweise aktualisiert es (in der Standardeinstellung)
nicht automatisch die Pakete, bei denen die 'hold'-Markierung entfernt
wurde:

.Setzen eines Paketes auf 'hold' mit `aptitude`
----
# aptitude search '~U'
i A awesome                         - Hochkonfigurierbarer Fenstermanager für X
# aptitude hold awesome
Es werden keine Pakete installiert, aktualisiert oder entfernt.
0 Pakete aktualisiert, 0 zusätzlich installiert, 0 werden entfernt und 26 nicht aktualisiert.
0 B an Archiven müssen heruntergeladen werden. Nach dem Entpacken werden 0 B zusätzlich belegt sein.
# aptitude search '~U'
ihA awesome                         - Hochkonfigurierbarer Fenstermanager für X
# aptitude unhold awesome
Es werden keine Pakete installiert, aktualisiert oder entfernt.
0 Pakete aktualisiert, 0 zusätzlich installiert, 0 werden entfernt und 26 nicht aktualisiert.
0 B an Archiven müssen heruntergeladen werden. Nach dem Entpacken werden 0 B zusätzlich belegt sein.
# aptitude search '~U'
i A awesome                         - Hochkonfigurierbarer Fenstermanager für X
#
----

// Datei (Ende): ./konzepte/software-in-paketen-organisieren/lokale-paketmarkierungen.adoc
