dpkg
ist der Grundbefehl zum Umgang mit Debian-Paketen auf dem System. Falls Sie .deb
-Pakete haben, ermöglicht dpkg
es Ihnen, sie zu installieren oder ihren Inhalt zu analysieren. Aber dieses Programm sieht nur einen begrenzten Ausschnitt des Debian-Universums: Es weiß, was auf dem System installiert ist und was auch immer in der Befehlszeile eingegeben wird, aber es weiß nichts von den anderen verfügbaren Paketen. Daher wird es scheitern, wenn eine Abhängigkeit nicht erfüllt ist. Dagegen erzeugen Programme wie apt
und aptitude
eine Liste von Abhängigkeiten, um alles soweit möglich automatisch zu installieren.
dpkg
ist vor allem das Programm zur Installation eines bereits vorhandenen Debian-Pakets (da es nichts herunterlädt). Hierzu verwenden wir seine Option -i
oder --install
.
Beispiel 5.2. Installation eines Pakets mit dpkg
#
dpkg -i man-db_2.11.2-2_amd64.deb
(Reading database ... 166273 files and directories currently installed.) Preparing to unpack man-db_2.11.2-2_amd64.deb ... Unpacking man-db (2.11.2-2) over (2.11.2-2) ... Setting up man-db (2.11.2-2) ... Updating database of manual pages ... man-db.service is a disabled or a static unit not running, not starting it. Processing triggers for mailcap (3.70+nmu1) ...
dpkg
durchgeführten Schritte sehen; so wissen wir, an welchem Punkt möglicherweise ein Fehler aufgetreten ist. Die Installation kann in zwei Phasen betroffen sein: erstens beim Entpacken und zweitens bei der Konfigurierung. apt
nutzt dies, um die Anzahl der Aufrufe von dpkg
zu begrenzen (weil jeder Aufruf aufwendig ist, da jedes Mal die Datenbank in den Speicher geladen werden muss, vor allem die Liste der bereits installierten Dateien).
Beispiel 5.3. Getrenntes Entpacken und Konfigurieren
#
dpkg --unpack man-db_2.11.2-2_amd64.deb
(Reading database ... 166273 files and directories currently installed.) Preparing to unpack man-db_2.11.2-2_amd64.deb ... Unpacking man-db (2.11.2-2) over (2.11.2-2) ... Processing triggers for mailcap (3.70+nmu1) ... #
dpkg --configure man-db
Setting up man-db (2.11.2-2) ... Updating database of manual pages ... man-db.service is a disabled or a static unit not running, not starting it.
dpkg
will fail to install a package and return an error; if the user orders it to ignore this, it will only issue a warning; it is for this reason that we have the different --force-*
options. The dpkg --force-help
command, or documentation of this command, will give a complete list of these options. The most frequent error, which you are bound to encounter sooner or later, is a file collision. When a package contains a file that is already installed by another package, dpkg
will refuse to install it. The following messages will then appear:
Unpacking libgdm (from .../libgdm_3.8.3-2_amd64.deb) ...
dpkg: error processing /var/cache/apt/archives/libgdm_3.8.3-2_amd64.deb (--unpack):
trying to overwrite '/usr/bin/gdmflexiserver', which is also in package gdm3 3.4.1-9
--force-overwrite
benutzen, die dpkg
anweist, diesen Fehler zu ignorieren und die Datei zu überschreiben.
--force-*
options, only --force-overwrite
is likely to be used regularly. These options only exist for exceptional situations, rarely encountered in Debian Stable. It is better to leave them alone as much as possible in order to respect the rules imposed by the packaging mechanism. Do not forget, these rules ensure the consistency and stability of your system.
dpkg
mit der Option -r
oder --remove
, gefolgt von dem Paketnamen, entfernt das Paket. Dieses Entfernen ist jedoch nicht vollständig: alle Konfigurationsdateien, Betreuerskripte, Protokolldateien (Systemprotokolle) und andere vom Paket verarbeitete Nutzerdaten bleiben zurück. Es auf diese Weise zu deinstallieren ist schnell erledigt, andererseits bleibt aber die Möglichkeit bestehen, es schnell und mit derselben Konfiguration wieder zu installieren. Um alles, was mit einem Paket in Zusammenhang steht, vollständig zu entfernen, verwenden Sie die Option -P
oder --purge
, gefolgt von dem Paketnamen.
Beispiel 5.4. Entfernen und vollständiges Löschen des Pakets debian-cd
#
dpkg -r debian-cd
(Reading database ... 228705 files and directories currently installed.) Removing debian-cd (3.1.35) ... #
dpkg -P debian-cd
(Reading database ... 228049 files and directories currently installed.) Purging configuration files for debian-cd (3.1.35) ...
dpkg
options that query the internal database in order to obtain information. Giving first the long options and then corresponding short options (that will evidently take the same possible arguments) we cite
--listfiles package
(or -L
), which lists the files installed by this package;
--search file
(or -S
), which finds the package(s) containing the file;
--status package
(or -s
), which displays the headers of an installed package;
--list
(or -l
), which displays the list of packages known to the system and their installation status;
--contents file.deb
(or -c
), which lists the files in the Debian package specified;
--info file.deb
(or -I
), which displays the headers of this Debian package.
Beispiel 5.5. Verschiedene Anfragen mit dpkg
$
dpkg -L base-passwd
/. /usr /usr/sbin /usr/sbin/update-passwd /usr/share /usr/share/base-passwd /usr/share/base-passwd/group.master /usr/share/base-passwd/passwd.master /usr/share/doc /usr/share/doc/base-passwd /usr/share/doc/base-passwd/README /usr/share/doc/base-passwd/changelog.gz /usr/share/doc/base-passwd/copyright /usr/share/doc/base-passwd/users-and-groups.html /usr/share/doc/base-passwd/users-and-groups.txt.gz /usr/share/doc-base /usr/share/doc-base/base-passwd.users-and-groups /usr/share/lintian /usr/share/lintian/overrides /usr/share/lintian/overrides/base-passwd /usr/share/man /usr/share/man/de /usr/share/man/de/man8 /usr/share/man/de/man8/update-passwd.8.gz /usr/share/man/es /usr/share/man/es/man8 /usr/share/man/es/man8/update-passwd.8.gz /usr/share/man/fr /usr/share/man/fr/man8 /usr/share/man/fr/man8/update-passwd.8.gz /usr/share/man/ja /usr/share/man/ja/man8 /usr/share/man/ja/man8/update-passwd.8.gz /usr/share/man/man8 /usr/share/man/man8/update-passwd.8.gz /usr/share/man/pl /usr/share/man/pl/man8 /usr/share/man/pl/man8/update-passwd.8.gz /usr/share/man/ru /usr/share/man/ru/man8 /usr/share/man/ru/man8/update-passwd.8.gz $
dpkg -S /bin/date
coreutils: /bin/date $
dpkg -s coreutils
Package: coreutils Essential: yes Status: install ok installed Priority: required Section: utils Installed-Size: 18062 Maintainer: Michael Stone <mstone@debian.org> Architecture: amd64 Multi-Arch: foreign Version: 9.1-1 Pre-Depends: libacl1 (>= 2.2.23), libattr1 (>= 1:2.4.44), libc6 (>= 2.34), libgmp10 (>= 2:6.2.1+dfsg1), libselinux1 (>= 3.1~) Description: GNU core utilities This package contains the basic file, shell and text manipulation utilities which are expected to exist on every operating system. . Specifically, this package includes: arch base64 basename cat chcon chgrp chmod chown chroot cksum comm cp csplit cut date dd df dir dircolors dirname du echo env expand expr factor false flock fmt fold groups head hostid id install join link ln logname ls md5sum mkdir mkfifo mknod mktemp mv nice nl nohup nproc numfmt od paste pathchk pinky pr printenv printf ptx pwd readlink realpath rm rmdir runcon sha*sum seq shred sleep sort split stat stty sum sync tac tail tee test timeout touch tr true truncate tsort tty uname unexpand uniq unlink users vdir wc who whoami yes Homepage: http://gnu.org/software/coreutils $
dpkg -l 'b*'
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 +++-==========================-==============-============-=================== un backuppc <none> <none> (no description available) un balsa <none> <none> (no description available) ii baobab 43.0-1 amd64 GNOME disk usage analyzer un base <none> <none> (no description available) un base-config <none> <none> (no description available) ii base-files 12.4+deb12u5 amd64 Debian base system miscellaneous files ii base-passwd 3.6.1 amd64 Debian base system master password and group files ii bash 5.2.15-2+b2 amd64 GNU Bourne Again SHell ii bash-completion 1:2.11-6 all programmable completion for the bash shell [..] $
dpkg -c /var/cache/apt/archives/bash_5.2.15-2+b2_amd64.deb
drwxr-xr-x root/root 0 2023-04-23 17:23 ./ drwxr-xr-x root/root 0 2023-04-23 17:23 ./bin/ -rwxr-xr-x root/root 1265648 2023-04-23 17:23 ./bin/bash drwxr-xr-x root/root 0 2023-04-23 17:23 ./etc/ -rw-r--r-- root/root 1994 2023-04-23 17:23 ./etc/bash.bashrc drwxr-xr-x root/root 0 2023-04-23 17:23 ./etc/skel/ -rw-r--r-- root/root 220 2023-04-23 17:23 ./etc/skel/.bash_logout -rw-r--r-- root/root 3526 2023-04-23 17:23 ./etc/skel/.bashrc -rw-r--r-- root/root 807 2023-04-23 17:23 ./etc/skel/.profile drwxr-xr-x root/root 0 2023-04-23 17:23 ./usr/ drwxr-xr-x root/root 0 2023-04-23 17:23 ./usr/bin/ -rwxr-xr-x root/root 6865 2023-04-23 17:23 ./usr/bin/bashbug -rwxr-xr-x root/root 14488 2023-04-23 17:23 ./usr/bin/clear_console drwxr-xr-x root/root 0 2023-04-23 17:23 ./usr/share/ drwxr-xr-x root/root 0 2023-04-23 17:23 ./usr/share/debianutils/ drwxr-xr-x root/root 0 2023-04-23 17:23 ./usr/share/debianutils/shells.d/ -rw-r--r-- root/root 21 2023-04-23 17:23 ./usr/share/debianutils/shells.d/bash drwxr-xr-x root/root 0 2023-04-23 17:23 ./usr/share/doc/ [..] $
dpkg -I /var/cache/apt/archives/bash_5.2.15-2+b2_amd64.deb
new Debian package, version 2.0. size 1490660 bytes: control archive=2972 bytes. 77 bytes, 4 lines conffiles 1039 bytes, 27 lines control 4581 bytes, 65 lines md5sums 486 bytes, 24 lines * postinst #!/bin/bash 209 bytes, 5 lines * postrm #!/bin/sh 289 bytes, 22 lines * prerm #!/bin/bash Package: bash Source: bash (5.2.15-2) Version: 5.2.15-2+b2 Architecture: amd64 Essential: yes Maintainer: Matthias Klose <doko@debian.org> Installed-Size: 7164 Pre-Depends: libc6 (>= 2.36), libtinfo6 (>= 6) Depends: base-files (>= 2.1.12), debianutils (>= 5.6-0.1) Recommends: bash-completion (>= 20060301-0) Suggests: bash-doc Conflicts: bash-completion (<< 20060301-0) Replaces: bash-completion (<< 20060301-0), bash-doc (<= 2.05-1) Section: shells Priority: required Multi-Arch: foreign Homepage: http://tiswww.case.edu/php/chet/bash/bashtop.html Description: GNU Bourne Again SHell Bash is an sh-compatible command language interpreter that executes commands read from the standard input or from a file. Bash also incorporates useful features from the Korn and C shells (ksh and csh). . Bash is ultimately intended to be a conformant implementation of the IEEE POSIX Shell and Tools specification (IEEE Working Group 1003.2). . The Programmable Completion Code, by Ian Macdonald, is now found in the bash-completion package.
dpkg
speichert ein Protokoll über alle seine Aktivitäten in /var/log/dpkg.log
. Dieses Protokoll ist äußerst umfangreich, da es jeden einzelnen Schritt aufzeichnet, durch den die von dpkg
verarbeiteten Pakete gehen. Zusätzlich zu der Möglichkeit, das Verhalten von dpkg zu verfolgen, hilft es vor allem auch dabei, den Verlauf der Entwicklung des Systems festzuhalten: man kann den genauen Zeitpunkt feststellen, zu dem jedes Paket installiert oder aktualisiert worden ist, und diese Information kann für das Verständnis einer kürzlich aufgetretenen Verhaltensänderung äußerst hilfreich sein. Da alle Versionen aufgezeichnet werden, erleichtert es außerdem eine Gegenprobe mit changelog.Debian.gz
für betroffene Pakete oder sogar mit Online-Fehlerberichten.
Architektur
-Feld in ihren Kontrollinformationen. Dieses Feld kann entweder “all
” (für Pakete, die architekturunabhängig sind) enthalten oder die Bezeichnung der Ziel-Architektur (wie “amd64”, “armhf”, …). Im letzteren Fall wird dpkg
standardmäßig das Paket nur installieren, wenn diese Architekturangabe zu derjenigen des ausführenden Systems passt, wie sie von dpkg --print-architecture
zurückgegeben wird.
dpkg
ermöglicht es Anwendern, "fremde" Architekturen festzulegen, die auf dem aktullen System installiert werden können. Dazu wird einfach der Befehl dpkg --add-architecture
, wie unten gezeigt, aufgerufen. Der korrespondierende Befehl zum Beenden der Unterstützung für die andere Architektur lautet dpkg --remove-architecture
, er funktioniert allerdings nur, wenn keine Pakete für diese Architektur mehr in Benutzung sind.
#
dpkg --print-architecture
amd64 #
dpkg --print-foreign-architectures
#
dpkg -i gcc-12-base_12.2.0-14_arm64.deb
dpkg: error: cannot access archive 'gcc-12-base_12.2.0-14_arm64.deb': No such file or directory #
dpkg --add-architecture arm64
#
dpkg --add-architecture arm64
#
dpkg --print-foreign-architectures
arm64 #
dpkg -i gcc-12-base_12.2.0-14_arm64.deb
Selecting previously unselected package gcc-12-base:arm64. (Reading database ... 166273 files and directories currently installed.) Preparing to unpack gcc-12-base_12.2.0-14_arm64.deb ... Unpacking gcc-12-base:arm64 (12.2.0-14) ... Setting up gcc-12-base:arm64 (12.2.0-14) ... #
dpkg --remove-architecture arm64
dpkg: error: cannot remove architecture 'arm64' currently in use by the database [..] #
dpkg --remove-architecture arm64
#
dpkg --print-foreign-architectures
#
Multi-Arch: same
", um dem Verpackungssystem mitzuteilen, dass die verschiedenen Architekturen des Pakets sicher gemeinsam installiert werden können (und dass diese Pakete nur Abhängigkeiten von Paketen der gleichen Architektur erfüllen können). Die wichtigsten Bibliotheken wurden seit der Einführung von Multi-Arch in Debian 7 Wheezy konvertiert, aber es gibt viele Bibliotheken, die wahrscheinlich nie konvertiert werden, es sei denn, jemand fordert dies ausdrücklich an (z. B. durch einen Fehlerbericht).
$
dpkg -s gcc-12-base
dpkg-query: error: --status needs a valid package name but 'gcc-12-base' is not: ambiguous package name 'gcc-12-base' with more than one installed instance Use --help for help about querying packages. $
dpkg -s gcc-12-base:arm64 | grep ^Multi
Multi-Arch: same $
dpkg -L libgcc-s1:amd64 |grep .so
/lib/x86_64-linux-gnu/libgcc_s.so.1 $
dpkg -S /usr/share/doc/gcc-12-base/copyright
gcc-12-base:amd64, gcc-12-base:arm64: /usr/share/doc/gcc-12-base/copyright
Multi-Arch: same
Pakete im Namen den Hinweis auf die Architektur enthalten müssen, um eindeutig erkennbar zu sein. Auch können sie Dateien mit anderen Instanzen des gleichen Pakets teilen. Der Befehl dpkg
stellt sicher, dass gemeinsam genutzte Dateien auf Bit-Ebene identisch sind. Und nicht zuletzt müssen alle Instanzen eines Pakets den gleichen Versionsstand haben. Sie müssen also auch gleichzeitig aktualisiert werden.
Multi-Arch: foreign
” gekennzeichnet sein, oder seine Architektur muss mit derjenigen des Pakets übereinstimmen, das die Anhängigkeit festgelegt hat. Eine Architekturfestlegung kann auch noch dadurch auf alle möglichen Architekturen ausgeweitet werden, wenn package:any
angegeben wird, aber architekturfremde Pakete können dieser Anforderung nur genügen, wenn sie als “Multi-Arch: allowed
” gekennzeichne sind.