Criando pacotes DEB no Debian e Ubuntu

Debian/Ubuntu – criando pacotes deb

O Ubuntu é baseado no Debian e por isso ele recebeu por herança o seu gerenciador de pacote, que não é o apt e sim o dpkg. O apt, como ja mencionado em matérias anteriores é responsável por fazer o download baseado em cliente e servidor do seu pacote e armazenar no diretório de cache para então o dpkg instalar todos os pacotes, como no sistema do Debian de acordo com o seu arquivo de controle enviado ao mantenedor. Aqui eu vou te mostrar como gerar um pacote DEB chega a ser mais fácil que compilar um programa.

dpkg, ou Debian package management system é utilizado para instalar e descompactar pacotes deb, que são pacotes pré-compilados para Debian, ou seja, que ja passou pelo processo de copilação e foi criado para o seu sistema operacional, respeitando a integridade de bibliotecas, dependências, sugestões, conflitantes e arquitetura do processador, seja ele all para todas ou específica. Não existem diferenças de criar pacotes para Debian e pacotes para o Ubuntu, o Ubuntu usa o dpkg que é o gerenciador de pacotes do Debian e a grande diferença pode ser nas categorias, nas dependências de alguns pacotes e principalmente no nome do arquivo deb, que pode até ser diferente. http://wiki.debian.org/Teams/Dpkg

Um arquivo pré-compilado para Debian, ou .deb tem o seu nome de arquivo baseado na seguinte informação que deve ser sempre seguinda:

<nome do pacote>_<versão do pacote>-<versão de revisão ou patch level>_<ARQUITETURA>.deb

Vamos entender os processos:

Primeiro é necessário criarmos um diretório que receberá toda a herança de diretórios e arquivos de um pacote deb, que é muito similar ao seu FHS. Lembrando que um pacote deb, segue a estrutura do FHS do sistema, pois ao ser instalado ele vai “mesclar”, cada arquivo para a sua área correta, seja os arquivos de configuração em /etc/, arquivos gerais da instalação em/usr/share, manuais em /usr/share/man, documentações em /usr/share/doc, arquivos executáveis em /usr/bin ou /usr/sbin e suas bibliotecas em /usr/lib.

Vamos utilizar o $HOME do seu usuário para criar os arquivos, então cd ~, para lá e crie o diretório do pacote, com a sujestão do nome do pacote e o principal de controle de pacote com o nome de DEBIAN.

$ mkdir pacote-poder
$ mkdir DEBIAN

Dntro do diretório DEBIAN são encontrados os seguintes arquivos:

– control: Principal para o conteúdo do pacote. Nele consta todas as diretivas de controle do pacote, como nome de pacote, versão, mantenedor do pacote, descrição, dependências e algumas outras informações, é o mais legal de preencher.

– preinst: Este arquivo é um script que é executado antes do arquivo .deb ser descompactado pelo dpkg. Geralmente ele é utilizado para interromper os servicos caso o pacote dependa de atualização de algum serviço e a re-execução do mesmo com a nova versão. CAso não, voce pode impactar a aplicação e fica muito dificil depois de realizar um rollback se isso não for testado na instalação do pacote.

– postinst: Este scrit executa qualquer configuração que for requirida pelo pacote, depois do momento de descompactação do mesmo. Isso é muito importante pois ele apresenta uma interação com quem esta instalando o pacote, e contém informações de configurações e que pode reconfigurar algum pacote existente e o administrador quando estiver criando o pacote deb, pode colocar aqui procedimentos do proprio dpkg-reconfigure, update-alternatives ou qualquer outro meio, até o procedimento de compilação.

– prerm: Este script interrompe daemons relacionados com o pacote, ou executam outros procedimentos que precisam ser realizados antes do pacote ser removido.

– postrm: Este script modifica links, remove diretórios ou arquivos que possuem co-relação com o pacote instalado. muito cuidado com ele para não gerar um problema maior, pois lembre-se, quem instala um pacote é o root ou por janelas de root atraves do sudo.

Como criar o pacote DEB

O arquivo control sendo o mais importante para a construção do pacote, contém todas as diretivas de controle. Para criar um arquivo modelo e que nos servirá de base podemos usar a ferramenta equivs-control. Executar dentro do diretório do pacote que estamos criando.

$ equivs-control control

Ele vai criar o arquivo control que vai apenas servir de modelo e o seu conteúdo será o que temos abaixo. Note que o binário equivs-control é utilizado para criar um padrão baseado nas atualizações finais de informações ao pacote, exigidos pelo mantenedor do Debian e consequentemente do Ubuntu.

### Commented entries have reasonable defaults.
### Uncomment to edit them.
# Source: <source package name; defaults to package name>
Section: misc
Priority: optional
# Homepage: <enter URL here; no default>
Standards-Version: 3.9.2

Package: <package name; defaults to equivs-dummy>
# Version: <enter version here; defaults to 1.0>
# Maintainer: Your Name <yourname@example.com>
# Pre-Depends: <comma-separated list of packages>
# Depends: <comma-separated list of packages>
# Recommends: <comma-separated list of packages>
# Suggests: <comma-separated list of packages>
# Provides: <comma-separated list of packages>
# Replaces: <comma-separated list of packages>
# Architecture: all
# Copyright: <copyright file; defaults to GPL2>
# Changelog: <changelog file; defaults to a generic changelog>
# Readme: <README.Debian file; defaults to a generic one>
# Extra-Files: <comma-separated list of additional files for the doc directory>
# Files: <pair of space-separated paths; First is file to include, second is destination>
# <more pairs, if there’s more than one file to include. Notice the starting space>
Description: <short description; defaults to some wise words>
long description and info
.
second paragraph

A construção do arquivo de controle:

– Package: Aqui voce define o nome do pacote a ser instalado no sistema (OBRIGATÓRIO).

– Version: Aqui voce define a versão do pacote(OBRIGATÓRIO).

– Maintainer: Nome da pessoal responsável pelo pacote, como o email de contato(OBRIGATÓRIO).

– Pre-Depends: Campo destinado aos pacotes que serão necessários ser instalados e configurados antes que o pacote que esta sendo construído seja instalado.

– Depends: Define os pacotes que se fazem necessários a serem instalados primeiros. Na verdade ele é instalado junto, se é que voce entendeu!

– Homepage: Bom, vc entendeu né? mas ignore esse item aqui e coloque o site nas descrições.

– Recommends: Aqui voce informa os pacotes que são usualmente encontrados e relacionados com o nosso pacote. na verdade colocamos aqui uma recomendação da instalação de um pacote junto com o nosso. Ele não será automaticamente instalado e ele dependerá de que o adm re-execute o dpkg novamente. Olha que eu nem falei do apt ainda.

– Suggests: Define os pacotes que estão relacionados com o nosso pacote e são de sugestão da instalação do mantenedor, como algo adicional ou complementar.A sugestão tem que ser algo coerente, imagine instalar o kde-full e a sugestão ser gnome?

– Replaces: Destina aos pacotes que com a instalação do nosso pacote ira substituir. Geralmente é utilizado para a resoluçao de conflitos.

– Architecture: Campo destinado a informar as arquiteturas que são compatíveis com o nosso pacote(OBRIGATÓRIO).

– Copyright: Destinado a informar qual arquivo que contém o arquivo de licença.

– Changelog: Informa o arquivo que contém o log de mudanças do pacote.

– Readme: Informa qual o arquivo que contém a documentação sobre as atualizações deste pacote. Então, informe tudo o que voce atualiza la.

– Description: Informações sobre o pacote, o que ele faz, o que é e tudo o que as pessoas esperam(MAIS DO QUE OBRIGATÓRIO).

-Section: não se preocupe com isso, pois como voce não esta armazenando o pacote como contrib no mantenedor, mesmo sendo um exemplo, ele vai entrar como misc, o que voce pode mitigar a entrar no correto.

-Priority: vamos deixar a padrão como optional.

Vale lembrar que essas informações de pacotes é possível ser visualizadas pelo comando dpkg -s, ou no caso do apt que ja é outra historia, pelo apt-cache show. Inclusive, pegue alguns exemplos la. Depois de entendermos todo o conteúdo do arquivo de controle, então vou colocar apenas um exemplo do meu programa e o meu exemplo do arquivo de controle ficou assim.

Section: misc
Priority: optional
Package: pacote-poder
Version: 0.2
Maintainer: Aprigio Simoes <aprigio@linuxstudent.com.br>
Pre-Depends: libc6
Depends: cmatrix, cmatrix-fonts, sl, bb, figlet
Architecture: all
Description: Este pacote tem por finalidade executar somente besteira no sistema não perca o tempo com isso.

Editando os scripts de execução para instalação de um pacote

Como comentei la em cima, existe alguns scripts que devemos criar e que podemos geralmente utilizar um padrão, para todos eles. Então apenas crie os arquivos dentro do diretório DEBIAN, como fizemos o mesmo procedimento para o arquivo de controle acima, mas lembrando que voce tem total liberdade para preencher o conteúdo destes scripts principalmente com a utilização do famoso dpkg-reconfigure:

Arquivo preinst

#!/bin/bash
echo -e “executando o script\e”

Arquivo prerm

#!/bin/bash
echo -e “executando o script\e”

Arquivo postinst

#!/bin/bash
echo -e “executando o script\e”

Arquivo postrm

#!/bin/bash
echo -e “executando o script\e”

Arquivo do programa que esta no pacote

vamos dar o nome de pacote-poder, para ficar com o mesmo nome do pacote, mantendo os padrões. Ou seja, com a instalação do seu pacote para aonde vai o script, binário ou executável qualquer? Geralmente, para que um usuário possa executar, o arquivo executável deve ser armazenado em /usr/bin,caso seja um comando para o root, armazenamos ele durante a instalação em /usr/sbin. Outra informação iportante é que voce deve criar a estrutura idêntica do FHS dentro do diretório de criação do pacote, ou seja, os scripts de instalação e o arquivo de controle dentro do diretório DEBIAN e a estrutura do programa, conforme comentei la em cima a respeito da hierarquia local, /usr, /usr/share, /etc/, /usr/bin, /usr/share/lib, /usr/share/doc e /usr/share/man

Note, que permissão do diretório DEBIAN tem que ser 775 e os seus arquivos 555 para a execução posterior do dpkg -b. E o binário ou script para o programa, tem que ter o privilégio de execução pelo usuário tal como

#!/bin/bash
clear
echo “iniciando as coisas inuteis que todo o administrador tinha que ver”
sleep 2
sl && sl -a
figlet “LINUX EH O PODER”
eject && eject -t
/usr/games/bb
cmatrix -b

Ufa! E como ficou?

pacote-poder-0.2/
|– DEBIAN
   | |– control
   | |– postinst
   | |– postrm
   | |– preinst
      | ‘– prerm
‘– usr
   ‘– bin
‘      – pacote-poder

Gerando o pacote

Após a criação de toda a estrutura do pacote e seu entedimento dos scripts e aonde devem ser armazenados, como o arquivo de controle e os locais para onde os arquivos do programa devem ir, então vamos gerar o pacote deb.

$dpkg -b pacote-poder-0.2

NOTA: voce pode usar a metodologia de um pacote deb como mencionei la em cima.

Como resultado ele vai gerar o pacote no diretório que voce se encontra, para verificar o conteúdo do pacote, digite: dpkg -c

aprigio@aprigiosimoes:$ dpkg -c pacote-poder.deb
drwxrwxr-x aprigio/aprigio 0 2013-04-12 14:58 ./
drwxrwxr-x aprigio/aprigio 0 2013-04-12 14:46 ./usr/
drwxrwxr-x aprigio/aprigio 0 2013-04-12 14:46 ./usr/bin/
-rwxrwxr-x aprigio/aprigio 285 2013-04-12 14:49 ./usr/bin/pacote-poder
Para instalar o pacote basta digitar o comando:

$sudo dpkg -i pacote-poder.deb

Mas vou logo te adiantando, vai falhar a instalação das dependências e feio, pois como eu ja informei o dpkg não resolve dependências e isso é u trabalho para o apt, que faz o download dos arquivos de dependências deb e armazena no seu diretório de cache então para o dpkg instalar bsaeado nessas informações de controle, como podemos observar no verbose abaixo.

Selecionando pacote pacote-poder-0.2 previamente não selecionado.
(Lendo banco de dados … 468904 ficheiros e directórios actualmente instalados.)
Desempacotando pacote-poder-0.2 (de pacote-poder.deb) …
executando o script
pkg: problemas de dependência impedem a configuração de pacote-poder-0.2:
pacote-poder-0.2 depende de cmatrix-xfont; porém:
Pacote cmatrix-xfont não está instalado.

dpkg: erro ao processar pacote-poder-0.2 (–install):
problemas de depend̻ncia Рdeixando desconfigurado
Erros foram encontrados durante o processamento de:
pacote-poder-0.2


Para resolver o nosso problema de exemplo: sudo apt-get -f install

Para executar esse exemplo depois de instalado, digite: pacote-poder

Existem outras maneiras de fazer isso, como o checkinstall,  mas coloquei a maneira mais complexa e bem padrão como encontramos em outras distribuições como o Fedora, que possui um processo quase parecido para pacotes rpm. Mas voce pode usar no Ubuntu o Ubucompilator.

É o poder😉

Data: jul. 2013
Fonte: aprigiosimoes.com.br

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s