Sistema de pacotes do Debian

Cada programa é criado escrevendo o código fonte (um arquivo texto composto de instruções em uma dada linguagem de programação), que é necessário ser compilado para sua utilização, ou seja, transformar o código em um binário (uma série de instruções de máquina executável pelo processador). Cada linguagem de programação tem um compilador específico para executar essa operação – veja mais no post sobre algoritmos e linguagens de programação. Um processo é a representação em memória de um programa em execução. Um único programa pode ser instanciado em muitos processos, não necessariamente rodando sob diferentes IDs de usuários.

As diferenças de hardware das arquiteturas envolvem diferentes meios de funcionamento, exigindo assim que o software seja compilado especificamente para cada arquitetura. O termo “arquitetura” indica um tipo de computador, diferenciada principalmente pelo seu processador. O suporte multi-arquitetura do dpkg (programa que manipula arquivos de instalação do Debian) permite aos usuários definir arquiteturas “estrangeiras” que podem ser instaladas no sistema atual, feito com o comando “dpkg –add-architecture NOME”. Veja mais sobre a distribuição Debian clicando no link.

Um pacote fonte é normalmente composto de três arquivos, um .dsc (Debian Source Control, o arquivo de informações e dependências), um .orig.tar.gz (contém o código fonte como fornecido pelo desenvolvedor oficial) e um .debian.tar.gz ou .diff.gz (contém todas as modificações feitas pelo mantenedor Debian). Eles permitem a criação de pacotes binários (arquivos .deb descritos acima) dos arquivos de código fonte do programa, que são escritos em uma linguagem de programação.

O dpkg é um programa que manipula arquivos .deb, enquanto que o APT é um conjunto de programas que permite a execução alto nível de modificações no sistema: instalando ou removendo pacotes (enquanto satisfaz dependências), atualizando o sistema, listando pacotes disponíveis, etc. Muitas vezes, um pacote depende de outros para ser utilizado, sendo que essas dependências são informadas na hora da instalação e instaladas em conjunto. Também pode acontecer de um pacote executar instruções que entrem em conflito com as de outro pacote, devendo um deles ser instalado para o melhor funcionamento do outro. Pacotes podem ser eventualmente removido quando versões antigas do programa principal forem removidas e ele não ter mais utilidade.

targz_linux

O pacote Debian fornece scripts de configuração, que habilitam a execução de comandos em diferentes estágios do ciclo de vida do pacote (instalação, remoção, atualizações), e também descreve sua relação com outros pacotes Debian (dependências, conflitos, sugestões), descrição essa chamada de “meta-informação” (com estrutura definida pela padronização RFC 2822) ou arquivo “control”. Os scripts de configuração para pacotes instalados são armazenados no diretório /var/lib/dpkg/info/, que também inclui um arquivo com a extensão .list para cada pacote, contendo a lista de arquivos que pertencem a este pacote. O arquivo /var/lib/dpkg/status contém uma série de blocos de dados descrevendo o status de cada pacote, sendo duplicada aqui a informação do arquivo control dos pacotes instalados.

A ferramenta debconf pede que o desenvolvedor especifique a interação com o usuário. Desse modo, a presença do usuário junto ao computador para responder a várias perguntas que apareceriam a qualquer momento durante a instalação é praticamente dispensada. A opção -y (ou –assume-yes) diz ao APT para considerar a resposta a todas as perguntas como sendo “sim”.

Dentre outros arquivos interessantes que o pacote Debian pode ter estão o md5sums, que contém as somas de verificação (checksums) de todos os arquivos do pacote, e conffiles, que lista arquivos do pacote que devem ser manipulados como arquivos de configuração, ambos úteis para verificar modificações dos arquivos.

Algumas vezes, o dpkg vai falhar ao instalar um pacote e retornar um erro. É por esta razão que existem diferentes opções –force-*. Muito frequentemente, uma solução mais adequada é recompilar o pacote que está causando o problema (veja item mais abaixo) ou use uma versão nova (provavelmente corrigida) de um repositório como o stable-backports. Como a versão stable não recebe novos pacotes nem novas versões dos pacotes antigos, a não ser para correção de bugs, esse repositório paralelo reúne novas versões e novos programas compilados sobre o stable.

O programa rpm, que manipula pacotes RPM do Red Hat e derivados, está disponível como um pacote Debian, portanto é possível usar este formato de pacote no Debian. O utilitário alien pode converter pacotes RPM em pacotes Debian, e vice-versa. Veja mais sobre RPM e YUM clicando no link.

Ferramenta de Pacotes Avançada

APT é a sigla de Advanced Package Tool, que faz o Debian tão popular entre os administradores pela facilidade para instalar um programa e atualizar o sistema inteiro. Ele utiliza uma lista de repositórios (ou “fontes”) de pacotes no arquivo /etc/apt/sources.list que são importados pelo APT. Cada linha ativa desse arquivo contém a descrição da origem, feita de 3 partes separadas por espaços:

  1. Tipo da origem: “deb” para pacotes binários e “deb-src” para pacotes de código fonte
  2. URL base da origem: mirror Debian ou em qualquer outro archive de pacote configurado por terceiros
  3. Depende da estrutura do repositório: subdiretório, nome da distribuição escolhida ou pelos “suítes” correspondentes (stable, testing, unstable) seguido dos componentes (ou seções) para ativar (escolhidos entre main, non-free, que contém programas os quais não estão completamente de acordo com os princípios do Debian Free Software Guidelines, e contrib, programas de código aberto que não podem funcionar sem um elemento não livre).

O APT usará esses arquivos para atualizar seu banco de dados de pacotes disponíveis (esta operação é geralmente feita pelo comando “apt-get update”). Opta-se por usar o nome da versão explicitamente em vez de utilizar os correspondentes pseudônimo “stable” (stable, stable-updates, stable-backports, oldstable) para não ter a distribuição básica alterada quando a próxima versão estável sair. As atualizações de segurança não são hospedadas na rede habitual de espelhos do Debian, mas em security.debian.org. Depois de publicada, a distribuição Stable é atualizada em aproximadamente de dois em dois meses, estando as atualizações esperadas no repositório proposed-updates.

Os pacotes podem ser adicionados ou removidos do sistema, respectivamente com “apt-get install pacote” e “apt-get remove pacote”. Também é possível realizar as duas ações no mesmo comando: com um comando apt-get install, adicione “-” aos nomes de pacotes que você deseja remover e com um comando apt-get remove, adicione “+” para os nomes dos pacotes que você deseja instalar.

Quando um pacote Debian é removido, os arquivos de configuração são mantidos para facilitar uma possível reinstalação. Para remover todos os dados associados a um pacote, é necessário fazer “purge” no pacote com essa opção no comando. Os gerenciadores de pacotes podem computar uma lista de pacotes automáticos (instalados somente através de dependências) que não são mais necessários. O “apt-get autoremove” apaga esses pacotes, sendo que o aptitude (front-end para o APT) não tem esse comando pois os remove automaticamente assim que são identificados.

O sistema pode, às vezes, ser danificado com a remoção ou modificação de arquivos num pacote. A forma mais fácil de recuperar estes arquivos é reinstalar o pacote afetado. Como o sistema de empacotamento nota que o pacote está instalado e se recusa a reinstalá-lo, use a opção –reinstall do comando apt-get.

Para atualizar, use “apt-get update” e depois “apt-get upgrade” ou “aptitude safe-upgrade” – o apt-get vai se recusar a instalar pacotes que não estavam instalados antes. Este comando busca pacotes instalados que possam ser atualizados sem remover nenhum pacote. Para corrigir o erro “Os pacotes a seguir serão mantidos em suas versões atuais”, use “apt-get dist-upgrade” ou “aptitude full-upgrade” (“atualização de distribuição”).

Se quiser mudar a versão principal do Debian para a seguinte, veja os seguintes passos:

  1. Mudar o arquivo “/etc/apt/sources.list” para obter os pacotes da nova versão ao invés da antiga, alterando o nome da versão
  2. Atualizar o banco de dados de pacotes disponíveis com o comando “apt-get update”
  3. Atualização mínima com “apt-get upgrade”
  4. Atualizar a distribuição com “apt-get dist-upgrade”

Certas configurações podem ser realizadas adicionando diretivas em um arquivo do diretório “/etc/apt/apt.conf.d/”. Cada diretório terminado em “d” representa um arquivo de configuração que é separado em múltiplos arquivos, sendo que os últimos podem alterar um elemento de configuração definido em um dos primeiros arquivos. As prioridades dos pacotes podem ser alteradas adicionando entradas no arquivo “/etc/apt/preferences” com os nomes dos pacotes afetados, sua versão, sua origem e sua nova prioridade. O APT nunca instala uma versão mais antiga de um pacote (ou seja, com número de versão menor que a do pacote atualmente instalado), exceto se a sua prioridade for maior do que 1000.

O cache é um sistema de armazenamento temporário usado para acelerar o acesso frequente de dados quando o método de acesso habitual é caro (em termos de performance). O APT mantém uma cópia de cada arquivo .deb baixado no diretório /var/cache/apt/archives/. Para esvaziar essa pasta, utilize “apt-get clean” para esvaziar completamente o diretório ou “apt-get autoclean” para remover apenas os pacotes que não podem mais ser baixados (por terem sumido dos espelhos Debian). Já o comando apt-cache pode buscar pacotes baseado em palavras-chave com “apt-cache search palavra-chave” ou “axi-cache” (um pouco mais sofisticado).

O Debian fornece um selo de qualidade a prova de interceptações para garantir (no momento da instalação) que um pacote realmente vem de um mantenedor oficial e não foi modificado por um terceiro. O selo funciona como uma cadeia de hashes criptográficos e uma assinatura. As chaves confiáveis são gerenciadas com o comando apt-key (localizadas em “/etc/apt/trusted.gpg”), enquanto que o arquivo assinado é o “Release file”, fornecido pelos espelhos Debian.

Caso sua versão de Debian seja muito antiga, ainda é possível utilizar o APT para baixar ou mesmo atualizar alguns pacotes (caso tenham sido lançadas novas versões nesse sistema). Para isso, o repositório (no arquivo /etc/apt/sources.list), deverá ser alterado para (lembrando de alterar VERSAO para o devido nome):

deb http://archive.debian.org/debian/ VERSAO main non-free contrib
deb-src http://archive.debian.org/debian/ VERSAO main non-free contrib
deb http://archive.debian.org/debian-security/ VERSAO/updates main non-free contrib
deb-src http://archive.debian.org/debian-security/ VERSAO/updates main non-free contrib

Atualização 2023: com o Debian 12, as firmwares “Non-free” foram movidas para seu próprio espaço, devendo ser retirado o componente “non-free” de cada linha e inserindo a seguinte linha: deb https://deb.debian.org/debian VERSAO main non-free-firmware

Depois de salvar o arquivo, dê o comando “apt-get update” para atualizar a base de dados. Talvez seja necessário antes dar o comando “apt-get install debian-archive-keyring” para instalar o sistema de chave pública para os arquivos do repositório (erro “no public key available for the following key IDs…”).

Recompilar um pacote Debian

Reconstruir um pacote binário a partir de seus arquivos fonte pode ser útil para adicionar ou alterar funções específicas do programa ou para fazê-lo funcionar em uma outra versão do Debian. Para reconstruir/recompilar o pacote, primeiro deve-se baixar os arquivos fonte através do comando “apt-get source fonte-package-name”, estando uma linha “deb-src” no arquivo “/etc/apt/sources.list”, ou manualmente a partir de um dos espelho Debian ou do web site. Em seguida, execute o comando dpkg-source-x file.dsc para o fonte ficar em um diretório nomeado após o pacote fonte e sua versão.

Primeiramente, altere a versão (no caso de realmente realizar alterações). Mudança nas opções de construção, se necessárias, precisam ser feitas em debian/rules, enquanto que arquivo “debian/control” contém uma descrição dos pacotes gerados (linhas “Build-Depends”). Alguns programas automaticamente desabilitam algumas de suas funcionalidades quando uma biblioteca necessária não está disponível em tempo de construção.

Depois que todas mudanças necessárias forem aplicadas aos fontes, deve-se gerar o pacote binário (arquivo .deb) através do comando “dpkg-buildpackage”. O debuild executa esse programa e inclui verificações para validar a geração dos pacotes contra a política do Debian, além de limpar o ambiente para que variáveis locais não “poluam” a construção do pacote. Ele faz parte do pacote devscripts, que contém diversos programas que ajudam o trabalho dos desenvolvedores Debian.

Para criar um novo pacote, deve-se criar um diretório com o nome do pacote seguido de traço e sua versão. Execute o comando dh_make (do pacote dh-make) para adicionar os arquivos necessários para o processo de criação do pacote dentro dessa pasta. O tipo de pacotes pode ser binário único (depende da arquitetura), Indep (independe da arquitetura), binário múltiplo, biblioteca, módulo do kernel ou cdbs. Dentre os arquivos criados, estão rules, control, changelog e copyright. O dh-make faz parte do Debhelper, um conjunto de scripts que facilitam a criação de pacotes de políticas compatíveis.

O arquivo “rules” contém um conjunto de regras usado para configurar, construir e instalar o software em um subdiretório específico, nomeado após a geração do pacote binário. É utilizado como um arquivo Makefile, um roteiro usado pelo programa make que descreve regras para a construção de um conjunto de arquivos a partir de uma árvore de dependências entre si – veja mais no post sobre linguagem C e makefile. Para instalar os arquivos, configure o comportamento do comando dh_install criando o seguinte arquivo debian/nome_do_pacote-data.install. Para criar o pacote, execute o comando “dpkg-buildpackage -us -uc” dentro do diretório.

Compilando o kernel

Os núcleos fornecidos pelo Debian incluem o maior número de recursos possível, assim como o máximo de drivers, para cobrir o mais amplo espectro de configurações de hardware. Assim, pode-se recompilar o kernel incluindo apenas o que é necessário, visando otimizar o consumo de memória e limitar o risco com problemas de segurança, já que apenas uma fração do código do kernel é compilado e rodado.

Para construção de um pacote Debian, é necessário instalar o build-essential, assim como o pacote libncurses5-dev, para configuração do núcleo, e o pacote fakeroot, que permite a criação de um pacote sem usar os direitos de administrador. Os fontes do kernel Linux estão disponíveis ao instalar o pacote “linux-source-versão” (a versão é a desejada, visualize o disponível através do comando “apt-cache search ^linux-source”). Os arquivos compactados dos fontes do kernel localizam-se em “/usr/src/”, devendo o arquivo com a versão escolhida ser descompactado em um outro diretório (“~/kernel”, por exemplo).

Quanto à reconfiguração, ao invés de fazer tudo a partir do zero, pode-se copiar o arquivo /boot/config-versão (a versão é aquela do núcleo atualmente usado, obtida com o comando uname -r) para o arquivo .config dentro do diretório contendo os fontes do núcleo. Caso precise alterar alguma configuração, esse é o momento. 0 make menuconfig compila e executa uma interface de modo texto, a qual permite a navegação pelas opções disponíveis em uma estrutura hierárquica. Se forem feitas mudanças substanciais na configuração do núcleo, já fez uma compilação no diretório, e precisa reconstruir tudo a partir do zero, execute “make clean” para remover os arquivos compilados e “make distclean” para remover mais arquivos gerados, incluindo o arquivo .config também – tenha certeza de guardar uma cópia dele.

Executando make deb-pkg, serão gerados até 5 pacotes Debian, que contém:

  • linux-image-versão – imagem do núcleo e módulos associados
  • linux-headers-versão – arquivos de cabeçalho necessários para construir módulos externos (fora do núcleo Linux oficial)
  • linux-firmware-image-versão – arquivos de firmware necessários por alguns drivers
  • linux-image-versão-dbg – símbolos de depuração para a imagem do núcleo e seus módulos
  • linux-libc-dev – cabeçalhos relevantes para algumas bibliotecas do espaço do usuário como a glibc GNU

A versão é definida pela concatenação da versão do upstream (definido pelas variáveis VERSION, PATCHLEVEL, SUBLEVEL e EXTRAVERSION no Makefile), do parâmetro de configuração LOCALVERSION, e da variável de ambiente LOCALVERSION. Existem também os patches: recursos não incluídos no kernel padrão devido a falta de maturidade ou algum desentendimento entre os mantenedores do kernel. Os pacotes linux-patch-* ou kernel-patch-* instalam arquivos no diretório /usr/src/kernel-patches/, que podem ser descomprimidos e a saída encaminhada para “patch -p1”, então executar “make deb-pkg LOCALVERSION=-nome_pacote”.

Pode-se instalar o núcleo compilado através do comando “dpkg -i linux-image.deb”. Em /boot/, são instaladas uma imagem do núcleo (vmlinuz-versão), sua configuração (config-versão) e sua tabela de símbolos (System.map-versão), que auxilia a entender o significado de uma mensagem de erro do núcleo, e em /lib/modules/versão/ são instalados os módulos. Os módulos do kernel também tem opções que podem ser configuradas colocando alguns arquivos em “/etc/modprobe.d/”, cujas opções são definidas com as diretivas “opções nome_do_módulo nome_da_opção=valor_da_opção”. Estes arquivos de configuração são destinados para o modprobe, o programa que carrega um módulo do kernel com suas dependências fornecido pelo pacote kmod. O comando “lsmod” tem a função de listar todos os módulos que estão ativos no sistema; para ativar, use “modprobe nome_modulo”.

Os scripts de configuração do pacote automaticamente geram uma imagem initrd, a qual é um mini sistema designado a ser carregado na memória (dai o nome, que significa “init ramdisk”) pelo carregador de inicialização, e usado pelo núcleo Linux somente para carregar os módulos necessários para acessar os dispositivos que contém um sistema Debian completo (por exemplo, o driver para discos IDE). Os scripts pós-instalação atualizam as ligações simbólicas /vmlinuz, /vmlinuz.old, /initrd.img e /initrd.img.old para que eles apontem para os dois últimos núcleos instalados, respectivamente, assim como para as imagens initrd correspondentes. A maioria dessas tarefas são delegadas aos scripts hook nos diretórios /etc/kernel/*.d/. Por exemplo, a integração com o grub se apoia em /etc/kernel/postinst.d/zz-update-grub e /etc/kernel/postrm.d/zz-update-grub para chamar update-grub quando os núcleos são instalados ou removidos.

Consulta

Esse post é um estudo baseado em alguns pontos do livro “O Manual do Administrador Debian” – uma documentação livre, que pode ser distribuída e/ou modificada dentro dos termos da Licença Pública Geral GNU, como publicada pela Fundação do Software Livre, na versão 2 da Licença.

2 comments

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.