# dpkg / APT / Aptitude

# Alle durch Benutzer geänderten paketierte Konfigurationsdateien ausgeben

<div id="bkmrk-dpkg-query--w--f%3D%27%24%7B">```
dpkg-query -W -f='${Conffiles}\n' '*' | awk 'OFS="  "{print $2,$1}' | LANG=C md5sum -c 2>/dev/null | awk -F': ' '$2 !~ /OK$/{print $1}' | sort
```

</div>

# Alle installierten Pakete auf einen anderen Server übertragen

<p class="callout info">Vorher sollten als entfernt markierte Pakete gelöscht werden, siehe [hier](https://wiki.magenbrot.net/books/paketmanager/page/dpkg-rc-pakete-entfernen "dpkg-rc Pakete entfernen").</p>

Quelle:

```code
dpkg --get-selections > selection.txt
```

dann die Datei per scp oder Copy&amp;Paste auf das Ziel übertragen. Dort:

```code
dpkg --set-selections < selection.txt
```

Falls hier Warnings auftreten siehe unten.

Danach können die Pakete installiert werden:

```code
aptitude install
# oder
apt-get -u dselect-upgrade
```

Sollte es bei „–set-selections“ Warnungen gegeben haben, muss noch dselect installiert werden:

```code
apt-get install dselect
dselect 
   -> Update
   -> Install
   -> Quit
```

Folgende Alternative funktioniert auch, wenn man Pakete nur selektiv übertragen möchte. Mit diesem Beispiel erhalte ich eine einfach zu übertragende Liste aller Pakete, die `perl` im Namen oder der Beschreibung haben (läßt sich dann einfach an `aptitude install` übergeben):

```code
dpkg -l | grep perl | awk '{ printf "%s ", $2 }'
```

# dpkg-Cheat-Sheet

#### Pakete auf Version festhalten / hold

ein Paket auf „hold“ setzen

<div id="bkmrk-echo-%3Cpaketname%3E-hol"><div>```
echo <paketname> hold | dpkg --set-selections
```

</div></div>ein Paket wieder fürs Updaten freigeben

<div id="bkmrk-echo-%3Cpaketname%3E-ins"><div>```
echo <paketname> install | dpkg --set-selections
```

</div></div>gehaltene Pakete anzeigen

<div id="bkmrk-dpkg---get-selection">```
dpkg --get-selections | awk '$2 == "hold" { print $1 }'
```

</div>#### Fremdpakete finden

<div id="bkmrk-die-folgenden-tipps-"><div><div>Die folgenden Tipps sind nicht immer zuverlässig</div></div></div>Pakete finden, die aus keinem der konfigurierten Repositories stammen (auf einem sauberen System sollte diese Liste leer sein):

<div id="bkmrk-aptitude-search-%27%3Fna"><div>```
aptitude search '?narrow(?not(?archive("^[^n][^o].*$")),?version(CURRENT))'
```

</div></div>Pakete finden, die nicht aus einem Debian-Repo stammen

<div id="bkmrk-dpkg--l-%7C-awk-%27%2F%5E.i%2F">```
dpkg -l | awk '/^.i/ {print $2}' | xargs apt-cache policy | awk '/^[a-z0-9.\-]+:/ {pkg=$1}; /\*\*\*/ {OFS="\t"; ver=$2; getline; print pkg,ver,$2,$3}'
```

</div>

# dpkg-rc Pakete entfernen

Auf einem gut gereiften System oder z.B auch nach einem Dist-Upgrade sammeln sich gerne teilweise entfernte Pakete an. Diese erkennt man an dem rc im dpkg Status. Das bedeutet, dass das Paket entfernt wurde, aber die Konfigurationsdateien noch auf dem System verblieben sind.

Am besten vorher noch ein autoremove fahren:

```
apt autoremove
```

Danach kann man sich die Liste der halb-deinstallierten Pakete anschauen:

```code
dpkg --list | grep "^rc"
```

Das sieht dann z.B. so aus:

```code
rc  dctrl-tools                      2.14.5                                amd64        Command-line tools to process Debian package information
rc  libaugeas0                       0.7.2-1                               amd64        The augeas configuration editing library and API
rc  libbind9-60                      1:9.7.3.dfsg-1~squeeze10              amd64        BIND9 Shared Library used by BIND
rc  libdns69                         1:9.7.3.dfsg-1~squeeze10              amd64        DNS Shared Library used by BIND
rc  libisc62                         1:9.7.3.dfsg-1~squeeze10              amd64        ISC Shared Library used by BIND
rc  libisccc60                       1:9.7.3.dfsg-1~squeeze10              amd64        Command Channel Library used by BIND
```

Das rc steht dabei für als „entfernt“ markierte Pakete, deren Konfigurationsdateien noch auf dem System liegen.

Gelegentlich empfiehlt es sich dann aufzuräumen. Mit folgendem Snippet lassen sich all diese Pakete bequem auf einmal entfernen:

```code
dpkg --list | grep "^rc" | cut -d " " -f 3 | xargs dpkg --purge
```

Alternativ mit einem apt Kommando:

```code
apt-get purge $(dpkg -l | awk '/^rc/ { print $2 }')
```

# Was bedeuten die verschiedenen flags bei dpkg -l?

m Header von „dpkg -l“ steht die Erklärung dazu. Hier eine kurze Übersicht:

```code
$ dpkg -l | head -6

Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                                        Version                                             Architecture Description

ii  accountsservice                             0.6.35-0ubuntu7.2                                   amd64        query and manipulate user account information

```

Hier die Beschreibung der einzelnen Felder:

<div id="bkmrk-erster-buchstabe-gew"><div><table class="inline"><thead><tr class="row0"><th class="col0">Erster Buchstabe</th><th class="col1">gewünschter Zustand („selection state“)</th></tr></thead><tbody><tr class="row1"><td class="col0">u</td><td class="col1">unknown</td></tr><tr class="row2"><td class="col0">i</td><td class="col1">install</td></tr><tr class="row3"><td class="col0">r</td><td class="col1">remove/deinstall</td></tr><tr class="row4"><td class="col0">p</td><td class="col1">purge (Paket soll inklusive der Konfigurationsdateien entfernt werden)</td></tr><tr class="row5"><td class="col0">h</td><td class="col1">hold</td></tr></tbody></table>

</div></div><div id="bkmrk-zweiter-buchstabe-ak"><div><table class="inline"><thead><tr class="row0"><th class="col0">Zweiter Buchstabe</th><th class="col1">aktueller Zustand</th></tr></thead><tbody><tr class="row1"><td class="col0">n</td><td class="col1">not-installed</td></tr><tr class="row2"><td class="col0">i</td><td class="col1">installed</td></tr><tr class="row3"><td class="col0">c</td><td class="col1">config-files (nur Konfigurationsdateien sind installiert)</td></tr><tr class="row4"><td class="col0">u</td><td class="col1">unpacked</td></tr><tr class="row5"><td class="col0">f</td><td class="col1">half-configured (Konfiguration ist aus irgendeinem Grund fehl geschlagen)</td></tr><tr class="row6"><td class="col0">h</td><td class="col1">half-installed (Installation ist aus irgendeinem Grund fehl geschlagen)</td></tr><tr class="row7"><td class="col0">w</td><td class="col1">triggers-awaited (Paket wartet auf Trigger durch ein anderes Paket)</td></tr><tr class="row8"><td class="col0">t</td><td class="col1">triggers-pending (Paket wurde getriggert)</td></tr><tr class="row9"><td class="col0">B</td><td class="col1">broken (Installation/Update fehlgeschlagen)</td></tr></tbody></table>

</div></div><div id="bkmrk-dritter-buchstabe-fe"><table class="inline"><thead><tr class="row0"><th class="col0">Dritter Buchstabe</th><th class="col1">Fehler (da sollte normalerweise nichts stehen)</th></tr></thead><tbody><tr class="row1"><td class="col0">r</td><td class="col1">reinst-required (Paket ist kaputt und sollte neu installiert werden)</td></tr></tbody></table>

</div>

# APT / Aptitude - Tipps und Tricks

- Verfügbare Updates anzeigen, aber nicht installieren:

```code
# aptitude -F%p --disable-columns search ~U
# oder:
# apt-get --just-print dist-upgrade
```

- durch „aptitude hold“ gehaltene Pakete:

```code
aptitude search ~ahold
```

- <div>Abhängigkeiten, Vorschläge, Empfohlen, Konflikte eines Paketes anzeigen:</div>

```code
# apt-cache depends tar
tar
  PreDepends: libc6
  Suggests: bzip2
  Suggests: ncompress
  Suggests: xz-utils
  Conflicts: cpio
  Breaks: dpkg-dev
  Replaces: cpio
```

- <div>warum ist ein bestimmtes Paket installiert worden (required by):</div>

```code
# aptitude why tar
i   dpkg PreDepends tar (>= 1.23)
```

- <div>Installierte Pakete anzeigen die kein anderes Paket voraussetzt (depends on):</div>

```code
aptitude search '~i ! ~R ~i'

# erweitert auf "Empfohlen" oder "Vorgeschlagen" (recommends / suggests):
aptitude search '~i ! ~R ~i ! ~Rrecommends:~i  ! ~Rsuggests:~i'

# für alle Pakete, installiert oder nicht:
aptitude search '! ~R .'
```

# GPG-Key eines Repositorys in Apt hinzufügen

Beim Einbinden eines neuen Repositorys erscheint diese Meldung, wenn der GPG-Key, mit dem die Pakete signiert wurden, nicht in der APT-Datenbank enthalten ist:

```code
W: GPG error: http://packages.linuxmint.com sarah Release: 
The following signatures couldn't be verified because the 
public key is not available: NO_PUBKEY A6616109451BBBF2
```

Das läßt sich ganz einfach beheben:

```code
# apt-key adv --recv-keys --keyserver keyserver.ubuntu.com A6616109451BBBF2

Executing: gpg --ignore-time-conflict --no-options --no-default-keyring --homedir /tmp/tmp.in8AoFu6Qi --no-auto-check-trustdb --trust-model always --keyring /etc/apt/trusted.gpg --primary-keyring /etc/apt/trusted.gpg --keyring /etc/apt/trusted.gpg.d/steam.gpg --recv-keys --keyserver keyserver.ubuntu.com A6616109451BBBF2
gpg: requesting key 451BBBF2 from hkp server keyserver.ubuntu.com
gpg: key 451BBBF2: public key "Linux Mint Repository Signing Key <root@linuxmint.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
```