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-get
, 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.6.2-1_amd64.deb
(Lendo banco de dados ... 96357 arquivos e diretórios atuais instalados.) Preparando para trocar man-db 2.6.1-3 (usando man-db_2.6.2-1_amd64.deb) ... Descompactando o man-db substituto ... Configurando o man-db (2.6.2-1) ... Construindo banco de dados das páginas do manual ...
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-get
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.6.2-1_amd64.deb
(Lendo banco de dados ... 96357 arquivos e diretórios atualmente instalados.) Preparando para substituir man-db 2.6.2-1 (usando man-db_2.6.2-1_amd64.deb) ... Desempacotando o man-db substituto ... #
dpkg --configure man-db
Configurando man-db (2.6.2-1) ... Construindo banco de dados de páginas do manual ...
dpkg
vai falhar ao instalar um pacote e retornar um erro; se o usuário ordenar que ele ignore isto, ele vai mostrar apenas um aviso; é por esta razão que temos as diferentes opções --force-*
. O comando dpkg --force-help
, ou a documentação deste comando, vai dar uma lista completa destas opções. O erro mais frequente, que você vai encontrar, cedo ou tarde, é colisão de arquivos. Quando um pacote contém um arquivo que já está instalado por outro pacote, o dpkg
se recusará a instalá-lo. As seguintes mensagens vão aparecer:
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 normalmente. Estas opções existem apenas para situações excepcionais, e é 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 o banco de dados ... 97747 arquivos e diretórios atualmente instalados.) Removendo debian-cd ... #
dpkg -P debian-cd
(Lendo o banco de dados ... 97401 arquivos e diretórios atualmente instalados.) Removendo debian-cd ... Limpando arquivos de configuração para debian-cd ...
dpkg
que consultam o banco de dados interno para obter informações. Mostrando primeiro as opções longas e depois as curtas correspondentes (que recebem, evidentemente, os mesmos argumentos) citamos --listfiles pacote
(ou -L
), que lista os arquivos instalados por este pacote; --search arquivo
(ou -S
), que procura o pacote contndo o arquivo; --status pacote
(ou -s
), que mostra os cabeçalhos de um pacote instalado; --list
(ou -l
), que mostra a lista de pacotes que o sistema conhece e seus estados de instalação; --contents arquivo.deb
(ou -c
), que lista os arquivos no pacote debian especificado; --info arquivo.deb
(ou -I
), que mostra os cabeçalhos de seu 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/man /usr/share/man/ru /usr/share/man/ru/man8 /usr/share/man/ru/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/man8 /usr/share/man/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/doc-base /usr/share/doc-base/users-and-groups /usr/share/base-passwd /usr/share/base-passwd/passwd.master /usr/share/base-passwd/group.master /usr/share/lintian /usr/share/lintian/overrides /usr/share/lintian/overrides/base-passwd /usr/share/doc /usr/share/doc/base-passwd /usr/share/doc/base-passwd/copyright /usr/share/doc/base-passwd/users-and-groups.html /usr/share/doc/base-passwd/changelog.gz /usr/share/doc/base-passwd/users-and-groups.txt.gz /usr/share/doc/base-passwd/README $
dpkg -S /bin/date
coreutils: /bin/date $
dpkg -s coreutils
Pacote: coreutils Essencial: Sim Estado: instalar ok instalado Prioridade: necessário Seção: utils Tamanho instalado: 13822 Mantenedor: Michael Stone <mstone@debian.org> Arquitetura: amd64 Multi-Arch: foreign Versão: 8.13-3.5 Replaces: mktemp, timeout Dependência: dpkg (>= 1.15.4) | install-info Pre-Dependência: libacl1 (>= 2.2.51-8), libattr1 (>= 1:2.4.46-8), libc6 (>= 2.7), libselinux1 (>= 1.32) Conflitos: timeout 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 od paste pathchk pinky pr printenv printf ptx pwd readlink 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) ||/ Nome Versão Arquitetura Descrição +++-============-==============-==============-================================ un backupninja <none> (nenhuma descrição disponível) un base <none> (nenhuma descrição disponível) un base-config <none> (nenhuma descrição disponível) ii base-files 7.1 amd64 Debian base system miscellaneous ii base-passwd 3.5.26 amd64 Debian base system master passwo [...] $
dpkg -c /var/cache/apt/archives/gnupg_1.4.12-7_amd64.deb
drwxr-xr-x root/root 0 2013-01-02 19:28 ./ drwxr-xr-x root/root 0 2013-01-02 19:28 ./usr/ drwxr-xr-x root/root 0 2013-01-02 19:28 ./usr/share/ drwxr-xr-x root/root 0 2013-01-02 19:28 ./usr/share/doc/ drwxr-xr-x root/root 0 2013-01-02 19:28 ./usr/share/doc/gnupg/ -rw-r--r-- root/root 3258 2012-01-20 10:51 ./usr/share/doc/gnupg/TODO -rw-r--r-- root/root 308 2011-12-02 18:34 ./usr/share/doc/gnupg/FAQ -rw-r--r-- root/root 3543 2012-02-20 18:41 ./usr/share/doc/gnupg/Upgrading_From_PGP.txt -rw-r--r-- root/root 690 2012-02-20 18:41 ./usr/share/doc/gnupg/README.Debian -rw-r--r-- root/root 1418 2012-02-20 18:41 ./usr/share/doc/gnupg/TODO.Debian [...] $
dpkg -I /var/cache/apt/archives/gnupg_1.4.12-7_amd64.deb
novo pacote debian, versão 2.0. tamanho 1952176 bytes: arquivo de controle=3312 bytes. 1449 bytes, 30 lines control 4521 bytes, 65 lines md5sums 479 bytes, 13 lines * postinst #!/bin/sh 473 bytes, 13 lines * preinst #!/bin/sh Pacote: gnupg Versão: 1.4.12-7 Arquitetura: amd64 Mantenedor: Debian GnuPG-Maintainers <pkg-gnupg-maint@lists.alioth.debian.org> Tamanho instalado: 4627 Dependencias: libbz2-1.0, libc6 (>= 2.4), libreadline6 (>= 6.0), libusb-0.1-4 (>= 2:0.1.12), zlib1g (>= 1:1.1.4), dpkg (>= 1.15.4) | install-info, gpgv Recommends: libldap-2.4-2 (>= 2.4.7), gnupg-curl Suggests: gnupg-doc, xloadimage | imagemagick | eog, libpcsclite1 Section: utils Priority: important Multi-Arch: foreign Homepage: http://www.gnupg.org Descrição: GNU privacy guard - a free PGP replacement GnuPG é uma ferramenta do GNU para comunicação segura e armazenamento de dados. Ela pode ser utilizada para encriptar os dados e para criar assinaturas digitais. Inclui uma facilidade de gerenciamento avançado de chave e é compatível com o padrão proposto de Internet do OpenPGP como descrito no RFC 4880. [...]
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 relatorio 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 arquitectura 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-4.7-base_4.7.2-5_armhf.deb
dpkg: error processing gcc-4.7-base_4.7.2-5_armhf.deb (--install): package architecture (armhf) does not match system (amd64) Errors were encountered while processing: gcc-4.7-base_4.7.2-5_armhf.deb #
dpkg --add-architecture armhf
#
dpkg --add-architecture armel
#
dpkg --print-foreign-architectures
armhf armel #
dpkg -i gcc-4.7-base_4.7.2-5_armhf.deb
Selecting previously unselected package gcc-4.7-base:armhf. (Reading database ... 97399 files and directories currently installed.) Unpacking gcc-4.7-base:armhf (from gcc-4.7-base_4.7.2-5_armhf.deb) ... Setting up gcc-4.7-base:armhf (4.7.2-5) ... #
dpkg --remove-architecture armhf
dpkg: error: cannot remove architecture 'armhf' currently in use by the database #
dpkg --remove-architecture armel
#
dpkg --print-foreign-architectures
armhf
Multi-Arqu: same
” para dizer ao sistema de embalagem 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 arquitectura). Desde que o multi-arqu fez sua estréia no Debian Wheezy, nem todas as bibliotecas foram convertidas ainda (mas todas as bibliotecas que foram embutidas no ia32-libs foram!).
$dpkg -s gcc-4.7-base
dpkg-query: error: --status needs a valid package name but 'gcc-4.7-base' is not: ambiguous package name 'gcc-4.7-base' with more than one installed instance Use --help for help about querying packages. $dpkg -s gcc-4.7-base:amd64 gcc-4.7-base:armhf | grep ^Multi
Multi-Arch: same Multi-Arch: same $dpkg -L libgcc1:amd64 |grep .so
/lib/x86_64-linux-gnu/libgcc_s.so.1 $dpkg -S /usr/share/doc/gcc-4.7-base/copyright
gcc-4.7-base:armhf, gcc-4.7-base:amd64: /usr/share/doc/gcc-4.7-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
”.