GNU/Linux
 
 
Services / Daemons / Processes / Runlevels
(iniciar, parar, habilitar e desabilitar)

Esse é um assunto que poucas pessoas conhecem, muito importante para o entedimento do sistema e pouco documentado e falado. Assim, os proximos parágrafos serão de extrema importância para o entendimento desse artigo, pois trará a parte teórica. Lembrando que esse assunto cai nas provas de certicação LPI.

Primeiramente precisamos diferenciar service, daemon e process. Service (serviço), como a própria tradução para português diz, tem a função de oferecer serviços à outros programas. Ele geralmente é iniciado/controlado por um shell script (arquivo executável que contém várias linhas de comandos em shell). Exemplo, para colocar o serviço SSH no ar, utilizamos o comando "/etc/init.d/ssh start". Esse arquivo "/etc/init.d/ssh" nada mais é do que um shell script que, dentre suas várias linhas, executa o daemon "sshd" que fica em background oferecendo serviços à quem precisar (por exemplo, um cliente ssh).

Daemon (tarefa) é um arquivo binário executável que quando chamado pelo serviço correspondente (ex: /etc/init.d/ssh) se torna um processo em background. Um exemplo é o "/usr/sbin/sshd" que é um daemon do SSH que abre a porta 22 TCP, oferecendo serviços de conexão remota segura.

Já o process (processo) é um binário executável que está na memória. Esse binário executável pode ser um daemon ou qualquer outro tipo binário executável. Além disso, ele pode está background ou não ou pode está oferecendo serviços ou não. O daemon "/usr/sbin/sshd" quando executado é enviado para a memória do computador, virando um processo do sistema. Numa outra mão, temos os binários que não são daemons, como o soffice.bin (OpenOffice) e o winword (MS-Word) que são processos que ficam em foreground, ou seja, eu consigo vê-los na tela do meu computador e geralmente não oferecem serviços à outros programas.



Debian
Iniciar e Parar Serviços

Modo 1: iniciar, parar, reiniciar e reler serviços
# /etc/init.d/ssh start
# /etc/init.d/ssh stop
# /etc/init.d/ssh restart
# /etc/init.d/ssh reload

Modo 2: iniciar, parar, reiniciar e reler serviços
# invoke-rc.d ssh start
# invoke-rc.d ssh stop
# invoke-rc.d ssh restart
# invoke-rc.d ssh reload


Fedora
Iniciar e Parar Serviços

Modo 1: iniciar, parar, reiniciar e reler serviços
# /etc/init.d/sshd start
# /etc/init.d/sshd stop
# /etc/init.d/sshd restart
# /etc/init.d/sshd reload

Modo 2: iniciar, parar, reiniciar e reler serviços
# service sshd start
# service sshd stop
# service sshd restart
# service sshd reload
Obs: não é insterassante o que o projeto Fedora faz dando o mesmo nome de um daemon (ex: /usr/sbin/sshd) para o nome do script que starta o serviço (ex: /etc/init.d/ssd). Isso gera confusão no entendimento e no manipulação do sistema.


Runlevels

Nos GNU/Linux exitem vários tipos de inicialização do sistema. Comparativamente, no MS-Windows também exitem vários tipos de inicialização (modo de segurança, modo de segurança com rede, normal, debug etc), bastando apertar "F8" antes de iniciar o sistema do tio Bill para escolher. Já GNU/Linux esses tipos de inicialização são 7 e são chamados de runlevels onde cada um tem uma finalidade.

Só para conhecimento, o Debian trabalha um pouco diferente do padrão nessa questão de runlevels. Devido à isso, segue o padrão do Debian GNU/Linux e veja que ele é bem mais simples que o anterior:

Para saber o runlevel padrão do sistema verifique no arquivo "/etc/inittab" a linha "id:X:initdefault". O "X" é um número de 0 à 6 que indicará o runlevel padrão, ou seja, o runlevel usado toda vez que iniciar o sistema operacional. Exemplo:

# vi /etc/inittab (entra no arquivo que define o runlevel padrão)
id:3:initdefault: (nesse caso o runlevel padrão é o "3")

Nessa parte, os tipos inicialização (runlevels) são muito mais flexiveis que no MS-Windows. Por exemplo, além de poder escolher o runlevel antes de iniciar o sistema, também se pode mudar de runlevel depois do sistema iniciado, sem precisar dar um boot. Para isso, basta utilizar o comando "init X". Onde o "X" é um número de 0 à 6 que indicará o runlevel pretendido. Ex:

# init 1 (entra no runlevel "1" ser reinicializar o computador)
# init 0 (desliga a máquina)
# init 5 (entra no ambiente gráfico)
# init q | Q (diz ao init para reler o arquivo "/etc/inittab" caso o mesmo tenha sido modificado)
# init s | S (may also be s or S which will place the system directly into single-user mode without actually stopping processes first, you probably won't want that)

Para verificar o runlevel atual digite:

# runlevel (mostra o runlevel anterior e o atual. Ex: "N 2". "N" é o runlevel anterior e significa que não houve alteração em comparação com o atual runlevel. Já o "2" é o runlevel atual)
# who -r (mostra o runlevel atual, a data que ele ocorreu e o runlevel anterior. Ex: "run-level 2 2013-08-17 07:54 last=S". Traduzindo: runlevel atual é 2, foi iniado em 2013-08-17 07:54 e o "S" explicita que não houve alteração em comparação com o atual runlevel)



Habilitar e Desabilitar serviços

Ao entrar em um dos runlevels existentes, há um série de serviços que são executados. Esses serviços, como já foi visto nesse artigo, ficam em "/etc/init.d/". Só que ainda não foi dito é que existe uma ordem/prioridade de execusão deles. Essa prioridade de execução existe porque alguns serviços devem ser executados primeiro que outros. Por exemplo, ao iniciar o sistema, o serviço de rede (/etc/init.d/networking) deve ser executado/startado antes do serviço ssh (/etc/init.d/ssh). Isso é lógico, pois como o ssh é um serviço de conexão via rede para usuário remotos e só sentido iniciá-lo/startá-lo se houver rede.

Além disso, ao entrar em um dos runlevel, o sistema precisa saber se o serviço de ser iniciado (start) ou parado (stop). Como já foi visto, o serviço de rede deve ser iniciado antes do serviço de "ssh". Mas isso só é válido para alguns runlevels como é o caso do runlevel 3 que geralmente é usado para iniciar o sistema com rede. Contudo, ao desligar o sistema (init 0), é acionado runlevel 0 e o serviço de "rede" e "ssh" devem ser parados (stop). Nesse caso, a ordem/prioridade na hora de parar os serviços deve ser inversa, ou seja, o "ssh" deve ser parado antes do serviço de rede. Para que o sistema saiba a ordem/prioridade e o tipo (start/stop) de execução de um serviço ao entrar num dos runlevels, ele verifica os diretórios:

A ordem e o tipo de execução dar-se atráves de links simbólicos (atalhos) relacionados aos serviços que estão em "/etc/init.d/". Esses links seguem o seguinte padrão:

# /etc/rcX.d/[SK]NNname

Onde o "X" é um número de 0 à 6 informando o runlevel usado. O "S" especifica que o serviço deve ser iniciado ou habilitado. O "K" indica que o serviço deve ser parado (stop) ou desabilitado. O "NN" é um número de 00 à 99 especicicando ordem de execusão dos serviços, onde o 0 é o mais prioritário, ou seja, o link que tem 00 é iniciado antes do que tem 01. Por exemplo, ao iniciar um Debian, por padrão, ele inicia no runlevel 2. Para sabermos quais serviços são habilitados e desabilitados nesse runlevel, basta olhar o conteúdo do diretório "/etc/rc2.d/", conforme figura a seguir:

Veja que existe um link chamado "S19ssh" e um chamado "K01xdm". Eles estão relacionado aos serviços "ssh" (/etc/init.d/ssh) e "xdm" (/etc/init.d/xdm), respectivamente, conforme figura a seguir:

Muito importante: o link "/etc/rc2.d/S19ssh" diz ao sistema que ao entrar no runlevel 2 o serviço "ssh", deve ser habilitado/startado com prioridade 19, ou seja, ele deve ser startado depois dos serviços que tem 00 à 18 em seus nomes (link simbólico). Já o link "/etc/rc2.d/K01xdm" diz ao sistema que ao entrar no runlevel 2 o serviço "xdm", deve ficar do jeito que está (desabilitado/parado), sendo que nesse caso a prioridade não terá muita importância. Agora vamos ver o que tem dentro de "/etc/rc0.d/" que representa os serviços que devem ser desabilitados ao entrar no runlevel 0, ou seja, ao desligar o equipamento:

Veja que existe um link chamado "K12ssh" e um chamado "S01umountfs". Eles estão relacionado aos serviços "ssh" (/etc/init.d/ssh) e "umountfs" (/etc/init.d/umountfs), respectivamente, conforme figura a seguir:

Muito importante: o link "/etc/rc2.d/K12ssh" diz ao sistema que ao entrar no runlevel 0 o serviço "ssh", deve ser desabilitado/parado com prioridade 12, ou seja, ele deve ser parado depois dos serviços que tem 00 à 11 em seus nomes (link simbólico). Já o link "/etc/rc2.d/S01umountfs" diz ao sistema que ao entrar no runlevel 0 o serviço "umountfs", deve ficar do jeito que está (habilitado), sendo que nesse caso a prioridade não terá muita importância.

Ao instalar algum tipo de serviço do sistema, automaticamente esse links são criados. Não sendo necessário modificação. No entando, caso haja necessidade, pode ficar a vontade em modificar manualmente utilizando o comando "mv" para mudar o "K" pelo "S", o "K" pelo "S" ou a prioridade de execusão dos serviços. Inclusive, se estiver desenvolvendo alguma aplicação, os diretórios "/etc/rcX.d/" e "/etc/init.d/" são os locais ideais e recomendados para acomodar qualquer tipo de seriço. Contudo, se você não quiser modificar manualmente esses links, existem alguns comandos e ferramentas que pode fazer isso de uma maneira mais tranquila:


Debian
Habilitar e Desabilitar Serviços

Modo 1: habilitar e desabilitar serviços da inicialização (runlevel)
# rcconf (é um dialog que é necessário instalar: apt-get install rcconf)
# sysv-rc-conf (um dialog que é necessário instalar: apt-get install rcconf)


Modo 2: habilitar e desabilitar serviços da inicialização (runlevel)

Desabilitar
# update-rc.d -f ssh remove (remove o ssh de todos rulevels do sistema. Remove os links simbólicos)
# update-rc.d ssh stop 0 1 2 3 4 5 6 . (refaz os links simbólicos, só que colocando K em vez do S. Assim, o ssh não será mais inicializado durante o boot. Esse comando é necessário, pois se somente remover os links, ao atualizar o pacote (ssh) os links serão refeitos com a configuração padrão, ou seja, o serviços vai ser iniciado durante o boot)

Habilitar
# update-rc.d -f ssh remove (remove o ssh de todos rulevels do sistema. Remove os links simbólicos. Isso é necessário, pois o próximo comando só funcionará se nenhum link existir)
# update-rc.d ssh defaults (adiciona o ssh em todos rulevels do sistema utilizando as opções padrão. Adiciona os links simbólicos novamente. Assim, o ssh será inicializado durante o boot)

Desabilitar especificando a prioridade/ordem de desinicialização/desligamento e os runlevels
# update-rc.d ssh stop 99 0 1 6 . (desabilita um serviços nos nos runlevels (0, 1 e 6) e com prioridade 99. Lembre-se que antes é necessário utilizar "update-rc.d -f ssh remove")

Habilitar especificando a prioridade/ordem de desinicialização/desligamento e os runlevels
# update-rc.d ssh start 22 2 3 (adiciona o ssh para startar nos rulevels 2 e 3 do sistema, utilizando a prioridade 22. A prioridade vai de 0 à 99 significando a ordem de inicialização, ou seja, o ssh só vai ser startado depois que os outros serviços de 0 à 21 forem iniciados. Lembre-se que antes é necessário utilizar "update-rc.d -f ssh remove")


Modo 3: habilitar e desabilitar serviços da inicialização (runlevel)
# chkconfig -l | --list (lista os serviços e os runlevels deles que estão "on" e "off")
# chkconfig -l | --list ssh (lista o serviço SSH e o runlevel dele que estão "on" e "off")

Desabilitar mais ou menos
# chkconfig ssh off (remove o ssh de todos rulevels do sistema. Remove os links simbólicos. Assim, o ssh não será mais inicializado durante o boot. Não é muito interessante, pois se somente remover os links, ao atualizar o pacote (ssh) os links serão refeitos com a configuração padrão, ou seja, o serviços vai ser iniciado durante o boot)

Habilitar
# chkconfig ssh 06 (adiciona o ssh em todos os rulevels (0 à 6) do sistema. Adiciona os links simbólicos novamente. Assim, o ssh será inicializado durante o boot e parado durante reboot/shutdown)

Habilitar mais ou menos
# chkconfig ssh on (adiciona o ssh no rulevel 1 2 3 4 5 do sistema. Adiciona o link simbólico novamente. Assim, o ssh será inicializado durante o boot)

Habilitar em RunLevels específicos
# chkconfig --level 23 ssh on (habilita o ssh no rulevel 2 e 3 do sistema. Renomeia os links simbólicos trocando o "K" pelo "S". Assim, o ssh será inicializado durante o boot)




Fedora
Habilitar e Desabilitar Serviços

Modo 1: habilitar e desabilitar serviços
# ntsysv (é um dialog)

Modo 2: habilitar e desabilitar serviços da inicialização (runlevel)
# chkconfig -l | --list (lista os serviços)
# chkconfig ssh off (desabilita o ssh de todos runlevels do sistema. Renomeia os links simbólicos trocando o "S" pelo "K". Assim, o ssh não será mais inicializado durante o boot)
# chkconfig ssh on (reabilita o ssh em todos runlevels do sistema. Renomeia os links simbólicos trocando o "K" pelo "S". Assim, o ssh será inicializado durante o boot)
# chkconfig --level 23 ssh on (habilita o ssh no rulevel 2 e 3 do sistema. Renomeia os links simbólicos trocando o "K" pelo "S". Assim, o ssh será inicializado durante o boot)





Inicialização do Sistema

Até agora nesse artigo foi visto o funcionamento dos runlevels num sistema GNU/Linux. Contudo, foram ocultados alguns detalhes da inicialização do sistema que muitos não sabem. O primeiro detalhe que precisamos saber é que ao iniciar um sistema é lido o arquivo "/etc/inittab" onde existe uma linha "id:3:initdefault:" que especifica o runlevel que vai ser usado para inicializar o sistema. Nesse caso é o runlevel 3 que provê um modo multi-usuário com rede.

Contudo, um segundo detalhe é que antes de iniciar os programas/scripts desse runlevel, que nesse caso são os do runlevel 3, é lida uma outra linha nesse mesmo arquivo chamada "si::sysinit:/etc/rc.d/rc.sysinit" no Fedora ou "si::sysinit:/etc/init.d/rcS" no Debian. Essa linha especifica o(s) primeiro(s) programa(s)/script(s) chamado(s) pelo "init" que devem ser executados antes de entrar no runlevel especificado na linha "id:3:initdefault:".

Esses scripts, que são executados antes de todos os outros, têm como objetivo iniciar os recursos básicos do sistema operacional como a montangem de todos os filesystem (mount), a inicialização ambiente de rede (definição do IP, hostname), os drivers dos dispositivos, o udev/hotplug, os módulos do sistema, system clock etc.

Mais um detalhe interessante é que o "init" é o primeiro processo do sistema (digite "ps ax | less para verifcar isso). Isso ocorre porque o "init" é o comando padrão do sistema usado para entrar nos runlevels disponíveis.




Extra

Para mudar o que deve ser executado ao apertar o CTRL+ALT+DEL entre em "vi /etc/inittab" e procure a linha:

ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

Agora mude para algo assim:

ca:12345:ctrlaltdel:/bin/echo "Desligamento Desabilitado"
journalctl -xeu serviço_especifico journalctl -xeu kubelet




Referências Bibliográgicas
# man update-rc.d
# man chkconfig
# man init
# man inittab
# man runlevel
# vi /etc/inittab
# vi /etc/rcX.d/README
# vi /etc/init.d/README
MOTA FILHO, J. E. Descobrindo o linux: entenda o sistema operacional GNU/Linux. 2. ed. São Paulo: Novatec, 2007.
BONAN, A. R. Linux: fundamentos, práticas & certificação LPI - exame 117-102. Rio de Janeiro: Alta Books, 2010.

 
 


ETI - Especialista em Tecnologia
da Informação