segunda-feira, 13 de outubro de 2008

Tutorial sobre scripts de inicialização do Linux

Excelente tutorial encontrado em :

http://dicaslinux.linuxsecurity.com.br/?modulo=artigos&acao=ver&registro=7

Ele ajuda a fazer scripts que autoexecutam com o iniciar ou desligar do pc

Autor :
Rodrigo P. Telles - telles@hypermall.com.br

SYSV-Scripts


Eu tenho percebido que algumas pessoas estão tendo problemas para adicionar scripts de controle de ações durante o BOOT e HALT do linux, então resolví escrever esse pequeno how-to sobre o assunto.

Em primeiro lugar é preciso entender o esquema do SYSV.

O SYSV está incluído na maioria das distribuições Linux (principalmente as que estão baseadas no RedHat) e funciona na seguinte estrutura de diretórios:

    /etc/rc.d
/etc/rc0.d --> 0 - halt
/etc/rc1.d --> 1 - Single User
/etc/rc2.d --> 2 - Multiusuário, sem NFS
/etc/rc3.d --> 3 - Modo multiusuário completo
/etc/rc4.d --> 4 - Não usado
/etc/rc5.d --> 5 - Start em X11
/etc/rc6.d --> 6 - Reboot
OBS: Dependendo da versão do SYSV e da distribuição esse esquema pode aparecer no diretório "/etc/rc.d/"

Dentro desses diretórios curiosamente só existem links simbólicos que apontam para o script real que deve estar em "/etc/rc.d/init.d/", e os links também curiosamente começam com "S" ou "K" seguidos de um número no formato decimal (2 casas - Ex: 10,85,99,etc) e o nome pelo qual o SYSV o identificará.

Ex: S95gpm
Esse formato siginifica:
S --> Start
K --> Stop
95 --> Sequência que o script será executado em tempo de BOOT.
Ou seja, se o link for "K10gpm" ele será o décimo script executado com o parâmetro "stop" (K10gpm stop) em tempo de BOOT, e se for "S10gpm" ele será o décimo script executado com o parâmetro "start" (S10gpm start), sendo assim o SYSV entende que alguns scripts são ou precisam ser executados antes ou depois de outros scripts. Ficou complicado ?
Um exemplo que pode ser citado sobre essa ordem são os scripts que precisam de networking (rede) já funcionando para poderem ser startados:

Ex:

/etc/rc3.d/S20network --> Start de número 20
/etc/rc3.d/S25squid --> Start de número 25

Essa sequência está correta, pois o DAEMON (Servidor) Squid (Proxy) precisa que os serviços de rede já estejam funcionando para poder startar com sucesso.
A numeração inversa dos scripts faria com que o script do squid falhasse:

/etc/rc3.d/S25network --> Start de número 25
/etc/rc3.d/S20squid --> Start de número 20

Nesse esquema significa que todo link/script (executável - rx) que estiver dentro do diretório:

"/etc/rc0.d" será executado no "HALT" com o parâmetro referente a sua letra (S ou K) em uma sequência determinada (05,10,etc).

"/etc/rc1.d" será executado em "Single Mode" (Safe Mode) com o parâmetro referente a sua letra (S ou K) em uma sequência determinada (05,10,etc).

"/etc/rc2.d/" será executado em "Multiusuário, sem NFS" com o parâmetro referente a sua letra (S ou K) em uma sequência determinada (05,10,etc).

"/etc/rc3.d" será executado em "Multiusuário completo" com o parâmetro referente a sua letra (S ou K) em uma sequência determinada (05,10,etc).

"/etc/rc4.d" não será utilizado.

"/etc/rc5.d" será executado em "X11" (modo gráfico - com as novas distribuições que utilizam instalação gráfica isso é comum) com o parâmetro referente a sua letra (S ou K) em uma sequência determinada (05,10,etc).

"/etc/rc6.d" será executado em "Reboot" com o parâmetro referente a sua letra (S ou K) em uma sequência determinada (05,10,etc).

Acho que agora você deve estar começando a entender essa bagunça toda de letras, números e diretórios certo ?
Espero que sim...mas também deve estar se perguntando como inserir um script em todos esse diretórios de uma vez só, e como deve ser esse script ?

Certo, vamos ao que interessa agora.

Construindo scripts compatíveis com o SYSV:

1 - O script precisa começar (primeira linha) com

#!/bin/bash
ou
#!/bin/sh

2 - O script precisa ter a seguinte linha
# chkconfig: 2345 85 15
É isso mesmo, mais números :^)

Essa linha significa:
chkconfig --> aplicação que vai adicionar o script no SYSV 2345 --> níveis (diretórios) aonde o link para o script vai ser adicionado para start
85 --> sequência de "start"
15 --> sequência de "stop"

Vale lembrar que os níveis que não forem adicionados para start (S) serão automaticamente marcados para stop (K), no nosso caso será 016 (0,1 e 6).

3 - O script precisa ter uma descrição

# description: Aqui você coloca a descrição do seu script

4 - O script pode executar o script de funções do sistema

[ root@localhost /]# "/etc/rc.d/init.d/functions" para poder mostrar as mensagens de "OK", "FAILED" e "PASSED", existem outras funções que podem ser utilizadas, recomendo uma breve "fuçada" nesse script.

Lembre-se que isso é opcional, mas o seu uso é recomendado.

4- O script precisa ter sessões de "start" e "stop" (outras são opcionais).

OBS: Todas as linhas que tem sustenido (#) no início precisam realmente estar comentadas.

Agora vamos escrever um script de exemplo que apenas mostra mensagens no console, como "Isso é um teste..." e "Isso não é um teste...":
#!/bin/bash
#
# chkconfig: 235 65 40
# description: Esse script é apenas um exemplo de scripts SYSV
#
. /etc/rc.d/init.d/functions #<-- essa linha é opcional #Se você optar por não utilizar essa linha, substitua #o comando "gprintf" por "printf". case "$1" in start) gprintf "Starting %s services: " "meuscript" printf "Isso é um teste..." echo ;; stop) gprintf "Stoping %s services: " "meuscript" printf "Isso não é um teste..." echo ;; restart) #<--opcional $0 stop $0 start ;; *) gprintf "Modo de usar: %s {start|stop|restart} " "meuscript" exit 1 esac exit 0
Salve esse script com o nome "meuscript".

Esse comando coloca o arquivo no diretório "/etc/rc.d/init.d/" com as permissões necessárias.

[ root@localhost /]# install -o root -g root -m 755 meuscript /etc/rc.d/init.d/

Agora vamos incluí-lo no SYSV em uma tacada só, utilizando o utilitário chkconfig que está presente em praticamente todas as distribuições que suportam SYSV.

[ root@localhost /]# chkconfig --add meuscript

Ufa, o script está pronto para ser utilizado no SYSV, se você possuir o utilitário "ntsysv" que também está disponível em praticamente todas as distribuições execute-o e verá o seu script listado e marcado para start.

Agora você pode rodar o seu script no BOOT/HALT ou então no próprio console:

/etc/rc.d/init.d/meuscript

Modo de usar:
[ root@localhost /]# meuscript {start|stop|restart}
[ root@localhost /]# /etc/rc.d/init.d/meuscript start
Starting meuscript services: Isso é um teste...

[ root@localhost /]# /etc/rc.d/init.d/meuscript stop
Stoping meuscript services: Isso não é um teste...

[ root@localhost /]# /etc/rc.d/init.d/meuscript restart
Stoping meuscript services: Isso não é um teste...
Starting meuscript services: Isso é um teste...
Você também pode utilizar o chkconfig para gerenciar os seus scripts:

chkconfig meuscript off --> desabilita o start no BOOT
chkconfig meuscript on --> habilita o start no BOOT
chkconfig --del meuscript --> remove o meu script do SYSV

[ root@localhost /]# man chkconfig para maiores informações.

É interessante você rodar cada um desses comandos e depois se dirigir aos níveis de diretórios que você escolheu (235) e verificar quais são as mudanças feitas para um melhor entendimento.

Ex:
[ root@localhost /]# chkconfig --add meuscript
ls -l /etc/rc.d/rc0.d/
...
K40meuscript ->
../init.d/meuscript

Parece familiar ?

...ls -l /etc/rc.d/rc1.d/
...
K40meuscript -> ../init.d/meuscript

Parece familiar ?
...
ls -l /etc/rc.d/rc2.d/
...
S65meuscript -> ../init.d/meuscript
...
ls -l /etc/rc.d/rc3.d/
...
S65meuscript -> ../init.d/meuscript
...
ls -l /etc/rc.d/rc4.d/
...
S65meuscript -> ../init.d/meuscript
...
ls -l /etc/rc.d/rc5.d/
...
S65meuscript -> ../init.d/meuscript
...
ls -l /etc/rc.d/rc6.d/
...
S65meuscript -> ../init.d/meuscript
...
Agora rode "chkconfig meuscript off" e verifique novamente os diretórios, aí sim você vai entender porque é interessante utilizar scripts compatíveis com SYSV.

Espero que esse artigo seja de utilidade para todos.
Rodrigo P. Telles - telles@hypermall.com.br




Uma pequena observação para o Ubuntu sobre o arquivo /etc/rcS.d :

Os scripts nesse diretório começam com a letra S e são executados quando o sistema inicia, mesmo em single user. (rc1) Os scripts são simbólicos e apontam para /etc/init.d/ .
Para disabilitar ums script neste diretório renomeie-o para que comece com a letra K

A partir do S40 , todos os sistemas de arquivo estão montados e a rede está disponível, todos os drivers já foram inicializados.
Depois do S60 , o relógio já foi setado , o NFS já foi montado e o sistema de arquivos já está limpo.

0 Comentários:

Postar um comentário

Assinar Postar comentários [Atom]

<< Página inicial