Eu sempre fui curioso em relação às coisas que me interessam, quando iniciei no mundo do
GNU/Linux, eu fiquei admirado com a facilidade de instalar programas. No início, rodando entre as distribuições Linux, eu acabei conhecendo vários tipos de gerenciadores de pacotes e cada um com sua peculiaridade. Foi aí que me interessei em ler o código fonte de diversos gerenciadores e criar o meu próprio.
No início foi um pouco penoso, quebrei o meu sistema operacional várias vezes por erros bobos. Mas com o tempo, depois de criar pelo menos 4 gerenciadores de pacotes, resolvi passar adiante o meu conhecimento para quem deseja criar o seu próprio. Temos vários DIY e HOWTOS de como criar distribuições
Linux, mas é incrível que não temos absolutamente nenhum tutorial de como criar um gerenciador. Temos muitos bons hackers espalhados pelo mundo, mas parece que nenhum quer mostrar o seu conhecimento.
Isso é triste, pois o que diferencia um distribuição da outra, além dos softwares instalados e filosofia, é o gerenciador de pacotes.
O que você precisa
Apesar deste artigo abordar todo passo a passo de como construir seu próprio
gerenciador de pacotes, você precisa ter uma noção de programação na linguagem Shell Script. Não existe melhor linguagem que não a do próprio UNIX*, não é? Todas ferramentas normalmente já disponíveis no próprio S.O. Utilizaremos o
sh, normalmente nas distribuições GNU/Linux é um link simbólico para o Shell Bash.
No entanto, você pode usar este livro para fazer em outra linguagem de programação, bastando apenas seguir a lógica utilizada.
Uma nota importante, é que criaremos um gerenciador de baixo nível! Ou seja, que não resolva dependências, já que este processo fica a cargo de um gerenciador de alto nível. Por enquanto, não vamos abordar como se cria um gerenciador de alto nível ao estilo
apt,
yum/dnf e sim, algo simples e parecido com
pkgtools,
dpkg e
rpm.
Futuramente, talvez abordemos sobre o assunto em novos níveis? Vamos ver, boa diversão!
N-a1
Este nível a1 visa abordar a parte estrutural de um gerenciador de pacotes de baixo nível, seguindo a filosofia do UNIX, vamos criar a primeira versão bem simplória de três programas: criar, instalar e remover um pacote.
Não vamos nos preocupar tanto com vaidade e sim como funciona todo o esquema destes três processos. Por isso é de extrema importância você não executar estes programas em seu sistema operacional diário! Você pode executar em uma virtual box, ou até mesmo criar um ambiente enjaulado e entrar com chroot.
Este nível, como dito acima, não chega nem perto de um gerenciador de baixo nível seguro e utilizável em uma distribuição diária. Mas é totalmente funcional e é o ponta pé inicial. Tenha uma boa diversão.
Tipos de gerenciadores de pacotes
Normalmente, pensamos que gerenciadores de pacotes são todos a mesma coisa, quando normalmente não são! Existem dois tipos de gerenciadores, os de baixo nível e os de alto nível. Cada um realiza um tipo de função, como por exemplo, o
dpkg do Debian faz a parte estrutural de um pacote e o
apt/apt-get faz a parte inteligente, como resolver dependências.
Gerenciador de Baixo Nível
O gerenciador de baixo nível é o coração do gerenciador. É ele que cria, instala, remove, atualiza pacotes.
Alguns exemplos de gerenciadores de baixo nível, são:
- dpkg
- bananapkg
- rpm
- pkgtools
Um fato que precisamos saber, é que normalmente gerenciadores de baixo nível não resolvem as dependências dos softwares. Eles normalmente empregam uma técnica em algum arquivo para o próprio empacotador do software adicionar as dependências. E este arquivo é puxado pelo gerenciador de alto nível que se encarrega de listar as dependências e resolver as mesmas.
Então, quando você faz alguma função listada acima, você está utilizando o gerenciador de baixo nível.
Gerenciador de Alto Nível
O gerenciador de alto nível realiza a parte mais inteligente do gerenciamento, é ele que se encarrega de baixar pacotes disponíveis em um determinado espelho, resolve dependências, se assim permitir, e faz todo este processo mais burocrático.
Gerenciadores de alto nível:
- apt
- slackpkg (não resolve dependências)
- dnf/yum
Devo salientar que, normalmente, os gerenciadores de alto nível são propensos a milhares de erros! Fazer algo inteligente é complicado. Você pede para remover o D, por exemplo, se o A, B e C depender do D e o Y depender do A e for removido jundo com o D, acaba quebrando tudo. Você acaba ficando sem os softwares ditos acimas. :)
O bom de se trabalhar com gerenciadores de alto nível é mais pela praticidade, mas precisa ser programado com muito cuidado.