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.
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.
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.
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.
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.
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.
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.
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.
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).
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.
Imagem 9: Debian entrando no runlevel 0 (desligando)
Para verificar em qual runlevel o sistema se encontra, podemos utilizar o comando Runlevel.
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.