DevSecOps

8 mar, 2017

Fazendo patching do Kernel com kexec: atualizando um kernel CentOS 7 sem uma reinicialização completa

Publicidade

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/