Kexec: Reiniciando sem Reiniciar

A ferramenta kexec permite reiniciar o computador sem reiniciá-lo propriamente dito. Entenda como funciona este recurso curioso do Linux!


| Se você apoia nosso site, desative o AdBlock quando visitá-lo, inclusive em Mobile!
Os anúncios são poucos e não invasivos. Se quiser contribuir com nosso trabalho, clique em qualquer banner de sua preferência, exceto dos Parceiros. 
Mais detalhes clicando aqui.


Publicação revisada e ampliada em 31/10/2021, porque o tutorial estava obsoleto e o comando não estava funcionando adequadamente!

1. Introdução

Como já sabem, o Kernel é aquilo que faz um sistema gerenciar um hardware. – Mais detalhes aqui – E quando você tem um Kernel aberto como o Linux, você pode fazer coisas bem curiosas, por exemplo, reiniciar o sistema sem necessariamente reiniciar o hardware!

2. Kexec-Tools

Desenvolvido originalmente pra servidores cujo tempo de POST passa dos 5-8 minutos devido às inúmeras verificações de hardware que são feitas. Assim, manutenções e reinícios podem ser feitos sem problemas utilizando o método Kexec, poupando tempo dos administradores de sistema.

Se você possui um computador antigo com algum problema de hardware que faz o POST demorar, o Kexec pode aliviar seu problema permitindo reinícios mais rápidos; uma vez que o hardware já está ligado e verificado, somente o Linux vai reiniciar.

Esse método também é útil pra trocar de kernel ou mesmo aplicar um novo recém instalado.

Tipica tela de POST (Power-On Self-Test) de placas mãe da American Megatrends

De forma simples, o kexec funciona assim:

  • O serviço do Kexec copia o novo kernel para a memória – Ou o kernel atualmente instalado, para reiniciar somente.
  • Move a imagem do kernel para o espaço de memória dinâmico
  • Copia a imagem do kernel sobre o destino real, sobrescrevendo o kernel na memória no espaço destinado
  • Iniciando o novo kernel, que por consequência iniciará o primeiro Daemon – systemd ou init

2.1 LivePatch? Não.

Alguns podem perguntar:

  • Esse é o esquema do LivePatch dos Ubuntus, que permite trocar o kernel sem reiniciar, que a Canonical disponibiliza para servidores?

Não. Esse esquema ainda faz o reboot, porém apenas a nível de software.

O LivePatch, que será o tema de uma publicação futura dedicada aqui no site, é um processo mais complexo: Ele permite trocar o kernel em execução, sem qualquer reboot! Os processos de um kernel são todos trocados pelos gerenciados por outro, assim como os drivers e bibliotecas, tudo em tempo real. – O que torna o LivePatch ainda mais interessante que o Kexec, uma solução mais moderna e mais robusta. Proprietária, para deixar claro, licenciada e com limitações de uso específicas para uso civil.

4. Instalação

O pacote está nativo nas distribuições Linux e pode ser instalado com o seguinte comando:

Para Ubuntu, Debian e derivados:

$ sudo apt install kexec-tools

Para ArchLinux:

$ sudo pacman -S kexec-tools

5. Pormenores e Funcionamento

Infelizmente o Kexec possui problemas de compatibilidade com o SystemD, o daemon principal da maioria das distros atuais. Esses problemas fazem com que o kexec não substitua o comando reboot tradicional da máquina. Para tal, faça o seguinte:

Caso seu sistema utilize SysVInit, apenas responda Sim á pergunta. Para os demais usuários das demais distros, diga Não.

Uma vez instalado, edite o arquivo /etc/default/kexec como root e altere as 2 linhas:

# Load a kexec kernel (true/false)
LOAD_KEXEC=false

# Load the default kernel from grub config (true/false)
USE_GRUB_CONFIG=false

Troque false para true, em ambas linhas!

Salve e reinicie o sistema 1x normalmente.
Quando o sistema voltar, se seu sistema utiliza a base SysVInit poderá testar o Kexec com este comando:

$ sudo systemctl start kexec.target

O sistema reiniciará imediatamente utilizando o kexec, sem passar pelo POST!

5.1 SystemD

Quem usa SystemD – a maioria – precisa fazer uns passos a mais.
Primeiro, peguei o conteúdo de /proc/cmdline:

$ cat /proc/cmdline

Copie para algum lugar e guarde a saída do comando! Aqui para mim, foi esta:

BOOT_IMAGE=/@/boot/vmlinuz-5.13.0-20-generic root=UUID=be83192c-8e4f-423f-bc93-6582875d487d ro rootflags=subvol=@ quiet rd.udev.log_priority=3 loglevel=3 rd.systemd.show_status=auto mitigations=off

Você vai digitar este código:

$ sudo kexec -l /boot/vmlinuz --initrd=/boot/initrd.img --command-line="X"

Atento que você deve se certificar da real localização do seu vmlinuz (normalmente em / ou /boot), localização do initrd (também em / ou /boot, podendo estar com ou sem o .img no final do nome do arquivo) e por fim trocando o X pela linha adquirida com /proc/cmdline!

Aqui, no meu caso, ficou assim:

sudo kexec -l /boot/vmlinuz –initrd=/boot/initrd.img –command-line=”BOOT_IMAGE=/@/boot/vmlinuz-5.13.0-20-generic root=UUID=be83192c-8e4f-423f-bc93-6582875d487d ro rootflags=subvol=@ quiet rd.udev.log_priority=3 loglevel=3 rd.systemd.show_status=auto mitigations=off”

Dê Enter. Após alguns segundos, os parâmetros estarão carregados dentro do Kexec.
Para executar o reinício de software, faça o comando:

$ sudo kexec -e

Infelizmente estas opções não são lidas pelo /etc/default/kexec pelo SystemD.
Portanto, sempre que for executá-lo, você precisará das 2 linhas de comando acima.
Dessa forma genérica ele sempre vai pegar o último kernel instalado no sistema. Se quiser especificar um kernel instalado, troque o nome dele em vmlinuz para algo como vmlinuz-5.13.0-19-generic, conforme consta em seu diretório /boot.

6. Mais opções!


Além disso, caso seja um usuário com conhecimento mais profundo que possua dual boot com Windows, poderá iniciar o Linux, reiniciar via Kexec e subir o Windows imediatamente depois, seguindo estes parâmetros (ajuste conforme sua tabela de particionamento de dual boot):

$ sudo kexec -l grub.exe –command-line="–config-file=chainloader (hd0,0)+1;rootnoverify (hd0);boot"

$ sudo kexec -e

7. Problemas

Existem casos em que o Kexec pode falhar. Entre eles, destaco:

  • Sistemas com placas de vídeo dedicadas da AMD, especialmente da linha VEGA.

Após o reinício desse modo, provavelmente o driver da GPU NVIDIA pode não funcionar corretamente.
Não verifiquei problemas com os módulos do VirtualBox.

Caso verifique problemas não listados, poderá adicionar esses parâmetros ao kexec na sessão cmdline da linha:

  • acpi=off
  • acpi_rsdp

Exemplo:

sudo kexec -l /boot/vmlinuz –initrd=/boot/initrd.img –command-line=”BOOT_IMAGE=/@/boot/vmlinuz-5.13.0-20-generic root=UUID=be83192c-8e4f-423f-bc93-6582875d487d ro rootflags=subvol=@ quiet rd.udev.log_priority=3 loglevel=3 rd.systemd.show_status=auto mitigations=off acpi=off”

Semelhante ao GRUB em /etc/default/grub, o que for passado aqui será executado pelo kexec após o reinicio virtual.

Outro exemplo de problema é o cmdline estar incorretamente preenchido, causando um congelamento do sistema e uma tela preta após executar o kexec. Neste caso você não tem muita escolha a não ser reiniciar seu computador forçadamente.

8. Conclusão

É um recurso relativamente simples que auxilia quem tiver problemas com POST demorado, seja uma máquina antiga ou um mainframe. De todo modo não deixa de ser um método diferente e interessante de controlar o computador, reiniciando o sistema sem passar pelo POST do hardware!

#UrbanCompassPony

Deixe um comentário