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)
Ó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?
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..!
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.
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
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..
cara, tu ta fodao hem??huahuha
parabens..nm sei se tu lemrba d mim mass…tamo aew
parabens cara
abraçO!
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