Crie Seu Próprio Gerenciador de Pacotes do Zero - Parte 1

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.

[ Hits: 10.968 ]

Por: Slackjeff em 19/02/2020 | Blog: https://slackjeff.com.br


Iniciando



Abordagem Fakeroot

O primeiro passo é você entender como funciona um software compilado da fonte.

Vamos utilizar o método Fakeroot, que significa Raiz Falsa. Para entendermos o conceito, precisamos saber como é instalado um programa por de trás dos panos.

Para esta abordagem, vamos usar um software criado com autotools, que possui ferramentas como "./configure", "makefile", etc.

A grosso modo, ao instalar um programa, ele possui toda a estrutura dos diretórios, como usr/{bin,share,man,doc}, etc/, /lib64, /lib ... Esta estrutura, se instalado com "make install", é solta diretamente na raiz (/) do sistema, logo podemos saber que a instalação será feita e você já pode executar o seu software.

Isso, se tratando de softwares convencionais, os opcionais como Firefox, Telegram... etc, normalmente ficam em um diretório a parte em opt/ e normalmente já são pré-compilados.

Quando compilamos e fizemos um "make install", é feito o passo que falamos acima, é solto basicamente toda a estrutura do programa pré compilado na raiz (/). Este processo é válido e se o desenvolvedor ter boa vontade, ele pode ter inserido a opção de desinstalação do software "make desinstall".

Caso não houve boa vontade, você terá que remover toda hierarquia instalado pelo software manualmente! Isto te dá um controle, é claro, mas o tempo que você perde... Hmm, é complicado.

É ai que entra o Fakeroot, vamos enganar o sistema dizendo que um diretório especifico, ao invés de instalar na raiz (/). Este diretório falso é essencial, pois podemos manipular todo o programa pre-compilado antes da instalação. Isto,se tratando de software compilados, se forem scripts, podemos usar a mesma abordagem do Fakeroot. :)

Assim, fizemos os nossos enfeites que vamos abordar mais adiante.

Para um exemplo, supondo que rodei toda a base "./configure && make" e ao invés de por "make install", somente botaria em "make install DESTDIR=/Um/Diretorio".

Vamos usar um software como base para compilar da fonte. Assim você terá mais visão do que abordamos acima. Vamos utilizar o editor de texto nano para iniciar a brincadeira.

Primeiramente, crie um diretório em /tmp/ chamado "source" e dentro deste diretório, aonde vamos armazenar o código fonte do nano. Dentro de /tmp/source crie o diretório "nano".

mkdir -vp /tmp/source/nano

E adquira o fonte do editor nano e baixe com "wget" em "/tmp/source/nano/". Após feito o download, descompacte o mesmo:

cd /tmp/source/nano
wget https://www.nano-editor.org/dist/v4/nano-4.7.tar.xz
tar xvf nano-4.7.tar.xz

Após feito este processo, vamos entrar dentro do diretório que foi criado. É lá que está todo o fonte do editor nano:

ls
nano-4.7  nano-4.7.tar.xz

cd nano-4-7

Como dito, este artigo está trabalhando com abordagem do autotools. Execute agora o script "configure", com ele podemos fazer pré-configurações como: a raiz aonde será solto o software, desabilitar/habilitar funcionalidades em geral do software etc, etc...

NOTA: você pode usar o "./configure --help" para saber todas opções disponíveis que você pode habilitar/desabilitar.

Como o objetivo deste artigo não é "como compilar um software" e sim "Como escrever o seu gerenciador de pacotes", vamos usar configurações genéricas neste para não ter excesso de informações para você neste momento. Saiba que se você não sabe como funciona a compilação de programas, provavelmente você não está apto a criar o seu gerenciador ainda.

./configure \
--prefix=/usr        \
--sysconfdir=/etc    \
--mandir=/usr/man    \
--libdir=/usr/lib64  \
--enable-utf8


Entendendo as configurações usadas no "configure":
  • --prefix :: A hierarquia de "usr" deve ficar em /usr, e não em /usr/local. Normalmente esta hierarquia é em /usr/local/, o que pode ter muitos conflitos com o sistema, então pedimos para ser apenas /usr.
  • --sysconfdir :: Toda arquivos de configuração do software devem ficar em /etc.
  • --mandir :: Aonde será instalado o manual do software /usr/man.
  • --libdir :: Bibliotecas devem ficar em /usr/lib64.
  • --enable-utf8 :: Ativa suporte UTF-8.

Lembre-se, isto não é uma receita de bolo, cada programa tem suas próprias configurações! O básico e pontapé inicial que você pode utilizar seria: (--prefix, --sysconfdir, --mandir, --libdir).

Feita isto, vamos compilar o software em si! Para isto, utilizamos o "make". Se o seu processador tem vários núcleos, você pode especificar com "-j Número_de_Núcleos", assim a compilação será mais rápida.

Exemplo aqui, possuo 6 núcleos:

make -j 6

Tudo certo até aqui? Não houve erros? Então vamos fazer a instalação na raiz falsa! A abordagem do Fakeroot inicia aqui, para isto, vamos precisar criar agora um diretório em "/tmp" chamado "build/nome-do-programa.versão". É lá que será a "raiz" falsa do editor nano.

Crie o diretório em /tmp/build/nano-versao:

mkdir -vp /tmp/build/nano-4.7
mkdir: created directory '/tmp/build'
mkdir: created directory '/tmp/build/nano-4.7'


Feito isto, vamos realizar a instalação com "make install", passando a variável DESTDIR. Assim enganamos o sistema dizendo que a raiz é em /tmp/build/nano-versao:

make install DESTDIR='/tmp/build/nano-4.7/'

Vamos agora entrar no diretório /tmp/build/nano-versao e ver que toda estrutura de diretórios estão lá!

cd /tmp/build/nano-4.7
ls
usr

tree --filelimit 10
.
└── usr
    ├── bin
    │   ├── nano
    │   └── rnano -> nano
    ├── man
    │   ├── man1
    │   │   ├── nano.1
    │   │   └── rnano.1
    │   └── man5
    │       └── nanorc.5
    └── share
        ├── doc
        │   └── nano
        │       ├── faq.html
        │       ├── nano.1.html
        │       ├── nano.html
        │       ├── nanorc.5.html
        │       └── rnano.1.html
        ├── info
        │   ├── dir
        │   └── nano.info
        ├── locale [35 entries exceeds filelimit, not opening dir]
        └── nano [44 entries exceeds filelimit, not opening dir]


Perceba que toda hierarquia que seria solta na raiz do sistema, agora está aqui neste diretório!

Com isto, podemos fazer o que quiser com o software, usar um compressor, por exemplo como gzip, e passar para um amigo o software compilado. O seu amigo poderia extrair o software na raiz do sistema e teria o software pronto! Você poderia também, a partir daqui, copiar todo a estrutura para a raiz do sistema.

Mas isto seria um problema, pois como dito no inicio, teríamos que rastrear toda a estrutura que foi solta na raiz do sistema e excluir uma por uma, arquivo por arquivo, diretório por diretório, link simbólico por link simbólico.

A grosso modo, é isso que os gerenciadores de baixo nível fazem! Eles fazem o rastreamento do software, gerando um pacote agrupando tudo em um "arquivo", assim facilitando para usuário de ter que fazer tudo isso manual.

Entendeu a mágica do Fakeroot/raiz falsa. Então, a partir daqui, vamos começar a criar nosso gerenciador de pacotes.

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Iniciando
   3. createpkg - Criando um pacote
   4. pkginstall - Instalando um pacote
   5. pkgremove - Removendo um pacote
Outros artigos deste autor

Software Manivela VS Software Modinha

Descartando Séries no Slackware não tão Necessárias

Compilação do Kernel Linux para máquinas locais Debian

Programas em Modo Texto (on Shell)

Boot Seguro LILO

Leitura recomendada

Instalando o Kurumin 7 e outros em um pendrive

Dúvidas sobre a primeira instalação

Linux: kernel e distribuições

Utilizando o apt para gerenciamento de pacotes

Slackware 13.37 - Compreendendo o processo de inicialização

  
Comentários
[1] Comentário enviado por Tio_do_Toldo em 23/02/2020 - 11:06h

Legal.

[2] Comentário enviado por cizordj em 29/02/2020 - 15:23h

Caramba hein, que massa! Nunca entendi como o dpkg do Debian removia os pacotes do sistema e vendo agora o seu shell script dá para entender a lógica disso. E é uma coisa perigosa, o comando rm se for passado o argumento errado já era.

Outra coisa que aprendi também é que #!/bin/sh também interpreta funções.
________________________________________________
O programador tem a mania de achar que tudo é objeto


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts