Blog Agility

Níveis de Execução (Runlevels) no Linux

Níveis de Execução (Runlevels) no Linux

Máquinas Linux fazem boot da mesma forma que outros sistemas operacionais fazem.  Existe um setor de MBR que aponta para um bootloader, que por sua vez, inicializa o processo de carregamento das rotinas para que todos os serviços de hardware e software do sistema fiquem prontos para uso. No Linux, entretanto, este mecanismo funciona de forma mais customizável e detalhada para permitir que o administrador do sistema especifique de forma mais precisa como ele deve funcionar, da inicialização ao desligamento. Afinal, a grande vantagem de sistemas Open Source é essa: a liberdade de fazer o sistema funcionar da forma mais conveniente para o administrador.

Runlevels servem basicamente para isso: para especificar como o sistema deve se comportar durante o boot, execução e desligamento. Existem 7 níveis de operação (runlevels) que podem ser utilizadas no Linux, exibidos na tabela abaixo.

2016_01_PauloEliasJR_Runlevels_no_Linux_00
Tabela 1: Detalhamento dos Runlevels

Vamos citar o exemplo de uma máquina Linux sendo desligada. Para que a máquina seja desligada com segurança, todos os dados pendentes devem ser escritos em disco, todos os serviços devem ser parados, o kernel deve instruir o hardware a interromper quaisquer envio de instruções à CPU de forma ordenada e tudo deve ser escrito em log para que o administrador tenha rastreabilidade do que está acontecendo durante estas etapas. Estas tarefas são executadas no runlevel 0, que significa “Desligamento do Sistema Operacional.”

O processo init (primeiro processo invocado pelo kernel após o boot e processo pai de todos os processos ativos no sistema) é quem invoca e aplica esse runlevel, executando todos os scripts necessários para que o sistema entre nesse nível de execução.

Podemos encontrar os scripts de inicialização em /etc/rc*.d, onde * representa o número de identificação do runlevel.

2016_01_PauloEliasJR_Runlevels_no_Linux_01
Imagem 1: Lista de Diretórios com os scripts de cada runlevel

Dentro de cada diretório, estão alocados os scripts que serão executados naquele runlevel, como no exemplo o runlevel 0.

2016_01_PauloEliasJR_Runlevels_no_Linux_02
Imagem 2: Lista de Diretórios com os scripts de cada runlevel

Nos arquivos acima, existe uma nomenclatura que é atribuída à eles.Vamos exemplificar com o arquivo K07networking.

K, indica que este script realiza uma operação com o Kill, enviando o sinal 15 (SIGTERM) para o processo, indicando que ele deve encerrar por si só as suas atividades, mas enviando o sinal 9 (SIGKILL) novamente, caso este não responda.

Esta letra ainda pode variar para S, caso o runlevel seja o 1. Neste caso, o S é de Start, para iniciar o processo.

2016_01_PauloEliasJR_Runlevels_no_Linux_03
Imagem 3: Lista de scripts para o runlevel 5

07: indica a ordem de execução deste script. Caso existam dois com a mesma numeração, eles serão executados simultaneamente, uma vez que não exista dependência entre eles.

Networking: indica qual processo ou script será executado.

Todos os scripts nestes diretórios são apenas links simbólicos para os arquivos em /etc/init.d/. Estes não devem ser alterados a não ser que você saiba bem o que está fazendo.

2016_01_PauloEliasJR_Runlevels_no_Linux_04
Imagem 4: Conteúdo do diretório /etc/init.d/

Outro arquivo importante que deve ser mencionado quando falamos de Runlevels é o etc/inittab. Este arquivo é responsável por diversas informações relativas à inicialização do sistema e, mais importante, é ele quem diz qual é o runlevel padrão que o sistema terá ao inicializar. O trecho do arquivo que faz essa configuração é exibido abaixo.

2016_01_PauloEliasJR_Runlevels_no_Linux_05
Imagem 5: Definição do runlevel padrão do sistema.

O runlevel do sistema que estamos utilizando é o 2, padrão para as distribuições Debian. Somente as opções 1 até 5 podem ser especificadas aqui. Não faz sentido colocar o runlevel 0 ou o 6 pois a primeira tarefa que o computador teria ao iniciar será desligar ou reiniciar.

Outro trecho importante é o destacado abaixo. Ele nos informa onde estão os scripts que devem ser executados para cada runlevel.

2016_01_PauloEliasJR_Runlevels_no_Linux_06
Imagem 6: Localização dos scripts para cada runlevel

Outro trecho muito interessante é o destacado abaixo. Ele define qual é a ação que será realizada ao pressionar CTRL+ALT+DEL na máquina. Por padrão, essa combinação reinicia o sistema. É apropriado alterar essa configuração para evitar problemas com usuários de Windows.

2016_01_PauloEliasJR_Runlevels_no_Linux_07
Imagem 7: Comportamento ao pressionar CTRL-ALT-DEL

Qualquer mudança que for feita no /etc/inittab pode ser aplicada no sistema com o comando init q ou telinit q.

Falando ainda no init: Para alternar entre runlevels, basta executar init <numero_runlevel>. A imagem abaixo exibe a entrada no runlevel 1, utilizado para manutenção do sistema, desconectando todos os usuários (menos o root).

2016_01_PauloEliasJR_Runlevels_no_Linux_08
Imagem 8: Debian entrando no runlevel 1

Outros comandos podem forçar o sistema a entrar em runlevels específicos como o halt, que desliga o sistema. O que o halt faz é simplesmente, invocar o init 0. O comando shutdown, que desliga/reinicia o sistema pode receber parâmetros que invocam tanto o init 0 quanto o init 6. A imagem abaixo exibe o sistema entrando no runlevel 0, ou seja, sendo desligado.

2016_01_PauloEliasJR_Runlevels_no_Linux_09
Imagem 9: Debian entrando no runlevel 0 (desligando)

Para verificar em qual runlevel o sistema se encontra, podemos utilizar o comando Runlevel.

2016_01_PauloEliasJR_Runlevels_no_Linux_10
Imagem 10: runlevel atual do sistema

Neste exemplo, o primeiro caracter (N) exibirá o penúltimo runlevel ao qual o sistema se encontrava. Neste caso, N representa que o sistema não mudou de runlevel desde o boot. O 2 representa o runlevel atual do sistema.

É muito importante conhecer como os runlevels funcionam e as particularidades de cada um deles no detalhe. Essas informações são especialmente úteis para troubleshoots pós-boot ou para customizações avançadas de distribuições, cada vez mais presentes em cenários cada vez mais complexos de TI. E não esqueça: cada distro é uma distro e também é importante conhecer as particularidades neste quesito. Até o próximo artigo.