Criando instaladores (self-extractor) em Linux (*unix)

 

Esta dica é destinada a quem precisa criar um instalador para Linux, onde o processo de instalação simplesmente imputa arquivos em seus determinados locais. Um exemplo prático para este tipo de instalação, são restaurações de múltiplas estruturas de diretórios e arquivos de configuração de um ou mais serviços. Exemplo: A restauração da estrutura de páginas web de um servidor Apache, onde o instalador reconstrói a estrutura de todas as páginas Web, junto aos arquivos de configuração do Apache, etc. O instalador poderia, neste exemplo, reestruturar os diretórios /etc/httpd, /var/www, /var/lib/mysqld, enfim, refazer a estrutura completa de um determinado serviço ou aplicativo.

 

 

 

 

 

Primeiro passo: Criando a estrutura de pastas e arquivos a serem restaurados

 


 

Este processo é simples. Em um diretório qualquer, de preferência um diretório criado para este fim, deve ser criado a estrutura a ser restaurada pelo instalador, obedecendo sempre a raiz do sistema como ponto primário. Abaixo veremos um exemplo de construção de um serviço do Apache, que inclui os diretórios /etc/httpd, /var/www, e a estrutura de dados do Mysql, inclusa em /var/lib/mysql.

Primeiramente criamos um diretório para o serviço todo:

[root@localhost /]# mkdir /RESTAURA

Depois, copiamos todos os diretórios a serem restaurados, utilizando a sintaxe a seguir do cp:

[root@localhost /]# cp -R –preserve –parents /etc/httpd /RESTAURA

[root@localhost /]# cp -R –preserve –parents /var/lib/mysql /RESTAURA

[root@localhost /]# cp -R –preserve –parents /var/www /RESTAURA

As opções utilizadas no cp fazem com que todo o conteúdo dos diretórios seja copiado também para o destino (-R), que as permissões de arquivos e identificações de usuário, grupo e outros seja conservada (–preserve) e que a estrutura dos diretórios também seja preservada no destino (–parents).

Feito isso a estrutura está pronta para ser tratada pelos próximos passos.

 

 

 

 

 

Segundo passo: compactando a estrutura


Para este passo, podemos adotar o método de compactação que melhor se encaixa à necessidade. Neste tutorial será abordado a compactação via bzip2 para favorecer uma compressão melhor, porém mais demorada para ser manipulada. A compactação é simples e obedece o padrão já conhecido, onde será compactado o conteúdo do diretório /RESTAURA:

[root@localhost /]# cd /RESTAURA

[root@localhost /RESTAURA ]# tar -cvjf BKP_APACHE.bz2 *

 

 


Terceiro passo: criando o instalador


Este é o grande “segredo” de todo o processo, vamos inserir um código shell-script no arquivo compactado, para que realize o trabalho de descompactar todo o conteúdo criado no diretório desejado, que em nosso exemplo será o diretório raiz (/). O código shell-script que fará o serviço de descompactação deve ser inserido no inicio do arquivo compactado, e não pode de forma alguma alterar o conteúdo binário do arquivo, para manter integro os arquivos compactados. Abaixo segue os passos para realizar a edição:

 

Devemos gerar uma cópia do arquivo compactado para fazer as alterações:

[root@localhost /RESTAURA]# cp BKP_APACHE.bz2 instalador_config_apache.run

Este arquivo recém criado é o arquivo a ser editado com o editor vi:

[root@localhost /RESTAURA]# vi instalador_config_apache.run

No início deste arquivo deve ser adicionado as seguintes linhas, que serão explicadas uma a uma mais adiante:

skip=4

tail -n+$skip $0 | tar -xjf – -C / 2>> /dev/null 1>> /dev/null

exit

A próxima linha após a linha exit já é o arquivo compactado e seu conteúdo, portanto CUIDADO!

Segue explicação de cada linha:

skip=4 #Esta linha gera uma variável com o valor 4, que será usada pelo tail na próxima linha.

tail -n+$skip $0 | tar -xjf – -C / 2>> /dev/null 1>> /dev/null # esta linha mostra o conteúdo do código binário do arquivo com o comando tail, pegando somente o conteúdo da 4ª linha em diante, que é a linha exata que inicia o código binário do arquivo compactado. A variável $0 indica que o arquivo a ser tratado pelo tail é o próprio arquivo que está sendo executado (instalador_config_apache.run). O tail então, direciona todo esse conteúdo para o comando tar (| tar -xjf) descompactar o conteúdo recebido via redirecionamento pipe (-) tendo como destino o diretório raíz (-C /). Os demais parâmetros escondem qualquer saída deste comando, que incluí saída padrão (1>> /dev/null) e saída de erros (2>> /dev/null).

exit # Finaliza o script de instalação e volta ao prompt de comando.

Obs.: Caso alguma outra instrução seja adicionada a este script, como comandos para instalar um software descompactado, etc, deve ser alterado a variável skip para tratar exatamente o números de linhas para o início do código binário.

Abaixo, segue um exemplo de como fica uma arquivo depois de editado:

skip=4                                                                                                                                                                                                                                                  tail -n+$skip $0 | tar -xjf – -C / 2>> /dev/null 1>> /dev/null                                                                                                                                                       exit                                    Bzh91AY&SYR&ÔA^@^C^_^?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐ^F^^w-嶒 ±à^Fèt^De2L ¦^F”ièOS^Q£!¦OIµ^Y­

Agora, basta salvar o arquivo editado, e conceder ao mesmo permissões de execução, para que seja executado assim que necessário, conforme abaixo:

[root@localhost /RESTAURA]# chmod +x instalador_config_apache.run

[root@localhost /RESTAURA]# ./instalador_config_apache.run

Neste ponto o instalador já está pronto, e pode ser aditado da maneira que for necessário. Poderíamos por exemplo, criar instruções para instalação de um programa partindo dos arquivos descompactados pelo script.

 

Fonte de pesquisa: http://br-linux.org/artigos/dicas_selfextract.htm

Por: Franklin Moretti (cialinux)

 

 

 

7 interações sobre “Criando instaladores (self-extractor) em Linux (*unix)

  1. Ótima dica, estava justamente procurando isso.

    Preciso criar um instalador para os programas que desenvolvemos (para a plataforma GNU/Linux) e utilizamos aqui na empresa. Mas além de recriar a estrutura de arquivos e diretórios, preciso criar os atalhos no menu KDE com seus respectivos ícones. Vocês já fizeram algo assim?

    1. Utilizei este método para automatizar a configuração de perfil de várias estações, mais especificamento para realizar de forma Unificada e com a menor chance de erros possível a instalação dos diversos ítens de uma estação de trabalho. Mas você pode estudar o diretório ~USUÁRIO/.kde para padronizar configurações no KDE para cada usuário em específico. Verifique também o diretório /usr/share/aplications para inserção de arquivos *.desktop.

      Obrigado por contribuir comentando no Blog.

      Abraços..!

  2. Olá, parabéns pela dica, eu sempre quis saber como que se faz isso. : p
    Desde então comecei a dar uma olhada mais profunda no assunto achei no manual do bash que existe a variável $LINENO que contém o valor da linha do script; dessa forma não é preciso usar a variável $skip.

  3. Como nesse script :

    #!/bin/sh

    echo “Este programa executará um tail para mostrar o conteúdo final do arquivo”
    tail -n+$(($LINENO+3)) $0

    exit

    Parabéns

    1. Excelente dica Arthur, eu não sabia desta variável.

      Mas dependendo do caso, como um instalador que possui 4 pacotes gz dentro do mesmo script, você pode manter os comandos e functions sempre no topo, e no fianl do arquivo, separado por comantários cada gz, onde na function necessaria você da o tail para descompactar a quantidade de linhas necessárias partindo da linha $skip , não da linha atual do tail. Pelo menos assim encontrei a melhor forma de organizar meus instaladores, que chegam a ter até 6000 linhas por exemplo.

      Muito obrigado pela dica da variável $LINENO, será extremamente útil para mim…

      Abraços..

    1. Como não lembraria Daniel,

      Amigos não se esquece assim tão fácil.. 😉

      Obrigado pela visita ao Blog, espero que goste..!

      Abraços

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Retype the CAPTCHA code from the image
Change the CAPTCHA codeSpeak the CAPTCHA code