Índice
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.
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 apt); 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 .debian.tar.xz
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.
A Debian "package", or a Debian archive file, contains the executable files,
libraries, and documentation associated with a particular program or set of
related programs. Normally, a Debian archive file has a filename that ends
in .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
.
The Debian binary package file names conform to the following convention: <DebianPackageName>_<VersionNumber>-<DebianRevisionNumber>_<DebianArchitecture>.deb
Checking the package name associated with a particular Debian archive file (.deb file) can be done in one of these ways:
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.
use the command dpkg --info PPP_VVV-RRR_AAA.deb
(where
PPP, VVV, RRR and AAA are the package name, version, revision and
architecture of the package in question, respectively). This displays,
among other things, the package name corresponding to the archive file being
unpacked.
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).
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?”.
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:".
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:
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').
This script typically completes any required configuration of the package
foo
once foo
has been unpacked from
its Debian archive (".deb") file. Many 'postinst' scripts execute any
commands necessary to start or restart a service once a new package has been
installed or upgraded.
Este script tipicamente pára quaisquer daemons que estão associados com um pacote. É executado antes da remoção de ficheiros associados ao pacote.
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.)
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.
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?”.
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?”.
"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.
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.
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
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.
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_*.debian.tar.xz para compilar a fonte (nota: não existe .debian.tar.xz 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.
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.