Capítulo 7. Básicas do sistema de gestão de pacotes Debian

Índice

7.1. O que é um pacote Debian?
7.2. Qual é o formato de um pacote binário Debian?
7.3. Porque são os nomes dos ficheiros de pacotes Debian tão longos?
7.4. O que é um ficheiro de controle Debian?
7.5. O que é um conffile Debian?
7.6. O que é um script Debian preinst, postinst, prerm, e postrm?
7.7. O que é um pacote Essential, Required, Important, Standard, Optional, ou Extra?
7.8. O que é um Pacote Virtual?
7.9. O que significa dizer que um pacote Depends, Recommends, Suggests, Conflicts, Replaces, Breaks ou Provides outro pacote?
7.10. O que significa Pre-Depends?
7.11. O que significa unknown, install, remove, purge e hold no status do pacote?
7.12. Como pôr um pacote em hold?
7.13. Como é que Eu instalo um pacote fonte?
7.14. Com é que Eu compilo pacotes binários a partir de um pacote fonte?
7.15. Como é que Eu crio eu próprio pacotes Debian?

Este capítulo toca em alguns intervalos de baixo nível da gestão de pacotes Debian. Se você está interessado principalmente na utilização da ferramentas relevantes, salte para os capítulos Capítulo 8, As ferramentas de gestão de pacotes Debian e/ou Capítulo 9, Manter o seu sistema Debian actualizado.

7.1. O que é um pacote Debian?

Os pacotes geralmente contêm todos os ficheiros necessários a implementar um conjunto de comandos ou funcionalidades relacionadas. Existem dois tipos de pacotes Debian.

  • Pacotes Binários, que contêm executáveis, ficheiros de configuração, manuais/paginas de informação, informação de copyright , e outra documentação. Estes pacotes são distribuídos num formato de arquivo específico de Debian (veja Secção 7.2, “Qual é o formato de um pacote binário Debian?”); são geralmente caracterizados ao terem uma extensão de ficheiro '.deb'. Pacotes binários podem ser desempacotados usando o utilitário Debian dpkg (possivelmente via um frontend como o aptitude); os detalhes são dados no seu manual.

  • Pacotes Fonte, que consistem de um ficheiro .dsc que descreve o pacote fonte (incluindo os nomes dos seguintes ficheiros), um ficheiro .orig.tar.gz que contém a fonte original não modificada em formato tar comprimido com gzip e geralmente um ficheiro .diff.gz que contém as alterações específicas de Debian à fonte original. O utilitário dpkg-source empacota e desempacota arquivos fonte Debian, os detalhes são fornecidos no seu manual. (O programa apt-get pode ser usado como um frontend para o dpkg-source.)

A instalação de software pelo sistema de pacotes usa "dependências" que são designadas cuidadosamente pelos responsáveis dos pacotes. Estas dependências estão documentadas no ficheiro control associado a cada pacote. Por exemplo, o pacote que contém o compilador GNU C (gcc) "depende" do pacote binutils o qual inclui o vinculador e assemblador. Se um utilizador tentar instalar o gcc sem ter primeiro instalado o binutils, o sistema de gestão de pacotes (dpkg) irá enviar uma mensagem de erro de que também precisa do binutils, e pára a instalação do gcc. (No entanto, esta funcionalidade pode ser sobreposta por um utilizador insistente, veja dpkg(8).) Veja mais em Secção 7.9, “O que significa dizer que um pacote Depends, Recommends, Suggests, Conflicts, Replaces, Breaks ou Provides outro pacote?” em baixo.

As ferramentas de empacotamento de Debian podem ser usadas para:

  • manipular e gerir pacotes ou partes de pacotes,

  • administrar sobreposições locais de ficheiros num pacote,

  • ajudar desenvolvedores na construção de arquivos de pacotes, e

  • ajudar utilizadores na instalação de pacotes que residem num site arquivo remoto.

7.2. Qual é o formato de um pacote binário Debian?

Um "pacote" Debian, ou um ficheiro de arquivo Debian, contém os ficheiros executáveis, bibliotecas, e documentação associada a uma suite de programa particular ou a um conjunto de programas relacionados. Normalmente, um ficheiro de arquivo Debian tem um nome de ficheiro que termina em .deb.

O mecanismo interno deste formato de pacotes binários Debian está descrito no manual deb(5). Este formato interno está sugeito a alterações (entre grandes lançamentos de Debian GNU/Linux), assim por favor use sempre o dpkg-deb(1) se precisar fazer manipulações de baixo nível em ficheiros .deb.

7.3. Porque são os nomes dos ficheiros de pacotes Debian tão longos?

Os nomes dos ficheiros de pacotes binários Debian estão em conformidade coma seguinte convenção: <foo>_<VersionNumber>-<DebianRevisionNumber>_<DebianArchitecture>.deb

Note que foo é suposto ser o nome do pacote. Verificar o nome de pacote associado a um ficheiro de arquivo Debian particular (ficheiro .deb) pode ser feito de uma destas maneiras:

  • inspecionar o ficheiro "Packages" no directório onde foi armazenado num site de arquivo Debian. Este ficheiro contém uma estrofe que descreve cada pacote; o primeiro campo de cada estrofe é o nome formal do pacote.

  • usar o comando dpkg --info foo_VVV-RRR_AAA.deb (onde VVV, RRR e AAA são a versão, revisão e arquitectura do pacote em questão, respetivamente). Isto mostra, entre outras coisas, o nome do pacote correspondente ao ficheiro de arquivo a ser desempacotado.

O componente VVV é o número de versão especificado pelo desenvolvedor original. Não existem standards aqui, assim o número de versão pode ter formatos tão diferentes como "19990513" e "1.3.8pre1".

O componente RRR é o número de revisão Debian, e é especificado pelo desenvolvedor Debian (ou por um utilizador que escolheu recompilar o pacote localmente). Este número corresponde ao nível de revisão do pacote Debian, assim, um novo nível de revisão geralmente significa alterações no Makefile de Debian (debian/rules), no ficheiro de controle Debian (debian/control), nos scripts de instalação ou remoção (debian/p*), ou nos ficheiros de configuração usados com o pacote.

O componente AAA identifica o processador para o qual o pacote foi compilado. Isto é geralmente amd64, que se refere a chips AMD64, Intel 64 ou VIA Nano. Para outras possibilidades reveja a estrutura de directórios do arquivo de Debian em Secção 6.7, “O que são todos aqueles directórios nos arquivos Debian?”. Para detalhes, veja a descrição de "arquitectura de Debian" no manual dpkg-architecture(1).

7.4. O que é um ficheiro de controle Debian?

Especificações respeitantes ao conteúdo de um ficheiro de controle Debian são fornecidas no Manual Debian Policy, secção 5, veja Secção 12.1, “Que outra documentação existe para o sistema Debian?”.

Abreviadamente, um exemplo de ficheiro de controle é mostrado em baixo para o pacote Debian hello:

Package: hello
Version: 2.9-2+deb8u1
Architecture: amd64
Maintainer: Santiago Vila <sanvila@debian.org>
Installed-Size: 145
Depends: libc6 (>= 2.14)
Conflicts: hello-traditional
Breaks: hello-debhelper (<< 2.9)
Replaces: hello-debhelper (<< 2.9), hello-traditional
Section: devel
Priority: optional
Homepage: https://www.gnu.org/software/hello/
Description: example package based on GNU hello
 The GNU hello program produces a familiar, friendly greeting.  It
 allows non-programmers to use a classic computer science tool which
 would otherwise be unavailable to them.
 .
 Seriously, though: this is an example of how to do a Debian package.
 It is the Debian version of the GNU Project's `hello world' program
 (which is itself an example for the GNU Project).

O campo Package dá o nome do pacote. Este é o nome pelo qual o pacote pode ser manipulado pelas ferramentas de pacotes, e é geralmente semelhante mas não necessariamente igual à primeira string de componente no nome de ficheiro no arquivo Debian.

O campo Version fornece ambos o número de versão do desenvolvedor original e (no último componente) o nível de revisão do pacote Debian deste programa como explicado em Secção 7.3, “Porque são os nomes dos ficheiros de pacotes Debian tão longos?”.

O campo Architecture especifica o chip para o qual este binário particular foi compilado.

O campo Depends dá uma lista de pacotes que têm de ser instalados de modo a se instalar este pacote com sucesso.

O Installed-Size indica quanto espaço de disco irá consumir o pacote instalado. Isto destina-se a ser usado por programas front-end de instalação de modo a mostrar se há espaço de disco disponível suficiente para instalar o programa.

A linha Section dá a "secção" onde este pacote Debian está armazenado nos sites arquivo Debian.

Priority indica quão importante é este pacote para instalação, para que software semi-inteligente como o apt ou o aptitude possam ordenar o pacote numa categoria de, por exemplo, pacotes instalados opcionalmente. Veja Secção 7.7, “O que é um pacote Essential, Required, Important, Standard, Optional, ou Extra?”.

O campo Maintainer dá o endereço de e-mail da pessoa que é o actual responsável pela manutenção deste pacote.

O campo Description dá um sumário breve das funcionalidades do pacote.

Para mais informação sobre todos os campos possíveis que um pacote pode ter, por favor veja o Manual de Política Debian, secção 5, "Ficheiros de controle e seus campos", veja Secção 12.1, “Que outra documentação existe para o sistema Debian?”.

7.5. O que é um conffile Debian?

Conffiles é uma lista de ficheiros de configuração (geralmente colocados em /etc) que o sistema de gestão de pacotes não irá sobrescrever quando o pacote é actualizado. Isto assegura que valores locais nos conteúdos destes ficheiros serão preservados, e é uma funcionalidade crítica que permite a actualização de pacotes no-local num sistema em funcionamento.

Para determinar exactamente quais ficheiros são preservados durante uma actualização, corra:

dpkg --status package

E veja sob "Conffiles:".

7.6. O que é um script Debian preinst, postinst, prerm, e postrm?

Estes ficheiros são scripts executáveis que são corridos automaticamente antes ou depois de um pacote ser instalado ou removido. Juntamente com um ficheiro chamado control, todos estes ficheiros fazem parte da secção "control" de um ficheiro de arquivo Debian.

Os ficheiros individuais são:

preinst

Este script é executado antes do pacote a que pertence ser desempacotado do seu ficheiro (*.deb) de arquivo Debian. Muitos scripts 'preinst' param serviços para pacotes que estão a ser actualizados até que a sua instalação ou actualização esteja completa (seguindo a execução com sucesso do script 'postinst').

postinst

Este script tipicamente completa qualquer configuração requerida do pacote foo onde foo foi desempacotado do seu ficheiro de arquivo Debian (".deb"). Muitas vezes, os scripts 'postinst' pedem aos utilizadores para inserirem dados, e/ou avisa-los que se aceitaram valores predefinidos devem lembrar-se de voltar atrás e re-configurar o pacote se necessário. Muitos scripts 'postinst' então executam quaisquer comandos necessários para iniciar ou reiniciar um serviço assim que um novo pacote foi instalado ou actualizado.

prerm

Este script tipicamente pára quaisquer daemons que estão associados com um pacote. É executado antes da remoção de ficheiros associados ao pacote.

postrm

Este script tipicamente modifica links ou outros ficheiros associados com foo, e/ou remove ficheiros criados pelo pacote (Veja também Secção 7.8, “O que é um Pacote Virtual?”.)

Actualmente todos estes ficheiros de controle podem ser encontrados no directório /var/lib/dpkg/info. Os ficheiros relevantes ao pacote foo começam com o nome "foo" e têm as extensões de ficheiro de "preinst", "postinst", etc., como apropriado. O ficheiro foo.list nesse directório lista todos os ficheiros que foram instalados com o pacote foo. (Note que esta localização destes ficheiros é interna do dpkg; você não deve confiar nela.)

7.7. O que é um pacote Essential, Required, Important, Standard, Optional, ou Extra?

A cada pacote Debian é atribuída uma priority pelos responsáveis da distribuição, como uma ajuda ao sistema de gestão de pacotes. Estas prioridades são:

  • Required: pacotes que são necessários para o funcionamento correcto do sistema.

    Isto inclui todas as ferramentas que são necessárias para reparar defeitos do sistema. Você não deve remover estes pacotes ou o seu sistema pode tornar-se totalmente avariado e pode provavelmente nem ser possível usar o dpkg para repor as coisas. Sistemas com apenas os pacotes Required são provavelmente inúteis, mas têm funcionalidades suficientes para permitir ao administrador de sistema arrancar e instalar mais software.

  • Important pacotes que devem ser encontrados em qualquer sistema tipo Unix.

    Estarão aqui outros pacotes sem os quais o sistema não funcionará bem ou não será utilizável. Isto NÃO inclui Emacs ou X ou TeX ou qualquer outra grande aplicação. Estes pacotes apenas constituem a infraestrutura nua.

  • Standard pacotes que são standard em qualquer sistema Linux, incluindo um sistema de modo-de-caracteres relativamente pequeno mas não muito limitado. Estão incluídas ferramentas para ser capaz de enviar um e-mail (com o mutt) e descarregar ficheiros de servidores de arquivo.

    Isto é o que será instalado por predefinição se os utilizadores não selecionarem mais nada. Não inclui muitas grandes aplicações, mas inclui o interpretador de Python e algum software de servidor como OpenSSH (para administração remota) e o Exim (para entrega de mail, apesar de poder ser configurado apenas para entrega local). Também inclui alguma documentação comum genérica que a maioria dos utilizadores irá achar uma ajuda.

  • Optional pacotes que incluem todos aqueles que você pode ter razões para querer instalar se você souber o que eles são, ou que não têm requerimentos especializados.

    Isto inclui o X, uma distribuição TeX completa, e muitas outras aplicações.

  • Extra: pacotes que ou fazem conflito com outros com prioridades maiores, e geralmente são apenas úteis se você já souber o que eles são, ou têm requerimentos especializados que os tornam não apropriados para "Optional".

Se você fizer uma instalação Debian predefinida, todos os pacotes de prioridade Standard ou superior serão instalados no sue sistema. Se você selecionar tarefas pré-definidas irá também obter pacotes de prioridade mais baixa.

Adicionalmente, alguns pacotes são marcados como Essential pois são absolutamente necessários para o funcionamento apropriado do sistema. As ferramentas de gestão de pacotes irão recusar remover estes.

7.8. O que é um Pacote Virtual?

Um pacote virtual é um nome genérico que se aplica a qualquer um de um grupo de pacotes, onde todos os quais fornecem uma funcionalidade básica semelhante. Por exemplo, ambos programas konqueror e firefox-esr são navegadores de web, e devem por isso satisfazer qualquer dependência de um programa que requeira um navegador web no sistema, de modo a funcionar ou a ser útil. São assim ambos ditos de providenciar o "pacote virtual" chamado www-browser.

De modo semelhante, exim4 e sendmail ambos fornecem a funcionalidade de agente de transporte de mail. Assim é dito que ambos fornecem o pacote virtual "mail-transport-agent". Se um deles for instalado, então qualquer programa que dependa da instalação de um mail-transport-agent irá ficar satisfeito com a presença deste pacote virtual.

Debian fornece um mecanismo para que, se mais do que um pacote que forneça o mesmo pacote virtual esteja instalado num sistema, então os administradores de sistema podem definir um como o pacote preferido. O comando relevante é update-alternatives, e está melhor descrito em Secção 11.11, “Alguns utilizadores gostam de mawk, outros gostam de gawk; alguns gostam de vim, outros gostam de elvis; alguns gostam de trn, outros de tin; como é que Debian suporta diversidade?”.

7.9. O que significa dizer que um pacote Depends, Recommends, Suggests, Conflicts, Replaces, Breaks ou Provides outro pacote?

O sistema de pacotes de Debian tem uma gama de "dependências" de pacotes que são desenhadas para indicar (numa única bandeira) o nível que cada programa A pode operar independentemente da existência de programa B num dado sistema:

  • Pacote A depends (depende) de Pacote B se B tiver absolutamente de ser instalado de modo a A correr. Em alguns casos, A não depende apenas de B, mas duma versão de B. Neste caso, a dependência de versão é geralmente um limite inferior, no sentido que A depende de qualquer versão de B mais recente que alguma versão especificada.

  • Pacote A recommends (recomenda) Pacote B, se o responsável do pacote achar que a maioria dos utilizadores não vão querer A sem terem a funcionalidade fornecida por B.

  • Pacote A suggests (sugere) Pacote B Se B conter ficheiros que estão relacionados com (e geralmente melhoram) as funcionalidades de A.

  • Pacote A conflicts (faz conflito) com Pacote B quando A não irá operar se B estiver instalado no sistema. Mais comum, conflitos são casos onde A contém ficheiros que são uma melhoria sobre aqueles em B. "Conflicts" são muitas vezes combinados com "replaces".

  • Pacote A replaces (substitui) Pacote B quando ficheiros instalados por B são removidos e (em alguns casos) sobrepostos por ficheiros em A.

  • Pacote A breaks (quebra) Pacote B quando ambos pacotes não podem ser configurados em simultâneo num sistema. O sistema de gestão de pacotes irá recusar instalar um se o outro já estiver instalado e configurado no sistema.

  • Pacote A provides (fornece) Pacote B quando todos os ficheiros e funcionalidades de B estão incorporados em A. Este mecanismo fornece uma maneira dos utilizadores que têm espaço de disco constrangido obterem aquela parte do pacote A que realmente precisam.

Mais informação detalhada sobre o uso de cada um destes termos pode ser encontrada no manual Debian Policy, secção 7.2, "Binary Dependencies", veja Secção 12.1, “Que outra documentação existe para o sistema Debian?”.

7.10. O que significa Pre-Depends?

"Pre-Depends" é uma dependência especial. No caso da maioria dos pacotes, o dpkg irá desempacotar o ficheiro de arquivo de um pacote (isto é, o seu ficheiro .deb) independentemente em se sim ou não os ficheiros de que depende existem no sistema. De forma simplista, desempacotar significa que o dpkg irá extrair os ficheiros do ficheiro de arquivo que é suposto ser instalado no seu sistema de ficheiros, e coloca-los nos seus lugares. Se esses pacotes dependerem na existência de outros pacotes pacotes no seu sistema, o dpkg irá recusar completar a instalação (ao executar a sua acção "configure") até que os outros pacotes estejam instalados.

No entanto, para alguns pacotes, o dpkg irá recusar até desempacota-los até que certas dependências estejam resolvidas. Tais pacotes diz-se que "Pré-dependem" da presença de alguns outros pacotes. O projeto Debian forneceu este mecanismo para suportar a actualização segura de sistemas do formato a.out para formato ELF, onde a ordem na qual os pacotes são desempacotados é crítica. Existem outras situações de grandes actualizações onde este método é útil, por exemplo, os pacotes com prioridade requerida e a sua dependência na LibC.

Como antes, mais informação detalhada sobre isto pode ser encontrada no manual de Política.

7.11. O que significa unknown, install, remove, purge e hold no status do pacote?

Estas bandeiras "quero" dizem o que o utilizador quer fazer com um pacote (como indicado por invocações directas do utilizador do dpkg/apt/ aptitude).

Os seus significados são:

  • unknown - o utilizador nunca indicou se o pacote é desejado.

  • install - o utilizador quer o pacote instalado ou actualizado.

  • remove - o utilizador quer o pacote removido, mas não quer remover qualquer ficheiro de configuração existente.

  • purge - o utilizador quer o pacote removido completamente, incluindo os seus ficheiros de configuração.

  • hold - o utilizador não quer que este pacote seja processado, isto é, quer manter a versão actual com o estado actual seja ele qual for.

7.12. Como pôr um pacote em hold?

Existem três modos de manter pacotes em versões anteriores, com dpkg, apt ou aptitude.

Com o dpkg você tem de exportar a lista de selecção de pacotes, com:

dpkg --get-selections \* > selections.txt

Depois edite o ficheiro resultante selections.txt, altere a linha que contém o pacote que deseja manter a versão, ex. libc6, de isto:

libc6                                           install

para isto:

libc6                                           hold

Grave o ficheiro, e recarregue-o na base de dados do dpkg com:

dpkg --set-selections < selections.txt

Com o apt, você pode seleccionar um pacote para manter versão usando

apt-mark hold nome_do_pacote

e remover o hold com

apt-mark unhold nome_do_pacote

Com o aptitude, você pode manter a versão dum pacote usando

aptitude hold nome_do_pacote

e remover o hold com

aptitude unhold nome_do_pacote

7.13. Como é que Eu instalo um pacote fonte?

Os pacotes fonte Debian não podem ser verdadeiramente "instalados", são apenas desempacotados em qualquer directório que deseje para compilar os pacotes binários que produzem.

Pacotes fonte são distribuídos na maioria nos mesmos espelhos onde você pode obter os pacotes binários. Se você configurar o seu sources.list(5) do APT para incluir as linhas "deb-src" apropriadas, você irá ser capaz de facilmente descarregar qualquer pacote fonte ao correr

apt-get source foo

Para o ajudar a realmente compilar o pacote fonte, os pacotes fonte de Debian fornecem o chamado mecanismo de dependências de compilação. Isto significa que o responsável pelo pacote fonte mantém uma lista dos outros pacotes que são requeridos para compilar o seu pacote. Para ver como isto é útil, corra

apt-get build-dep foo

antes de compilar a fonte.

7.14. Com é que Eu compilo pacotes binários a partir de um pacote fonte?

O modo preferido de fazer isto é usando várias ferramentas invólucro. Vamos mostrar como isto é feito usando as ferramentas devscripts. Instale este pacote se ainda não o fez.

Agora, primeiro obtenha o pacote fonte:

apt-get source foo

e mude para a árvore fonte:

cd foo-*

Depois instale as dependências de compilação necessárias (se existirem):

sudo apt-get build-dep foo

Depois crie uma versão dedicada da sua própria compilação (para que não fique confuso mais tarde quando a própria Debian lançar uma nova versão):

dch -l local 'Bla bla bla'

E finalmente compile o seu pacote:

debuild -us -uc

Se tudo funcionou bem, você deve agora ser capaz de instalar o seu pacote ao correr

sudo dpkg -i ../*.deb

Se preferir fazer as coisas manualmente, e não desejar usar devscripts, siga este procedimento:

Se você precisar de todos os foo_*.dsc, foo_*.tar.gz e foo_*.diff.gz para compilar a fonte (nota: não existe .diff.gz para alguns pacotes que são nativos a Debian).

Assim que os tiver ( xref linkend="sourcepkgs"/>) e se tiver o pacote dpkg-dev instalado, o seguinte comando:

dpkg-source -x foo_versão-revisão.dsc

irá extrair o pacote para um directório chamado foo-versão.

Se você apenas deseja compilar o pacote, pode fazer cd para o directório foo-versão e chamar o comando

dpkg-buildpackage -rfakeroot -b

para compilar o pacote (note que isto requer também o pacote fakeroot), e depois

dpkg -i ../foo_versão-revisão_arquitectura.deb

para instalar os pacote(s) acabados de compilar.

7.15. Como é que Eu crio eu próprio pacotes Debian?

Para uma descrição mais detalhada disto, leia New Maintainers' Guide, disponível no pacote maint-guide ou em https://www.debian.org/doc/devel-manuals#maint-guide, ou o Guia para Debian Maintainers, disponível no pacote debmake-doc ou em https://www.debian.org/doc/devel-manuals#debmake-doc.