Você está na página 1de 8

Trabalhando com init no Debian

Introduo Este artigo ir tratar de scripts de inicializao e manipulao relacionados ao init, est agora dividido em 2 partes: 1) Ferramentas para manipular os inits.

rcconf update-rc.d sysv-rc-conf sysvconfig invoke-rc.d Na unha Script Service1 para Debian Script Service2 para Debian Script para criao e uso de um rc.local para o Debian

2) Ferramentas para trabalhar com eles.

Existem dois estilos de init: o BSD e o SYS-V. Cada um tem suas peculiaridades. O Debian usa init SYS-V. Os scripts so armazenados em /etc/init.d e links so criados em /etc/rc?.d, onde o ? representa o runlevel. ATENO! Especificamente, antes de entrar em qualquer nvel de execuo, todos os scripts iniciados com 'K' so executados; esses scripts matam (param) servios. Ento todos os scripts iniciados com 'S' so executados; esses scripts iniciam servios. O nmero de dois dgitos seguido de 'K' ou 'S' indica a ordem na qual o script executado. Scripts de menor valor numrico so executados primeiro. Esse mtodo funciona porque todos os scripts em /etc/init.d/ aceitam um argumento que pode ser "start" (iniciar), "stop" (parar), "reload" (recarregar), "restart" (reiniciar) ou "force-reload" (forar-recarregar) e iro portanto cumprir a tarefa indicada pelo argumento. Esses scripts podem ser usados mesmo depois que um sistema tenha sido iniciado para controlar vrios processos. Caso deseje adicionar novos servios para iniciar junto com o boot, devemos adicionar o script em /etc/init.d/<script>. Assim sendo, para invocar um script temos: /etc/init.d/<script> <opo> Usurios e no-administradores de distribuies ligeiramente diferentes, sente alguma dificuldade de adaptao, quando necessita subir algum servio e j vai logo lanando um "service", ou adicionar um runlevel com o conhecido "ntsysv" e recebe um lindo e merecido: command not found. Para quem sente falta de um gerenciador de runlevel no Debian, temos quatro opes legais: 1) rcconf 2) update-rc.d 3) sysv-rc-conf 4) sysvconfig

rcconf Muito semelhante ao ntsysv da Red Hat, porm com muitos problemas. O rcconf um front-end para o update-rc.d. O rcconf permite voc controlar que servios so iniciados quando o sistema inicia ( :S ), ele ir mostrar uma tela onde voc poder ver o status de cada servio [*] ou [ ]. O rcconf trabalha obtendo a lista de servios de /etc/init.d e observa nos diretrios /etc/rc?.d para determinar se cada servio est ligado ou no no boot. Se o nmero NN (de /etc/rc?.d/NNname) no 20 (padro), rcconf salva o nome do servio junto ao seu nmero em /var/lib/rcconf/services para que seja possvel restabelecer o servio para sua configurao original. Instalao: # apt-get install rcconf Atualizar menus: # update-rcconf-guide Utilizao: # rcconf Ele ir chamar uma tela demonstrando o que temos de inicializao e marcar para iniciar ou no iniciar (desativar). Marcando a desativao, o script passar a ter, nos respectivos runlevel, o argumento K00script.

update-rc.d Um outro mais interessante e MUITO mais eficiente o update-rc.d. Instalao: # apt-get install file-rc update-rc.d Utilizao: update-rc.d <nome> start NN runlevel . stop NN runlevel . Nome o mesmo nome do arquivo contido em /etc/init.d, NN significa a ordem em que eles sero iniciados/parados e runlevel especifica em quais runlevels eles sero iniciados/parados. Exemplo com o script firewall. NOTA: O arquivo deve estar dentro do diretrio init.d. # update-rc.d firewall start 20 2 3 4 5 . stop 20 0 1 6 .

NOTA: Se j existir uma entrada no arquivo como o nome especificado, update-rc.d no ir fazer nada. Voc tambm pode deixar os runlevels como padro: update-rc.d <nome> defaults [NN | NN-start NN-stop] Colocando o defaults, ele ir deixar os runlevels para inicializao como: 2, 3, 4 e 5; e para finalizao: 0, 1 e 6 (para saber mais, leia a manpage do init). NN indica que o arquivo ter a mesma prioridade na inicializao/finalizao. Para deixar diferente, especifique NN-start para a inicializao e NN-stop para finalizao. NOTA: recomendvel sempre especificar um runlevel para os servios serem finalizados. Ex: # update-rc.d firewall defaults J para remover um arquivo da inicializao/finalizao, use: update-rc.d [-f] <nome> remove O -f pode ser usado para que o update-rc.d remova tambm links simblicos. Este comando excluir os links dos rcN.d, e conseqentemente com que o servio seja iniciado e parado manualmente, ou seja, voc precisar usar o script em /etc/init.d/firewall <opo>. Ex: # update-rc.d -f firewall remove Uma opo que pode ser usada em ambos os 3 comandos -n. Ela faz com que update-rc.d simule o que aconteceria. # update-rc.d -n firewall remove No se preocupe, ele ir mostrar a sada corretamente, porm, no haver nenhuma alterao.

sysv-rc-conf e sysvconfig uma ferramenta com interface grfica para configurao do runlevel do SysV para o terminal. Instalao: # aptitude install sysv-rc-conf Dependncias: os pacotes extra a seguir sero instalados: # apt-get install libcurses-perl libcurses-ui-perl libterm-readkey-perl Os NOVOS pacotes a seguir sero instalados: libcurses-perl libcurses-ui-perl libterm-readkey-perl sysv-rc-conf Execuo:

# sysv-rc-conf Para incluir o seu script, visualize ele na listagem da esquerda e marque com um [X] no runlevel 2. Para excluir, desmarque deixando a opo em branco []. Para selecionar use a tecla de espao.

sysvconfig
O comando sysvconfig um editor escrito em dialog, utilizado para:

Habilitar e desabilitar servios; Editar os links dos runlevels; Restaurar de um arquivo backup o estado original de seus init; Apesar de possuir uma interface em dialog, ele tambm funciona em modo texto.

Ferramentas para manipular os init

invoke-rc.d
O comando invoke-rc.d nada mais que um script que faz o trabalho bem feito de invocao dos servios localizados em /etc/init.d/<servio>. Voc deve passar como parmetro padro [ start | stop | force-stop | restart | reload | force-reload | status ]. Ex: # invoke-rc.d squid reload Uma dica, caso deseje utiliz-lo como um comando "service <servio> [ parmetro ]", voc pode criar um alias: # vi ~/.bashrc alias service='invoke-rc.d'

Na Unhaa
Pronto, para quem gosta de bash, a esta! Copie o script para o diretrio /etc/init.d/: # cp script /etc/init.d/ Torne o script executvel: # chmod +x /etc/init.d/script Entre no diretrio /etc/rc2.d: # cd /etc/rc2.d/

Crie um link para o seu script: # ln -s /etc/init.d/script /etc/rc2.d/S19script OBS: Como foi explicado anteriormente os scripts que iniciam com 'S' passam start como seu argumento, e o '19' assegura que o script seja chamado antes de quaisquer scripts contendo nmeros 20 ou superiores. Se voc no precisa que o script seja um dos primeiros a iniciar, ou melhor que ele seja iniciado l no final do boot, voc pode coloc-lo como 99. # ln -s /etc/init.d/script /etc/rc2.d/S99script Para retirar o script da inicializao, apenas remova o link, assim: # rm -f /etc/rc2.d/S99script OBS: Os argumentos K e S devem, obrigatoriamente, estar em Caixa Alta (maiscula). Este problema de iniciar programas no boot um problema crucial para os users do Debian e distribuies baseadas nela (arquivos em /etc/default no fazem efeito no Debian). No prprio manual dele, tem algumas coisas falando sobre isso. Dem uma olhada no site do Debian. Nota: por mais que eu no tenha especificado o Ubuntu, essa dica tambm vale para ele. Script Service1 #! /bin/sh # Script verso 0.01 do service para Debian # Esta a primeira verso do meu script service, tudo ANTES de conhecer o invoke-rc.d. # Flavio Torres - flaviotorres@linuxmasters.info case "$2" in start) echo "Iniciando servico $1 " /etc/init.d/$1 start ;; stop) echo "Parando servico $1 " /etc/init.d/$1 stop ;; *) echo "USO: service <script> {start|stop}" exit 1 ;; esac exit 0 Para este script funcionar legalzinho, sem ter de execut-lo a partir de seu diretrio vigente, voc DEVE inclu-lo no diretrio "echo $PATH" do sistema, o mesmo para o script SERVICE2 abaixo. Service Script2 #!/bin/sh VERSION="`basename $0` ver. 0.91"

USAGE="Uso: `basename $0` < option > | --status-all | [ service_name [ command | --full-restart ] ]" SERVICE= SERVICEDIR="/etc/init.d" if [ $# -eq 0 ]; then echo "${USAGE}" >&2 exit 1 fi while [ $# -gt 0 ] do case "${1}" in --help | -h | --h* ) echo "${USAGE}" >&2 exit 0 ;; --version | -V ) echo "${VERSION}" >&2 exit 0 ;; *) if [ -z "${SERVICE}" -a $# -eq 1 -a "${1}" = "--status-all" ]; then cd "${SERVICEDIR}" for SERVICE in *; do case "${SERVICE}" in functions | halt | killall | single| linuxconf| kudzu | *rpmorig | *rpmnew | *rpmsave | *~ | *.orig) ;; *) if [ -x "${SERVICEDIR}/${SERVICE}" ]; then "${SERVICEDIR}/${SERVICE}" status fi ;; esac done exit 0 elif [ $# -eq 2 -a "${2}" = "--full-restart" ]; then SERVICE="${1}" cd "${SERVICEDIR}" if [ -x "${SERVICEDIR}/${SERVICE}" ]; then "${SERVICEDIR}/${SERVICE}" stop "${SERVICEDIR}/${SERVICE}" start exit $? fi elif [ -z "${SERVICE}" ]; then SERVICE="${1}" else OPTIONS="${OPTIONS} ${1}" fi shift ;; esac done

if [ -x "${SERVICEDIR}/${SERVICE}" ]; then "${SERVICEDIR}/${SERVICE}" ${OPTIONS} else echo "${SERVICE}: Servico desconhecido" >&2 exit 1 fi Script RC.LOCAL #!/bin/sh # Script rc.local, este script eh utilizado para fazer manutencao e inicializacao no rc.local # Flavio Torres - flaviotorres@linuxmasters.info # Para faz-lo til, deve-se adicion-lo diretorio /usr/bin/ # versao 0.6 - abril de 2006 PATH=/bin:/sbin:/usr/bin:/usr/sbin export PATH TESTA(){ if [ $? == 0 ]; then echo -e [ 'e[40;32;1m OK e[m' ] else echo -e [ 'e[40;31;1 ERRO e[m' ] fi } case "$1" in start) if [ -f /etc/rc.local ]; then exec /etc/rc.local 2>&1&> /dev/null else echo "O arquivo rc.local nao existe, utilize a opcao add." fi ;; stop) echo "Sem acao" ;; status) echo "Sem acao" ;; restart|reload) $0 stop $0 start ;; add) DIR="/etc/init.d" ARQ="/etc/rc.local" if [ -e /etc/rc.local ]; then printf "" else echo "Criando configuracoes..."

touch /etc/rc.local && chmod 755 /etc/rc.local ln -s /usr/bin/rc.local /etc/init.d/rc.local update-rc.d rc.local start 99 2 3 4 5 . stop 99 0 1 6 . TESTA fi echo "Entre com o nome do script: " read NOME grep $NOME $ARQ if [ $? == 0 ]; then echo "^^^, O arquivo ja esta adicionado." if [ -e $DIR/$NOME ]; then printf "" else chmod 755 $NOME && cp $NOME $DIR printf "Porem nao existia em $DIR, adicionando..." TESTA fi elif [ -e $DIR/$NOME ]; then chmod 755 $DIR/$NOME && echo $DIR/$NOME >> $ARQ TESTA else chmod 755 $NOME && cp $NOME $DIR && echo $DIR/$NOME >> $ARQ TESTA fi ;; *) echo -n "Uso: $0 {add|start|stop|status|restart}" echo exit 1 esac