Skip to content

101.3 - Alternar runlevels/boot targets, desligar e reiniciar o sistema

Peso: 3

  • Definir o runlevel padrão e o target de boot padrão.
  • Alternar entre runlevels/targets de boot, incluindo o modo single user (usuário único).
  • Desligar e reiniciar através da linha de comando.
  • Alertar os usuários antes de mudar o runlevel/target de boot ou outro evento de sistema que acarrete uma mudança significativa.
  • Terminar apropriadamente os processos.
  • Noções de acpid.

Lista parcial de arquivos, termos e utilitários utilizados

Section titled “Lista parcial de arquivos, termos e utilitários utilizados”
  • /etc/inittab
  • shutdown
  • init
  • /etc/init.d/
  • telinit
  • systemd
  • systemctl
  • /etc/systemd
  • /usr/lib/systemd
  • wall

O Linux, seguindo a filosofia Unix, usa processos separados (daemons/serviços) para controlar funções distintas do sistema — servidor HTTP, banco de dados, firewall, etc. O conjunto de daemons ativos precisa ser gerenciável em tempo de execução, sem reiniciar o sistema. Para isso existem os gerenciadores de serviços, e este capítulo cobre três deles: SysVinit, systemd e o Upstart.

O SysVinit (os somente SysV) introduz o conceito de execução (runlevels), numerados de 0 a 6:

NívelFinalidade
0Encerramento do sistema
1/s/singleModo single-user - manutenção, sem rede
2,3,4Modo multiusuário (3 e 4 com rede; 2 raramente usado)
5Modo multiusuário com interface gráfica
6Reinicialização do sistema

O programa responsável pelo gerenciamento de níveis de execução e daemons associados é /sbin/init. Durante a inicialização do sistema, o init identifica o nível de execução solicitado, definido por parâmetro do kernel ou no arquivo /etc/inittab. Cada nível de execução pode ter diversos arquivos de serviços associados, geralmente scripts no diretório /etc/init.d/.

O arquivo /etc/inittab/ define o padrão e o que executar em cada estado.

Terminal window
id:runlevels:action:process

Principais actions

  • sysinit: Executa na inicialização, qualquer que seja o runlevel.
  • wait: Executa no runlevel dado e o init espera terminar.
  • respawn: Reinicia o processo se ele morrer.
  • ctrlaltdet: Executa quando Ctrl+Alt+Del é pressionado.

O runlevel padrão é definido pela entrada id:x:initdefault: e nunca deve ser 0 ou 6.


Exemplo de um arquivo /etc/inittab:

Terminal window
# Runlevel padrão do sistema. O campo process da linha initdefault fica vazio, só o número do runlevel importa.
# Runlevel padrão nunca pode ser 0 ou 6 (desligar/reiniciar infinitamente).
id:3:initdefault:
# Script de configuração executado durante o boot
si::sysinit:/etc/init.d/rcS
# Ação ao entrar no runlevel S (usuário único)
~:S:wait:/sbin/sulogin
# Configuração para cada nível de execuçã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
# Ação ao pressionar Ctrl+Alt+Del
ca::ctrlaltdel:/sbin/shutdown -r now
# Terminais virtuais habilitados nos runlevels 2 e 3
1:23:respawn:/sbin/getty tty1 VC linux
2:23:respawn:/sbin/getty tty2 VC linux
3:23:respawn:/sbin/getty tty3 VC linux
4:23:respawn:/sbin/getty tty4 VC linux
# No runlevel 3, também habilita terminais seriais
S0:3:respawn:/sbin/getty -L 9600 ttyS0 vt320
S1:3:respawn:/sbin/mgetty -x0 -D ttyS1

Após qualquer edição no /etc/inittab, é obrigatório rodar telinit q para recarregar a configuração sem reiniciar o sistema.

Os scripts usados pelo init ficam em /etc/init.d/.

  • Cada runlevel tem um diretório /etc/rc0.d/, /etc/rc1.d/, etc.
  • Os arquivos nesses diretórios são links simbólicos para scripts em /etc/init.d/.
  • Nomes de scripts que começam com K são serviços parados (Killed) ao entrar no runlevel.
  • Nomes de scripts que começam com S são serviços iniciados (Started) ao entrar no runlevel.
Terminal window
runlevel # mostra o runlevel atual
telinit 3 # alterna para runlevel 3
telinit q # recarrega /etc/inittab após modificá-lo
telinit 6 # reinicia o sistema
telinit 0 # desliga o sistema

Atualmente, o systemd substitui o SysV na maioria das distribuições. Em vez de runlevels, ele usa units e targets.

Units são recursos gerenciáveis pelo systemd. Tipos principais:

TipoDescrição
serviceServiços que podem ser iniciados, parados e recarregados.
socketSocket de sistemas de arquivos ou de rede.
deviceDispositivo de hardware reconhecido pelo kernel.
mountPonto de montagem no sistema de arquivos.
automountPonto de montagem automático.
targetAgrupamento de unidades (equivale aos runlevels do SysVinit).
snapshotEstado salvo do systemd.

Os arquivos de configuração ficam em /etc/systemd/system.


Correspondência entre targets e runlevels:

SysVinit Runlevelsystemd Target
0poweroff.target
1rescue.target
3multi-user.target
5graphical.target
6reboot.target

O target padrão é definido pelo link simbólico /etc/systemd/system/default.target.


Nota: /sbin/init nos sistemas com systemd é apenas um link simbólico para /lib/systemd/systemd. O PID 1 continua sendo o init, mas agora é o systemd.

O comando systemctl é utilizado para controlar as units do systemd. Este comando é usado para executar as tarefas relacionadas à ativação, desativação, execução, interrupção e monitoramento da unit.

Comandos systemctl essenciais:

Terminal window
# Gerenciar serviços
systemctl start sshd.service
systemctl stop sshd.service
systemctl restart sshd.service
systemctl status sshd.service
systemctl is-active sshd.service
# Habilitar/desabilitar na inicialização
systemctl enable sshd.service
systemctl disable sshd.service
# Alternar entre targets
systemctl isolate multi-user.target
# Definir e consultar target padrão
systemctl set-default graphical.target
systemctl get-default
# Listar units
systemctl list-unit-files --type=service
systemctl list-units --type=target
# Desligar/reiniciar
systemctl reboot
systemctl poweroff
systemctl suspend

Desenvolvido para o Ubuntu para paralelizar a inicialização dos serviços. O Ubuntu migrou para o systemd em 2015.

Os scripts de inicialização usados pelo Upstart estão localizados no diretório /etc/init/. Os serviços do sistema podem ser listados com o comando initctl list, que também mostra o estado atual dos serviços e, se disponível, seu número PID.

Terminal window
initctl list # lista os serviços do sistema
avahi-cups-reload stop/waiting
avahi-daemon start/running, process 1123
mountall-net stop/waiting
mountnfs-bootclean.sh start/running
nmbd start/running, process 3085
passwd stop/waiting
rc stop/waiting
rsyslog start/running, process 1095
tty4 start/running, process 1761
udev start/running, process 1073
upstart-udev-bridge start/running, process 1066
console-setup stop/waiting
irqbalance start/running, process 1842
plymouth-log stop/waiting
smbd start/running, process 1457
tty5 start/running, process 1764
failsafe stop/waiting

Outros comandos relevantes do Upstart:

Terminal window
start tty6 # inicia um recurso
stop tty6 # para um recurso
status tty6 # verifica o estado
initctl list # lista todos os jobs

O comando shutdown é um comando muito tradicional usado para desligar ou reiniciar o sistema. Ele funciona no SysV e no systemd.

Exemplos:

Terminal window
shutdown -h now # desliga imediatamente
shutdown -r +10 # reinicia em 10 minutos
shutdown -h 22:00 "Manutenção noturna" # Envia mensagem a todos os usuário logados
shutdown -c # cancela um shutdown agendado
  • -h: halt (desliga)
  • -r: reboot (reinicia)
  • sem opção: vai para o modo single user (usuário único).

Antes de desligar, o shutdown envia SIGTERM a todos os processos, depois SIGKILL.


O comando wall pode enviar uma mensagem para as sessões de terminal de todos os usuários logados. Para isso, o administrador do sistema só precisa fornecer um arquivo ou escrever diretamente a mensagem como um parâmetro.

Exemplo:

Terminal window
wall "O sistema será reiniciado em 5 minutos"