dpkg
er basiskommandoen for å behandle Debian-pakker på systemet. Hvis du har .deb
-pakker, er det dpkg
som tillater installasjon eller analyse av innholdet deres. Men dette programmet har bare en delvis oversikt over Debian-universet. Det vet hva som er installert på systemet, og hva det er gitt på kommandolinjen, men vet ingenting om andre tilgjengelige pakker. Den vil mislykkes hvis en avhengighet ikke er oppfylt. Verktøy som apt
og aptitude
, vil derimot lage en liste over avhengigheter for å kunne installere alt så automatisk som mulig.
dpkg
er fremfor alt verktøyet for å installere en allerede tilgjengelig Debian-pakke (fordi den ikke laster ned noe). For å gjøre det velger vi -i
eller --install
alternativet.
Eksempel 5.2. Installasjon av en pakke med 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
, dermed også ved hvilket punkt en eventuell feil har oppstått. Hver pakke installeres i to trinn; først utpakking, deretter oppsett. apt
utnytter dette til å begrense antall kall til dpkg
(siden hvert kall er kostbart på grunn av innlasting av databasen i minnet, spesielt listen over allerede installerte filer).
Eksempel 5.3. Separat utpakking og oppsett
#
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
, som ber dpkg
om å ignorere denne feilen og overskrive filen.
--force-*
valgmuligheter, er det bare --force-overwrite
det er sannsynlig å bruke jevnlig. Disse valgmulighetene er bare laget for helt spesielle situasjoner, som sjeldent opptrer i Debian Stable, og det er bedre å la dem være i fred så mye som mulig for å respektere reglene som pakkemekanismen pålegger. Glem ikke at disse reglene sikrer konsistens og stabilitet i systemet ditt.
dpkg
med -r
eller --remove
-valget, etterfulgt av navnet på en pakke, fjerner denne pakken. Denne fjerningen er imidlertid ikke fullstendig: Alle oppsettsfiler, vedlikeholderskript, loggfiler (systemlogger) og andre brukerdata som håndteres av pakken blir igjen. Dette gjør det enkelt å koble ut programmet ved å avinstallere det, og det kan raskt tilbakeføres med samme oppsett ved å installere det på nytt. For å fjerne alt som er tilknyttet en pakke kan du bruke -P
eller -- purge
-valget, fulgt av pakkenavnet.
Eksempel 5.4. Fjerning og utrenskning av debian-cd-pakken
#
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
-alternativene man kan kjøre som spørringer i den interne databasen for å hente info. Først kommer de lange formene, og så tilsvarende i kortform (som også tar de samme mulige argumentene)
--listfiles pakke
(eller -L
), som lister opp filer installert av denne pakken;
--search fil
(eller -S
), som finner pakk(ene) som inneholder filen;
--status pakke
(eller -s
), som viser hodene tilhørende en installert pakke;
--list
(eller -l
), som viser listen over pakker kjent for systemet og deres installasjonsstatus;
--contents fil.deb
(eller -c
), som lister opp filene Debian-pakken angir;
--info file.deb
(eller -I
), som viser hodene for denne Debian-pakken.
Eksempel 5.5. Forskjellige søk med 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
tar vare på en logg med alle handlinger i /var/log/dpkg.log
. Denne loggen er ekstremt ordrik, med detaljer for hver og en av de stadier som pakker, håndtert av dpkg
, gjennomgår. I tillegg til å gi en måte å spore dpkgs oppførsel på, hjelper den fremfor alt til med å beholde en historie om utviklingen av systemet: Man kan finne det nøyaktige øyeblikket når hver pakke er installert eller oppdatert, og denne informasjonen kan være svært nyttig i å forstå en nylig endring i oppførselen. I tillegg er alle versjoner tatt vare på, så det er lett å kryssjekke informasjonen med changelog.Debian.gz
for de pakker det gjelder, eller også med online bug-rapporter.
Architecture
-felt i kontrollinformasjonen. Dette feltet kan inneholde enten «all
» (for pakker som er arkitekturuavhengig), eller navnet på den arkitekturen som den er rettet mot (som «amd64», «armhf», ...). I det sistnevnte tilfellet vil, som utgangspunkt, dpkg
bare akseptere å installere pakken hvis arkitekturen svarer til vertsmaskinens arkitektur som meldt tilbake fra dpkg --print-architecture
.
dpkg
s multi-arkitekturstøtte tillater brukere å definere «fremmede arkitekturer» som kan installeres på det gjeldende systemet. Dette gjøres rett og slett med dpkg --add-architecture
som i eksemplet nedenfor. Det er en tilsvarende dpkg --remove-architecture
til å droppe støtte til en fremmed arkitektur, men den kan bare brukes når ingen pakker med denne arkitekturen er igjen.
#
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
» for å fortelle pakkesystemet at de ulike arkitekturene i pakken trygt kan installeres samtidig (og at disse pakkene bare kan tilfredsstille avhengigheter for pakker av samme arkitektur). De viktigste bibliotekene har blitt konvertert etter innføringen av multi-arch i Debian 7 Wheezy, men det er mange biblioteker som sannsynligvis aldri vil bli konvertert med mindre noen spesifikt ber om det (for eksempel via en feilrapport).
$
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
-pakker må ha navnet sitt kvalifisert med arkitektur for å være entydig identifiserbar. De har også muligheten til å dele filer med andre forekomster med den samme pakken; dpkg
sikrer at alle pakkene har bit-for-bit-identiske filer når de deles. Sist men ikke minst, må alle forekomster av en pakke ha den samme versjonen. De må dermed oppgraderes sammen.
Multi-Arch: foreign
», eller en pakke hvis arkitektur samsvarer med den ene av pakken som inneholder avhengigheten (i denne prosessen med avhengighetsavklaring er arkitekturuavhengige pakker antatt å ha den samme arkitektur som verten). En avhengighet kan også bli svekket ved å tillate ulike arkitekturer å imøtekomme den, med pakke:any
-syntaks, men fremmede pakker kan bare tilfredsstille en slik avhengighet hvis de er merket «Multi-Arch: allowed
».