Se você está estudando para o LPI-101 precisa também entender a inicialização e como gerenciá-la, por isso mesmo esse artigo trata do gerenciamento da inicialização do Linux através do SysVinit.
O que é o SysVinit?
O SysVinit é o sistema tradicional de inicialização de serviços.
Após iniciar o processo /sbin/init, o SysV lê o arquivo /etc/inittab para determinar o nível de execução padrão do sistema e iniciar os demais serviços.
Quando falamos em nível de execução, estamos nos referindo a quais serviços deverão ser executados (ou finalizados) no sistema em um determinado nível (numerados de 0 a 6).
Observe a seguir um resumo sobre os níveis de execução e seus propósitos (segundo discriminado no Debian 7.4):
- 0: De forma direta, esse nível desliga o sistema. Também conhecido como halt.
- 1, s ou S: Nível monousuário.Utilizado pelo superusuário para realizar atividades básicas para manutenção do sistema (sem acesso à rede ao compartilhamento de arquivos).
- 2, 3, 4 e 5: Multiusuário.
- 6: Reinicialização do sistema (reboot).
Lembre-se de que os runlevels 0, 1 e 6 são comuns a qualquer distribuição.
Baseado no nível de execução configurado, são executados os scripts presentes nos diretórios /etc/rcx.d/ (ex: rc5.d, rc3.d, etc.).
Nesses diretório encontarm-se diversos links simbólicos para arquivos contidos no diretório /etc/init.d/.
No próximo capítulo iremos estudar o seu arquivo de configuração e aprender a configurar o runlevel padrão e realizar mudanças entre os níveis com o sistema em execução.
Apesar de bastante robusto, este método apresenta como ponto negativo o fato dos serviços serem executados em sequência, fazendo com que a inicialização do sistema seja mais demorada.
Você já deve saber que o/sbin/init manda chamar os scripts pertencentes ao nível de execução configurado como padrão em /etc/inittab.
E quem irá de fato executar esses scripts? O script /etc/init.d/rc.
Esse receberá como parâmetro valores de zero a seis e buscará dentro dos diretórios inicializadores (/etc/rcX.d (onde X representa o runlevel em questão)) pelos scripts de inicialização.
Os scripts contidos nos diretórios de inicialização são, na verdade, links simbólicos para o diretório /etc/init.d.
Em algumas distribuições Linux, o diretório é o /etc/rc.d/init.d.
Dentro dos diretórios inicializadores, podemos ter scripts com nomes iniciados em K ou S.
Aqueles iniciados com a letra K, irá finalizar o serviço naquele runlevel (por exemplo, /etc/rc0.d/K01apache finaliza o Apache no runlevel 0).
Já aqueles que iniciam com a letra S, irá iniciar um serviço naquele runlevel (por exemplo, /etc/rc2.d/S17apache2 inicia o serviço Apache no runlevel 2).
Além disso, os scripts possuem uma ordem determinada.
Por exemplo, o script /etc/rcX.d/S1xxx será executado primeiro que /etc/rcX.d/S2xxx. Durante a inicialização, o último script a ser executado é o /etc/rc.local.
Apesar de bastante robusto, este método apresenta como ponto negativo o fato dos serviços serem executados em sequência, fazendo com que a inicialização do sistema seja mais demorada.
Gerenciamento de Inicialização no SysVinit
Vamos analisar o conteúdo do arquivo /etc/inittab e aprender a como trocar o runlevel do sistema (e configurar o nível padrão a ser utilizado).
Observe os principais campos contidos no arquivo /etc/inittab, bem como breves descrições sobre cada um deles (a partir da distribuição Debian 7.4):
dltec@cap1:~$ cat /etc/inittab
# Este é o runlevel configurado como padrão no sistema.
id:2:initdefault:
# indica o primeiro runlevel executado durante o boot, exceto no modo de emergência.
si::sysinit:/etc/init.d/rcS
# Localização de cada dos serviços e scripts a serem iniciados para cada nível de #execução
# Runlevel 0 => desligamento.
# Runlevel 1 => monousuário.
# Runlevels 2-5 => multiusuário.
# Runlevel 6 => reinicialização.
l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
# O que fazer quando as teclas CTRL-ALT-DEL forem pressionadas.
ca::ctrlaltdel:/sbin/shutdown -t3-r now
# O que deverá ser feito quando ocorrer falta de energia e quando a mesma retornar.
pf::powerwait:/etc/init.d/powerfail start
pn::powerfailnow:/etc/init.d/powerfail now
po::powerokwait:/etc/init.d/powerfail stop
# Terminais virtuais disponíveis para os runlevels em execução
1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6
Analisando as Ações
Além da ação initdefault (define o runlevel do processo init), existem outras. Veja a seguir:
- respawn: O processo é reinicializado caso seja parado ou finalizado.
- wait: O processo é iniciado e o init espera pela sua finalização.
- once: O processo é iniciado no momento em que o runlevel também é iniciado.
- boot: O processo é iniciado no boot do sistema. O runlevel é desnecessário e ignorado.
- bootwait: O processo é iniciado no boot do sistema enquanto o init aguarda a sua finalização. O runlevel também é desnecessário e ignorado.
- off: Não realiza nenhuma ação.
- sysinit: O processo é iniciado durante o boot, porém antes das ações boot/bootwait. O runlevel também é desnecessário e ignorado.
- powerwait: O processo é iniciado em casos de queda de energia. O processo init aguarda a sua finalização.
- powerfail: O processo também é iniciado em casos de queda de energia, mas o init não aguarda a sua finalização.
- powerfailnow: O processo é executado em casos em que a bateria do nobreak está quase acabando.
- powerokwait: No momento em que a energia for restabelecida, o processo relacionado a essa ação é executado.
- ctrlaltdel: Ação a ser tomada no momento em que forem pressionadas as teclas Ctrl + Alt + Del.
- kbrequest: Executa determinada ação quando alguma combinação de teclas especial for pressionada (será necessário alterar o mapa de caracteres do sistema).
Veja um exemplo de ação relacionada ao pressionamento das teclas Ctrl + Alt + Del:
Para verificarmos o runlevel atual, podemos utilizar o comando runlevel:
dltec@cap1:~$ runlevel
N 2
O comando runlevel retorna o nível de execução anterior e o atual. Se o nível permaneceu inalterado desde a carga do sistema, o nível anterior será mostrado como N.
Para trocar o runlevel do sistema, os comandos init ou telinit podem ser utilizados. Por exemplo, para trocar o nível de execução atual para o runlevel 1, um dos seguintes (equivalentes) comandos podem ser utilizados:
dltec@cap1:~$ init 1
dltec@cap1:~$ telinit 1
Os processos poderão também ser administrados através de comandos como:
# Pára o servidor de impressão CUPS
dltec@cap3:~$ /etc/init.d/cups stop
# Inicia o servidor de impressão CUPS
dltec@cap3:~$ /etc/init.d/cups start
# Recarrega o servidor de impressão CUPS
dltec@cap3:~$ /etc/init.d/cups reload
# Verifica o status do servidor de impressão CUPS
dltec@cap3:~$ /etc/init.d/cups status
Qual o Próximo Passo?
Se você gostou desse artigo e está se preparando para a prova LPI-101, recomendamos também que você leia o artigo: