tl;dr: você pode usar o kexec para encenar um upgrade in-memory do kernel sem a necessidade de uma reinicialização completa. Seu sistema irá recarregar o novo kernel on the fly e ativá-lo. Haverá um reinício de serviço de cada serviço em execução à medida que o novo kernel for carregado, mas você elimina a o carregamento completo do boot e do hardware.
Ao usar o kexec, você pode atualizar o kernel da máquina Linux em execução sem uma reinicialização completa. Tenha em mente que ainda há uma nova carga no kernel, mas é significativamente mais rápida do que fazer todo o estágio do bootloader e a fase de inicialização do hardware realizada pelo firmware do sistema (BIOS ou UEFI).
Sim, chamar isso de atualizações do kernel sem reinicializações é um grande exagero. Você ignora partes da reinicialização, porém, geralmente as partes mais lentas.
Instalando o kexec
Em uma máquina CentOS 7, as ferramentas kexec devem estar instaladas por padrão, mas se não estiverem:
$ yum install kexec-tools
Depois disso, o binário kexec deve estar disponível para você.
Instale seu novo kernel
Neste exemplo, vou atualizar um kernel do CentOS 7 antigo para o mais recente.
$ uname -r 3.10.0-229.14.1.el7
Então, agora estou executando o kernel 3.10.0-229.14.1.el7.
Para atualizar seu kernel, primeiro instale os pacotes mais recentes do kernel.
$ yum update kernel ... =================================================================================== Package Arch Version Repository Size =================================================================================== Installing: kernel x86_64 3.10.0-514.6.1.el7 updates 37 M
Isto irá instalar o
3.10.0-514.6.1.el7
Kernel na minha máquina.
Então, um resumo rápido (em novas linhas, para que você veja a diferença de versão do kernel):
Depois de instalar o novo kernel, é hora para a magia de atualização em memória kexec.
From: 3.10.0-229.14.1.el7 To: 3.10.0-514.6.1.el7 $ rpm -qa | grep kernel | sort kernel-3.10.0-229.14.1.el7.x86_64 kernel-3.10.0-514.6.1.el7.x86_64
Atualização do kernel in-memory com kexec
Como um comando de segurança, primeiramente descarregue qualquer tarefa previamente carregada no kernel. Isso é inofensivo e vai certificar de que você começa “limpo” com o seu processo de atualização.
$ kexec -u
Agora, indique o novo kernel a ser carregado. Observe que estes são os números de versão do último kernel instalado com yum, como mostrado acima.
$ kexec -l /boot/vmlinuz-3.10.0-514.6.1.el7.x86_64 \ --initrd=/boot/initramfs-3.10.0-514.6.1.el7.x86_64.img \ --reuse-cmdline
Cuidado: o próximo comando irá recarregar um novo kernel e afetará os serviços em execução!
Uma vez preparado, inicie o kexec.
$ systemctl kexec
Seu sistema irá congelar por alguns segundos, carregará o novo kernel e estará pronto.
Alguns pontos de referência
Um benchmark muito rápido e não científico para fazer um yum update kernel com e sem kexec.
Normal way, kernel upgrade + reboot: 28s Kexec way, kernel upgrade + reload: 19s
Então, você tem alguns segundos da nova carga do kernel, para grandes máquinas físicas com muita RAM, e ainda mais porque a verificação POST inteira pode ser ignorada com este método.
Aqui está uma execução lado a lado da mesma atualização do kernel. À esquerda: o fluxo do kexec que você leu acima. À direita, um clássico yum update kernel && reboot.
Observe como a VM esquerda nunca entra nas verificações do BIOS ou do POST.
Se você vai automatizar essas atualizações, dê uma olhada em alguns scripts existentes para ajudá-lo: kexec-reboot, ArchWiki no kexec.
***
Mattias Geniar faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela Redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: https://ma.ttias.be/kernel-patching-kexec-updating-centos-7-kernel-without-full-reboot/