Alterando Runlevels no Linux com System V [Guia Básico]
Aprenda a alterar os níveis de execução – Runlevels – no Linux, utilizando os comandos init do systemv
O Linux possui três grandes sistemas especiais de carga dos serviços durante o processo de boot e também responsável por iniciar todos os processos: System V Init Daemon, Systemd e Upstream (era utilizado no Ubuntu – não mais!).
System V Init Daemon
O System V Init Daemon foi herdado do UNIX, que recebeu o nome de System V init Daemon (System Five) ou simplesmente init.
Sua função básica é carregar os serviços durante o processo de carga do sistema, tais como o suporte a rede, multiusuários, apache, mysql, e demais serviços da máquina.
Durante o processo de carga do Linux, o sistema de boot (GRUB) carrega a imagem do kernel para a memória.
Assim que o Kernel assume o controle da máquina, ele carrega um programa especial chamado init e que sempre tem o PID 1.
A partir daí, todos os outros processos executados na máquina são filhos do processo init, que tem o PID 1.
Isso porque, quando o usuário executa um programa, o kernel faz uma cópia do init através de um método chamado FORK e carrega o código de máquina do programa desejado em cima do código de máquina do clone do init que foi criado.
Você pode ver essa relação com o comando pstree:
# pstree
Runlevels no Linux
No Linux existem sete níveis de execução predefinidos de 0 a 6. Os serviços que cada runlevel pode executar vão depender da distribuição do Linux e da configuração que o administrador do sistema efetuou.
TABELA – Runlevels do Linux
# | Descrição |
0 | O nível zero define um desligamento elegante e rápido do sistema. |
1,s | O nível um é utilizado para manutenção do sistema, também chamado de monousuário (single user). Somente o essencial é executado. |
2 | Modo multiusuário com compartilhamento de arquivos NFS desabilitado. |
3 | Modo multiusuário com todos os serviços habilitados, mas sem interface gráfica para o login no sistema. |
4 | Não utilizado. |
5 | Modo multiusuário com todos os serviços habilitados, interface gráfica X11 e login em modo gráfico. |
6 | O nível seis é parecido com o nível zero, mas executa o reboot da máquina. |
Por padrão, as distribuições utilizam o nível 0 para uma sequência de desligamento (shutdown) elegante e o nível 6 para o reboot. E os runlevels 3 a 5 são utilizados para carga normal do sistema.
O nível 1 também conhecido como monousuário é utilizado para manutenções do sistema, como, por exemplo, recuperar uma partição de dados com problemas.
O administrador do sistema pode a qualquer momento alterar o nível de execução através do comando init seguido do número do runlevel desejado.
# init 5
ou
# telinit 6
O comando telinit é um link para o init.
É importante saber que a troca de nível de execução pode alterar os processos em execução e até desligar o sistema.
Quais Processos Serão Executados por cada Runlevel ?
Até agora aprendemos que o comando init pode alterar os processos em execução alterando os runlevels do sistema.
Mas a definição de quais processos serão executados por cada nível de execução é feita pela hierarquia de diretórios /etc/rc.d e scripts de shell.
Quando o Linux inicia, uma série de scripts no diretório /etc/rc.d é executada para dar a carga no sistema. Vejamos estes arquivos e diretórios com detalhe:
O arquivo rc.sysinit é executado pelo processo init durante a carga do sistema e habilita funções essenciais. Por exemplo montar as partições de disco;
O arquivo rc.local é executado pelo script rc.sysinit. Ele é utilizado pelos administradores para eles modificarem os serviços na carga do sistema. Este arquivo tem preferência para esta tarefa uma vez que não é alterado durante um processo de atualização (upgrade) do sistema;
O arquivo rc é utilizado para transições entre os runlevels;
O diretório /etc/rc.d/init.d contém os diversos scripts que fazem a carga de todos os serviços do sistema operacional.
Por exemplo o serviço de shell seguro SSH possui um script para carga do serviço com o nome sshd (Secure Shell Daemon). Este script e outros scripts podem aceitar como parâmetro comandos como start e stop. Outros serviços podem aceitar outros comandos como reload, restart, status etc.
Os níveis de serviço são definidos através dos diretórios /etc/rc<n>.d, onde <n> pode variar de 0 a 6, correspondendo aos runlevels.
Por exemplo /etc/rc0.d e /etc/rc1.d. Dentro da cada diretório de runlevel existem links simbólicos para os scripts dos serviços nos arquivos em /etc/rc.d/init.d.
Estes link simbólicos seguem o seguinte padrão:
[K|S]nn[nomedoscript]
Onde:
A letra K, de kill, indica que o script é para terminar um determinado serviço;
A letra S, de start, indica que o script é para carregar um determinado serviço;
Os números inteiros nn indicam a sequência de execução dos scripts, onde o menor número é executado primeiro.
Se existirem no mesmo runlevel serviços com o mesmo número de ordem de execução, a ordem será indeterminada.
A sequência dos números garante que um serviço que dependa de outro somente seja executado depois que a dependência seja satisfeita;
O nome do script para o link simbólico não é necessário para o funcionamento correto, mas para facilitar a leitura humana.
Por exemplo:
# /etc/rc.d/rc3.d/S23httpd -> /etc/rc.d/init.d/httpd
Para incluir um determinado serviço em algum runlevel desejado, você deverá copiar o script de carga para o diretório /etc/rc.d/init.d e criar um link simbólico para o script no runlevel desejado seguindo a nomenclatura acima.
Veja o exemplo:
# cp /usr/local/mailman/mailman.sh /etc/rc.d/init.d
# ln –s /etc/rc.d/init.d/mailman.sh /etc/rc.d/rc3.d/S25mailman
Definindo o Runlevel Padrão
O arquivo que define qual é o runlevel que o sistema assumirá durante a carga é o /etc/inittab. Neste arquivo procure a linha:
id:n:initdefault
Onde o n definirá o runlevel pelo seu número de 0 a 6. Nunca coloque neste arquivo o runlevel 0 ou 6 senão o sistema nunca entrará em produção.
Você poderá determinar em qual runlevel o sistema está em execução através do comando runlevel.
Este comando retorna o nível de execução anterior e o nível de execução atual. Se o nível de execução permaneceu inalterado desde a carga do sistema, o nível anterior será mostrado como a letra N.
O comando runlevel não altera o nível de execução, mas somente informa. Para alterar utilize o comando init.
Aprenda muito mais sobre Linux em nosso curso online. Você pode fazer a matrícula aqui com trial de 7 dias grátis. Se você já tem uma conta, pode acessar aqui.