dpkg
é o comando básico para lidar com pacotes Debian no sistema. Se você tem pacotes .deb
, é com o dpkg
que você instala ou analisa seu conteúdo. Mas este programa tem apenas uma visão parcial do universo Debian: ele sabe o que está instalado no sistema, e o que for dado na linha de comando, mas não sabe nada dos outros pacotes disponíveis. Assim, ele vai falhar se uma dependência não for satisfeita. Ferramentas como o apt
e aptitude
, ao contrário, criará uma lista de dependências para instalar tudo o mais automaticamente possível.
dpkg
é, principalmente, a ferramenta para instalar um pacote Debian já disponível (já que ele não baixa nada). Para isto, usamos sua opção -i
ou --install
.
Exemplo 5.2. Instalação de um pacote com 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
; sabemos, portanto, em qual ponto um erro ocorreu. A instalação pode também ser realizada em dois estágios: primeiro desempacotar, depois configurar. O apt
usa isto, limitando o número de chamadas para o dpkg
(já que cada chamada é custosa, devido à carga do banco de dados em memória, principalmente da lista de arquivos já instalados).
Exemplo 5.3. Desempacotando e configurando separadamente
#
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:
Desempacotando libgdm (from .../libgdm_3.8.3-2_amd64.deb) ...
dpkg: erro processando /var/cache/apt/archives/libgdm_3.8.3-2_amd64.deb (--unpack):
tentando sobrescrever '/usr/bin/gdmflexiserver', que também está no pacote gdm3 3.4.1-9
--force-overwrite
, que diz ao dpkg
para ignorar este erro e sobreescrever o arquivo.
--force-*
disponíveis, apenas --force-overwrite
costuma ser usada regularmente. Estas opções existem apenas para situações excepcionais, raramente encorajadas no Debian Stable. É melhor evitar usá-las o máximo possível para respeitar as regras impostas pelo mecanismo de empacotamento. Não esqueça, estas regras garantem a consistência e estabilidade de seu sistema.
dpkg
com a opção -r
ou --remove
, seguida pelo nome de um pacote, remove o pacote. Esta remoção é, entretanto, incompleta: todos os arquivos de configuração, scripts do mantenedor, arquivos de log (logs de sistema) e outros dados do usuário manipulados pelo pacote permanecem. Dessa forma, a desativação do programa é feita facilmente desinstalando-o, e ainda é possível reinstalá-lo rapidamente com a mesma configuração. Para remover completamente tudo associado a um pacote, use a opção -P
ou --purge
, seguida do nome do pacote.
Exemplo 5.4. Remoção e expurgo do pacote debian-cd
#
dpkg -r debian-cd
(Lendo base de dados ... 228705 arquivos e diretórios já instalados.) Removendo debian-cd (3.1.35) ... #
dpkg -P debian-cd
(Lendo base de dados ... 228049 arquivos e diretórios já instalados.) Limpando arquivos de configuração para debian-cd (3.1.35) ...
dpkg
que consultam o banco de dados interno para obter informações. Dando primeiro as opções no formato longo e depois os correspondentes formatos curtos (que, evidentemente, vão ter os mesmo argumentos possiveis) citamos
--listfiles pacote
(ou -L
), que lista os arquivos instalados pelo pacote;
--search arquivo
(ou -S
), que encontra o(s) pacote(s) contendo o arquivo;
--status pacote
(ou -s
), que mostra os cabeçalhos dos pacotes instalados;
--list
(ou -l
), que mostra a lista de pacotes conhecidos do sistema e seus status de instalação;
--contents file.deb
(ou -c
), que lista os arquivos no pacote Debian específico;
--info file.deb
(ou -I
), que mostra os cabeçalhos deste pacote Debian.
Exemplo 5.5. Várias consultas com o 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
mantém um log de todas as suas ações em /var/log/dpkg.log
. Este log é extremamente detalhado, pois detalha todos os passos da manipulação de pacotes pelo dpkg
. Adicionalmente oferece uma forma de rastrear o comportamento do dpkg, ele ajuda, sobretudo, a manter um histórico do desenvolvimento do sistema: pode-se encontrar o exato momento em que cada pacote foi instalado ou atualizado, e esta informação pode ser extremamente útil para entender uma mudança de comportamento recente. Adicionalmente, com todas as versões sendo registradas, é fácil cruzar os dados com a informação em changelog.Debian.gz
para o pacote em questão, ou mesmo com o relatório de defeitos on line (bug reports online).
Arquitetura
na informação de controle dele. Este campo pode conter também “Todos
” (para aqueles pacotes que são de todas as arquiteturas independentemente) ou o nome da arquitetura que ele aponta (como “amd64”, “armhf”, …). Neste último caso, por padrão, dpkg
apenas aceitará instalar o pacote, se a sua arquitetura combinar com a arquitetura do host como retornado pelo dpkg --print-arquitetura
.
dpkg
permite aos usuários definir arquiteturas “estrangeiras” que podem ser instaladas no sistema atual. Isto é simplesmente feito com dpkg --add-architecture
como no exemplo abaixo. Há um correspondente dpkg --remove-architecture
para remover o suporte de uma arquitetura externa, mas ele só pode ser usado quando nenhum pacote desta arquitetura permanece.
#
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-Arqu: same
” para dizer ao sistema de empacotamento que as várias arquiteturas do pacote podem ser seguramente co-instaladas (e que os pacotes só podem satisfazer as dependências de pacotes da mesma arquitetura). As bibliotecas mais importantes foram convertidas desde a introdução do multi-arch no Debian 7 Wheezy, mas existem muitas bibliotecas que provavelmente nunca serão convertidas a menos que alguém peça especificamente por elas (através de um bugreport, por exemplo).
$
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-Arqu: same
devem ter seus nomes qualificados com sua arquitetura para ser inequivocamente identificável. Eles também têm a possibilidade de compartilhar arquivos com outras instâncias do mesmo pacote; dpkg
garante que todos os pacotes têm arquivos bit-por-bit idênticos quando eles são compartilhados. Por último, mas não menos importante, todas as instâncias de um pacote devem ter a mesma versão. Devem, portanto, ser atualizados em conjunto.
Multi-Arqu: foreign
” ou um pacote cuja arquitetura corresponde ao do pacote declarando a dependência (no processo de resolução de dependência, pacotes independentes de arquitetura são assumidos ser da mesma arquitetura que o host). A dependência também pode ser enfraquecida para permitir que qualquer arquitetura de cumpri-la, com a sintaxe pacote:any
, mas pacotes estrangeiros só podem satisfazer uma tal dependência, se eles são marcados “Multi-Arch: allowed
”.