Introdução
Em alguns momentos podem ser mais fáceis instalar pacotes a partir de um .deb do que criar scripts de instalação, isso acontece porque há uma grande facilidade na hora de instalar um pacote e na hora de removê-lo, toda responsabilidade sobre os arquivos na hora de instalar e de remover fica com o gerenciador de pacote, livrando o administrador de ter que ficar removendo arquivos e pastas individuais.
Sem falar que ter um .deb do seu script deixa tudo mais profissional, a coisa fica mais legal quando você converte o script para binário, junto com um .deb, deixa o script com uma cara bem mais profissional.
Antes de começarmos Neste tutorial vamos falar apenas o essencial para que se possa criar um pacote do tipo Debian, há também algumas boas práticas que podem ser seguida para deixar o pacote com uma cara um pouco mais profissional.
Para exemplificar a criação do pacote, vamos criar dois script em bash, eles serão instalados automaticamente na nossa máquina.
Crie os scripts abaixo:
Script - Hora
#!/bin/bash
# Esse script mostra a hora com os segundos.
# Caso seja cancelado o script (Ctrl+c), o cursor volta a aparecer
trap 'tput cnorm && echo "" && exit 0' SIGINT
# Torna o cursos invisivel
tput civis
# Inicia um loop contanto as horas e mudando os caracteres
while true
do
echo -ne "\\rHora: $(date +%H:%M:%S)"
done
Script - memory
#!/bin/bash
# monitora os recursos de memoria continuamente.
while true
do
free -m
sleep 1
clear
done
Estrutura de diretório
O pacote debian é composto por por um diretório denominado diretório base, dentro deste diretório temos outros diretórios.
Um subdiretório muito importante é o subdiretório chamado DEBIAN, neste diretório temos alguns arquivos que são importantes para o funcionamento do pacote. O pacote segue a estrutura de Filesystem Hierarchy Standard (FHS) do Linux.
Segue abaixo como deve ser montado o diretório para o pacote:
Diretório Base
Diretório 'DEBIAN'
Arquivo 'control'
Arquivo 'copyright'
Arquivo 'changelog'
Arquivo 'rules'
Arquivo 'postinst'
Arquivo 'postrm'
Arquivo 'preinst'
Arquivo 'prerm'
Diretório dos scripts
Abaixo segue a descrição dos diretórios usados:
Diretórios | Descrição |
---|---|
Diretório Base | É o primeiro diretório do pacote, nesse diretório temos os outros diretórios, esse diretório deve ter o nome do pacote. |
Diretório DEBIAN | É o primeiro subdiretório, nele temos arquivos de configuração para que o pacote funcione. |
Abaixo segue a descrição dos arquivos que ficam sob o diretório Debian:
Arquivos | Descrição |
---|---|
control | Arquivo principal e extremamente obrigatório. Aqui definimos as diretivas de controle do pacote, essas diretivas serão usadas pelo dpkg, apt-get, apt-cache, aptitude, dselect entre outras ferramentas de gerenciamento de pacote. |
preinst | Este arquivo é um script que é executado antes que o arquivo .deb seja descompactado pelo dpkg. |
postinst | Este arquivo é um script que é executado depois do pacote ter sido descompactado. |
prerm | Este arquivo é um script que realiza ações antes do pacote ser removido. |
postrm | Este arquivo é um script que é executado depois do pacote ter sido removido, nele podemos colocar coisas como modificação de links, remoção de diretórios ou arquivos. |
Lembre-se, o único arquivo obrigatório é o control, tem muitos outros arquivos que não serão descritos aqui neste tutorial. Vale citar também que a equipe de desenvolvimento do Debian não recomenda a utilização dos scripts abaixo, a menos que seja estritamente necessária, assim como informa abaixo:
“As a novice maintainer, you should avoid any manual editing of maintainer scripts because they are problematic. For more information refer to the Debian Policy Manual, 6 "Package maintainer scripts and installation procedure", and take a look at the example files provided by dh_make.
If you did not listen to me and have created custom maintainer scripts for a package, you should make sure to test them not only for install and upgrade but also for remove and purge.
Upgrades to the new version should be silent and non-intrusive (existing users should not notice the upgrade except by discovering that old bugs have been fixed and perhaps that there are new features).
When the upgrade is necessarily intrusive (eg., config files scattered through various home directories with totally different structure), you may consider as the last resort switching the package to a safe fallback state (e.g., disabling a service) and providing the proper documentation required by policy (README.Debian and NEWS.Debian). Don't bother the user with debconf notes invoked from these maintainer scripts for upgrades.”
Começando pela parte fácil
Agora que temos os dois scripts e entendemos a estrutura básica do pacote, vamos começar a montar nosso pacote .deb.
Crie uma pasta com o nome que quiser, neste exemplo vou chamar de hourmemory;
linux:~\$ mkdir hourmemory
Defina onde irá ficar esses scripts, gosto de deixá-los no /usr/bin/;
Definido isso, devemos criar o caminho do diretório exatamente como é no FHS, só que, vamos criar dentro da nossa pasta, criada anteriormente. Dentro da pasta hourmemory vou criar o caminho usr/bin/
e colocar os script lá.
Crie os diretórios usr/bin/ dentro de hourmemory:
linux:~\$ mkdir -p hourmemory/usr/bin/
Copie os scripts para dentro da nossa pasta:
linux:~\$ cp hora memory hourmemory/usr/bin/
Agora entre na pasta
linux:~\$ cd hourmemory/
Crie a pasta ‘debian’ e dentro dela o arquivo ‘control’
linux:~\$ mkdir debian
Temos 3 formas de criar o arquivo control, a primeira é a forma manual, a segunda é criar o arquivo control através do comando equivs-control control
, para isso, você precisa ter instalado o pacote equivs. A última forma cria o diretório debian automaticamente com tudo que deve ter dentro dele.
Como a segunda forma é mais complexa e a primeira é muito simples, vamos usar a segunda, assim você terá uma base do que deve ter dentro do arquivo control. Para isso vamos instalar opacote equivs;
linux:~\$ sudo apt install equivs
Crie o arquivo control dentro de debian:
linux:~\$ equivs-control debian/control
Edite o arquivo control usando o editor de sua preferência:
linux:~\$ vim debian/control
Você verá que o arquivo está repleto de informações e exemplos, estes exemplos estão comentados, basta descomentar para ativar a sua funcionalidade. O comentário é feito pelo símbolo de jogo da velha.
Abaixo segue as opções obrigatórias para o funcionamento do pacote:
Package:
Version:
Architecture:
Maintainer:
Description:
Eu deixei dessa forma:
Package: hourmemory
Version: 1.0.1
Maintainer: fulano <fulano@gmail.com>
Architecture: all
Description: Contem script para exibir a hora e consumo de memoria ram.
Dica: Se não for usar nenhuma opção disponível no arquivo, remova-o ou comente a linha.
Criar o pacote .deb do nosso script, para isso, saia do diretório base:
Primeiro saia do diretório, como meu diretório base está na minha home, eu apenas irei voltar para ela.
linux:~\$ cd ~
Temos duas formas de criar o pacote .deb, a primeira é usando o pacote equivs, não gosto muito desse método porque ele geralmente não mostra caso tenha algum erro. A segunda forma é usando o dpkg e caso tenha algum erro no pacote ele vai informar.
Crie o .deb da nossa pasta:
linux:~\$ sudo dpkg -b hourmemory
dpkg-deb: building package 'hourmemory' in 'hourmemory.deb'.
Caso de erro, deixe apenas as linhas que você vai utilizar dentro do arquivo control, na maioria dos casos isso resolve erros no arquivo.
Outro meio de criar o pacote é usando o comando equivs-build hourmemory
.
Agora vamos instalar o pacote:
linux:~\$ sudo dpkg -i hourmemory.deb
Você pode digitar hora
e memory
e verá que os scripts irão funcionar, isso porque nosso .deb colocou eles dentro de /usr/bin/, assin como estava dentro de hourmemory, você precisa recriar o caminho absoluto dentro do diretório base.
Extra
Você pode verificar se o seu pacote está instalado, usando o comando abaixo:
linux:~\$ dpkg -l | grep hourmemory
ii hourmemory 1.0.1 all Contem script para exibir a hora e consumo de memoria ram
Para remover o pacote, você faz como faria com qualquer outro pacote.
# Exemplo de remoção do pacote:
linux:~\$ sudo apt remove hourmemory
# Eu gosto de user o --purge também:
linux:~\$ sudo apt remove hourmemory --purge
Por motivo de boas práticas, na hora de dar nome ao pacote e até mesmo nos diretórios, é bom colocar: nome do pacote, versão e arquitetura e nunca deixar espaço entre os nomes, como é mostrado abaixo:
hourmemory_1.0.1_all.deb