1 de setembro de 2008

Gerenciamento de Pacotes no Linux


Em 30 de junho de 2008 foi publicado um artigo muito interessante na DistroWatch Weekly sobre gerenciamento de pacotes no Linux. O artigo explica muito bem o que são pacotes, a diferença entre os principais formatos existentes e softwares para gerenciamento dos mesmos, abordando várias distribuições. Desta forma, achei interessante fazer uma tradução comentada do mesmo, adicionando algumas considerações minhas e alterando pontos em que discordo do mesmo. Minha intenção não era de fazer uma tradução ao pé da letra, mas sim, a minha versão própria do artigo que segue.

O que é um pacote?
Há duas maneiras de se instalar um software no Linux. A primeira é a partir do código fonte, quando uma sequência de três comandos costuma se repetir sempre:

$ ./configure
$ make
$ sudo make install

Esta alternativa é complicada, pois o usuário tem que simular o sistema que o desenvolvedor possuía na sua máquina quando criou o programa, o que inclui compiladores, bibliotecas e, claro, outros softwares do qual o novo depende.

A segunda forma consiste em baixar e instalar um pacote, que nada mais é que um arquivo que contém, entre outras coisas:
  • o código fonte pré compilado (binário)
  • ícones
  • bibliotecas
  • arquivos de configuração
  • páginas de manual
  • arquivos de cabeçalho
  • fontes
  • meta dados (e.g., versão do software, descrição, autor)
  • licença
  • changelogs (lista de mudanças)
  • arquivos de ajuda
Cada pacote possui uma estrutura de arquivos compactada para armazenamento de dados. Quando o mesmo é executado para instalação, ele descompacta esta estrutura no sistema de arquivos do sistema operacional, criando os links, ícones e deixando o software pronto para uso. Alguns pacotes ainda dão a opção para o usuário ajustar certas configurações após a instalação.

Os pacotes são específicos para as distros a que se destinam e a instalação normalmente consiste em abrir o software que gerencia a instalação, procurar pelo programa a ser instalado e executar a instalação. Alguns gerenciadores de pacotes ainda permitem que softwares possam ser instalados clicando-se no instalador do programa (que na verdade executa o gerenciador de pacotes passando os parâmetros para instalar aquele software específico), assim como no Windows.

Há vários formatos de pacotes e os mais usados são .tgz, .deb e .rpm. Outros formatos menos usados incluem .pup, .pisi, .tazpkg e .mo. Códigos fontes são normalmente distribuidos em formato compactado como arquivo .tar.gz ou .tar.bz2.

Gerenciadores de Pacotes
Resumidamente, gerenciadores de pacotes são programas que instalam, removem e atualizam programas, mas os mais modernos têm outras funções agregadas, como:
  • conexão com repositórios locais ou remotos
  • download automático de softwares
  • resolução de dependências
  • listagem de pacotes e dependências
  • organização da lista
  • procura por pacotes
  • gerenciamento dos repositórios (adicionar, alterar e remover repositórios)
  • checagem da integridade do pacote (checksum e assinaturas digitais)
  • permitir atualizações automáticas
  • remoção de dependências não utilizadas
Nem todos os gerenciadores de pacotes têm as funções descritas e outros podem ainda possuir funções extras.
Um fato que o artigo original não cita é a existência de um projeto que visa unificar o ambiente gráfico de gestão de pacotes: o PackageKit, um projeto que, ao meu ver, deve ser adotado por todas as distros, como forma de padronização, o que diminuiria o impacto dos usuários ao migrar de uma distribuição para outra.

Repositórios e Sistemas de Gerenciamento de Pacotes
Repositórios são coleções de pacotes que residem num servidor remoto, mas que podem estar em qualquer mídia, como num CD ou DVD. Uma questão importante a ser destacada é que cada repositório possui uma forma particular de armazenar os dados para o gerenciador de pacotes a que se destina. Assim, um repositório para o gerenciador de pacotes do openSUSE provavelmente não funcionará com o programa similar no Fedora. Juntos, o gerenciador de pacotes, o formato do pacote e o repositório formam o Sistema de Gerenciamento de Pacotes.

A seguir são mostrados alguns dos principais sistemas de gerenciamento de pacotes.

pkgtool
Este é o sistema usado pelo Slackware e seus derivados, que usam arquivos .tar.gz, dada sua extensão: .tgz. Isto significa que o conteúdo do pacote foi concatenado com o programa Tar (Tape Archiver) e então compactado com o GZip (GNU Zip). Assim, este não é um formato de pacotes como os outros. É apenas um formato que permite a algumas ferramentas de linha de comando a manipulação dos mesmos (criação, instalação, remoção, atualização e visualização). O que possibilita isso é a agregação de scripts de instalação ao pacote e esta é uma das únicas diferenças entre um programa distribuído em código fonte e um pacote para o Slackware.

Não há checagem de dependências, conexões automáticas com repositórios, atualização automática do sistema, ou verificação de erros. Assim os pacotes, para serem instalados, precisam ser baixados manualmente em algum repositório, para só então o usuário executar a instalação. Este foi o modelo de gerenciador de pacotes que todas as distros tiveram que melhorar para criar os seus próprios gerenciadores. Segundo o artigo original, o Slackware provê um navegador de pacotes na Internet com feeds RSS, que parecem ser atualizados constantemente.

Como ferramentas (de terceiros) para ajudar a melhorar este tipo de gestão de pacotes, o artigo cita o SWareT, o slapt-get e o pkgsrc do NetBSD. Segundo o autor do artigo, juntos estes programas proveem resolução de dependências e outras funções avançadas para sistemas com este tipo de gerência de pacotes.

Figura 1. Gslapt: um frontend em GTK+ para o slapt-get.

Advanced Packaging Tool (APT)
O APT foi usado, a princípio, na distribuição Debian e suas derivadas e pode ser definido como uma biblioteca de rotinas (libapt) que age como um frontend para o dpkg, que é a base do gerenciamento de pacotes no Debian, responsável por instalar, desinstalar e atualizar pacotes .deb. O APT fornece mais funções para o dpkg, dentre as quais se destaca a resolução de dependências. Apesar do APT ter origens no Debian, ser usado com pacotes .deb e se manter fiel a esta linha ao longo do seu período de existência, ele pode ser usado com outros formatos de pacotes, como o RPM (que será visto a seguir) e até em outros sistemas como OpenSolaris e OS X.

Figura 2. Synaptic: ferramenta para gestão de pacotes (não só para Debian).

RPM Package Manager (RPM)
O RPM se refere tanto para o formato de pacotes quanto para o gerenciador de pacotes e, segundo o artigo original, é tão popular quanto o APT e sua extensão é a .rpm. Diferentemente do dpkg, o RPM possui checagem (não resolução) de pacotes na sua implementação mais básica. Contudo, como o artigo pondera, parece que adicionar novas funcionalidades ao gerenciador de pacotes RPM não é fácil e isto levou à criação de outras ferramentas como YUM, urpmi, YaST, up2date e apt-rpm, que estendem as funções do RPM original. Estes softwares são conhecidos como Gerenciadores de Meta Pacotes, pois eles apenas gerenciam o uso do RPM, que é o gerenciador de fato. O RPM foi portado para a arquitetura AIX da IBM e é o formato padrão da Linux Standard Base (LSB).

urpmi
A única distribuição que utiliza este sistema, cujo formato é o .rpm, é a Mandriva. De acordo com o artigo, o urpmi é um dos primeiros gereciadores de pacotes para RPM e consiste em vários utilitários como urpme (desintala programas), urpmq (procura no banco de dados por um nome de programa), urpmi (instala programas) e por aí vai...

Figura 3. RPMDrake: frontend para urpmi.

Yellow Dog Updater Modified (YUM)
Derivado do Yellow Dog Updater (YUP), o YUM é um gerenciador de pacotes para sistemas Red Hat/Fedora e seus derivados, que usa pacotes .rpm. A "grande jogada" do YUM diz respeito à sua modularidade: plugins podem ser adicionados ao mesmo, aumentando o número de suas funcionalidades, mas críticos dizem que o software não bem integrado ao sistema e sua maturidade e seu desempenho deixam a desejar.

Figura 4. YUMExtender (YUMEx): ferramenta gráfica para gerenciamento de pacotes para distros baseadas no Fedora.

ZYpp
Este é o sistema de gerenciamento de pacotes do SUSE e do openSUSE e usa pacotes .rpm. Este sistema aceita entradas via linha de comando (rug) e um frontend gráfico (zen-updater) para o daemon ZMD (Zenworks Management Daemon). Este, por sua vez, passa os comandos para as auxiliares libzypp ZMD, que se comunicam com o banco de dados de software, analisam metadados de pacotes e finalmente entram em contato com a biblioteca libzypp, que resolve dependências e instala, remove ou atualiza pacotes (usando utilitários RPM). Pode-se usar os utilitários zypper (modo texto) ou YaST (modo gráfico) para interagir com a libzypp.

O artigo ainda cita a camada auxiliar entre os frontends e o gerenciador de pacotes como arquitetura única no gerenciamento de pacotes entre todas as distros. O autor do artigo ainda cita que na versão 10.0 a gerência de pacotes era muito lenta. De fato, a lentidão na gestão de pacotes sempre foi tema nas versões 10.1, 10.2 e 10.3 do openSUSE. Como usuário destas, sempre fui insatisfeito com o desempenho da distro quando precisava gerenciar pacotes. Contudo, há boas notícias com a chegada do openSUSE 11.0. A gerência de pacotes nesta nova versão da distro foi consideravelmente melhorada – leia a postagem openSUSE 11.0: O Camaleão Veloz, para mais detalhes.

Figura 5. YaST2: Utilitário de administração do sistema com gerenciamento de pacotes integrado.

Distribuições Baseadas em Código Fonte e os BSDs
Para estes casos, os repositórios possuem scripts de instalação dos códigos fontes em vez dos binários e a compilação é feita na máquina local. O Portage da distro Gentoo usa scripts chamados ebuilds que contém uma ligação para o código fonte com instruções para compilação e instalação. Este sistema então funciona como um gerenciador de pacotes, com todas as funções de um programa deste tipo, incluindo resolução de dependências. Esta é a forma com que os Ports do BSD funcionam (scripts de instalação em vez de pacotes binários). O bom disso tudo é que scripts de instalação são menores do que pacotes binários, o que reduz o tempo de transferência dos arquivos do servidor para o computador local e o espaço de armazenamento no servidor. Além disso, ao se compilar o código na máquina local pode-se fazer uso de parâmetros de compilação específicos para a máquina onde o código será compilado. A turma do Gentoo e dos BSDs citam mais vantagens, que como indica o autor do artigo original, devem ser pesquisadas junto às comunidades que utilizam estes sistemas.

Figura 6. Gerenciador de pacotes do DesktopBSD: Instala binários e códigos fontes.

Conclusão
O autor conclui o artigo com uma explicação geral sobre o que foi exposto e ponderando sobre a variedade de gerenciadores de pacotes disponíveis atualmente.

Não sei se há um formato melhor que o outro (.tgz x .deb x .rpm), um sistema melhor que outro (pkgtool x APT x RPM x Códigos Fontes) ou mesmo um aplicativo melhor que outro (YaST x SWareT x YUM x Portage). Penso que cada um tem seus pontos fracos e fortes e que um pode aprender com o outro. Também não vejo esta variedade de nomes e tecnologias como algo negativo. Sempre tem alguém inovando em determinado projeto e estas inovações, quando são decididamente boas, são levadas aos outros e quem sai ganhando é o usuário final. Apesar disso, creio que deva haver uma certa padronização entre estes projetos e o PackageKit mostra-se uma excelente iniciativa neste sentido.

Este sempre é um tópico delicado, assim como distribuições. Definitivamente cada usuário defende a sua com unhas e dentes e não deixa que falem mal dela. A diversidade vem trazendo bons frutos para o Linux (ao meu ver), mas é necessário que haja uma certa ordem (leia-se padronização) neste meio. Ninguém quer ter que reaprender a usar o sistema quando simplemente mudar de distribuição. Não vejo o futuro com uma única distribuição ou com um único sistema de gerenciamento de pacotes. O próprio Ubuntu, que é o "Linux da moda", possui vários e vários forks...

O que é certo é que o Linux vem crescendo a passos largos e está cada vez mais fácil aderir a este sistema. A evolução na gerência de pacotes é um grande exemplo disso. Na minha opinião, já deixou pra trás o Windows, é melhor que a do OS X da Apple e tem tudo pra melhorar cada vez mais. O futuro é promissor para o pinguim!



Um comentário: