Ir para o conteúdo

Como faço para reverter para um kernel estável conhecido depois que uma atualização bloqueia a reinicialização da minha instância do EC2?

9 minuto de leitura
0

Uma atualização impediu a reinicialização da minha instância Amazon Elastic Compute Cloud (Amazon EC2). Eu quero reverter para um kernel estável.

Breve descrição

Se você fez uma atualização do kernel para sua instância Linux do EC2, mas o kernel agora está corrompido, a instância não pode ser reinicializada. Você também não pode usar o SSH para se conectar à instância afetada.

Para solucionar esse problema, use o console de série do EC2 para acessar seu volume raiz. Ou crie uma instância de resgate temporária e, em seguida, remonte seu volume do Amazon Elastic Block Store (Amazon EBS) na instância de resgate. Configure seu GNU GRUB para usar o kernel anterior e reinicialize a instância.

Resolução

Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solução de problemas da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.

Acesse o volume raiz da instância

Para acessar o volume raiz, use o console de série do EC2 ou uma instância de recuperação.

Use o Console de Série do EC2

Pré-requisitos: Você já deve ter configurado o acesso ao Console de Série do EC2. Se sua instância estiver inacessível e você ainda não tiver configurado o acesso, use uma instância de resgate para acessar o volume raiz. Além disso, certifique-se de seguir os pré-requisitos do console serial.

Se você ativou o Console de Série do EC2 para Linux, use-o para tipos de instância baseados em Nitro para solucionar problemas de inicialização, configuração de rede e configuração de SSH.

É possível usar o console serial para se conectar à sua instância sem uma conexão de rede ativa.

Antes de usar o console serial, conceda a ele acesso no nível da conta da AWS. Em seguida, crie políticas do AWS Identity and Access Management (AWS IAM) que concedam acesso aos seus usuários do IAM. Todas as instâncias que usam o console de série devem incluir pelo menos um usuário baseado em senha.

Use uma instância de resgate

Importante: não execute esse procedimento em uma instância com suporte de armazenamento de instâncias. O procedimento de recuperação exige a interrupção e o início da instância, portanto, você perderá os dados da instância.

Para usar uma instância de recuperação para acessar o volume raiz, conclua as seguintes etapas:

  1. Crie um snapshot do Amazon EBS do volume raiz.

  2. Interrompa a instância afetada.

  3. Separe o volume raiz do Amazon EBS (/dev/xvda ou /dev/sda1) da instância afetada. Anote o nome do dispositivo do seu volume raiz.
    Observação: para ajudar a identificar o volume do EBS em etapas posteriores, marque o volume antes de separá-lo. O dispositivo raiz difere de acordo com a imagem de máquina da Amazon (AMI). Por exemplo, o Amazon Linux 2 (AL2) e o Amazon Linux 2023 (AL2023) usam /dev/xvda. No entanto, Ubuntu 14, 16, 18, CentOS 7 e Red Hat Enterprise Linux (RHEL) 7.5 usam /dev/sda1.

  4. Execute uma instância do EC2 de resgate na mesma Zona de Disponibilidade do seu snapshot.
    Observação: verifique o código do produto da sua instância. Alguns códigos de produto exigem que você execute uma instância do EC2 no mesmo tipo de sistema operacional (SO). Por exemplo, se a instância afetada for uma AMI paga do RHEL, você deverá iniciar uma AMI com o mesmo código de produto. Se você tiver uma instância do AL2, deverá criar uma instância de recuperação do AL2 para evitar erros.

  5. Anexe o volume como um dispositivo secundário (/dev/sdf) à instância de resgate.

  6. Use SSH para se conectar à instância de resgate.

  7. Para visualizar seus dispositivos de disco disponíveis, execute o seguinte comando:

    lsblk

    Exemplo de saída:

    NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    xvda    202:0     0   15G  0 disk
    └─xvda1 202:1     0   15G  0 part /
    xvdf    202:0     0   15G  0 disk
        └─xvdf1 202:1 0   15G  0 part

    Observação: instâncias baseadas em Nitro mostram volumes do EBS como dispositivos de bloco NVMe com o nome de disco nvme[0-26]n1. Exemplo de saída em uma instância baseada em Nitro:

    NAME           MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    nvme0n1        259:0    0    8G  0 disk
    └─nvme0n1p1    259:1    0    8G  0 part /
    └─nvme0n1p128  259:2    0    1M  0 part
    nvme1n1        259:3    0  100G  0 disk
    └─nvme1n1p1    259:4    0  100G  0 part /
  8. Para se tornar o usuário-raiz, execute o seguinte comando:

    sudo -i
  9. Para montar a partição raiz do volume montado em /mnt, execute o seguinte comando:

    mount -o nouuid /dev/xvdf1 /mnt

    Observação: substitua /dev/xvdf1 pela partição raiz do seu volume. Se /mnt não existir em sua configuração, execute os seguintes comandos para criar um diretório de montagem e, em seguida, monte a partição raiz no novo diretório:

    mkdir /mnt
    mount -o nouuid /dev/xvdf1 /mnt

    Observação: se você receber um erro ao executar o comando de montagem anterior, execute o seguinte comando em vez disso:

    mount /dev/xvdf1 /mnt

    Em seguida, use o diretório de montagem para acessar os dados da instância afetada.

  10. Para montar /dev, /run, /proc e /sys da instância de resgate nos mesmos caminhos do volume montado, execute o seguinte comando:

for m in dev proc run sys; do mount -o bind {,/mnt}/$m; done
  1. Se você tiver uma partição /boot separada, monte-a em /mnt/boot.
  2. Para entrar no diretório de montagem, execute o seguinte comando:
chroot /mnt

Atualize o kernel padrão no carregador de inicialização GRUB

É possível encontrar o kernel corrompido na posição 0 na lista e o último kernel estável na posição 1. Para substituir o kernel corrompido pelo kernel estável, conclua as etapas a seguir com base na sua distribuição.

GRUB1 (GRUB legado) para Red Hat 6

Para substituir o kernel corrompido pelo kernel estável no arquivo /boot/grub/grub.conf, execute o seguinte comando:

sed -i '/^default/ s/0/1/' /boot/grub/grub.conf

GRUB2 para Ubuntu 14 LTS, 16.04 e 18.04

Conclua as seguintes etapas:

  1. Para substituir a entrada de menu padrão do GRUB_DEFAULT=0 corrompida pelo valor estável GRUB_DEFAULT=saved no arquivo /etc/default/grub, execute o seguinte comando:

    sed -i 's/GRUB_DEFAULT=0/GRUB_DEFAULT=saved/g' /etc/default/grub
  2. Para garantir que o GRUB reconheça a alteração, execute o seguinte comando:

    update-grub

    Observação: você pode receber o erro “device-mapper: reload ioctl on osprober-linux-xvdaX failed: Device or resource busy Command failed” error when you rebuild the grub configuration file. Para resolver esse problema, adicione o parâmetro GRUB_DISABLE_OS_PROBER=true ao arquivo /etc/default/grub e execute novamente o comando anterior.

  3. Para garantir que o Amazon EC2 carregue o kernel estável na próxima reinicialização, execute o seguinte comando:

    grub-set-default 1

GRUB2 para RHEL 7 e AL2

Conclua as seguintes etapas:

  1. Para substituir a entrada de menu padrão do GRUB_DEFAULT=0 corrompida pelo valor estável do GRUB_DEFAULT-saved no arquivo /etc/default/grub, execute o seguinte comando:

    sed -i 's/GRUB_DEFAULT=0/GRUB_DEFAULT=saved/g' /etc/default/grub
  2. Para atualizar o GRUB para regenerar o arquivo /boot/grub2/grub.cfg, execute o seguinte comando:

    grub2-mkconfig -o /boot/grub2/grub.cfg

    Observação: você pode receber o erro “device-mapper: reload ioctl on osprober-linux-xvdaX failed: Device or resource busy Command failed” error when you rebuild the grub configuration file. Para resolver esse problema, adicione o parâmetro GRUB_DISABLE_OS_PROBER=true ao arquivo /etc/default/grub e execute novamente o comando anterior.

  3. Para garantir que o Amazon EC2 carregue o kernel estável na próxima reinicialização, execute o seguinte comando:

    grub2-set-default 1

GRUB2 para RHEL 8 e CentOS 8 e AL2023

O GRUB2 usa arquivos e entradas blscfg em /boot/loader para a configuração de inicialização, em vez do formato grub.cfg anterior. É uma prática recomendada usar a ferramenta grubby para gerenciar os arquivos blscfg e recuperar informações do /boot/loader/entries/. Se os arquivos blscfg estiverem ausentes ou corrompidos, o grubby não mostrará nenhum resultado. Você deve regenerar os arquivos para recuperar a funcionalidade.

Para atualizar o kernel padrão no GRUB2, conclua as seguintes etapas:

  1. Para ver o kernel padrão atual, execute o seguinte comando:

    grubby --default-kernel
  2. Para ver todos os kernels disponíveis e seus índices, execute o seguinte comando:

    grubby --info=ALL

    Exemplo de saída:

    root@ip-172-31-29-221 /]# grubby --info=ALLindex=0
    kernel="/boot/vmlinuz-4.18.0-305.el8.x86_64"
    args="ro console=ttyS0,115200n8 console=tty0 net.ifnames=0 rd.blacklist=nouveau nvme_core.io_timeout=4294967295 crashkernel=auto $tuned_params"
    root="UUID=d35fe619-1d06-4ace-9fe3-169baad3e421"
    initrd="/boot/initramfs-4.18.0-305.el8.x86_64.img $tuned_initrd"
    title="Red Hat Enterprise Linux (4.18.0-305.el8.x86_64) 8.4 (Ootpa)"
    id="0c75beb2b6ca4d78b335e92f0002b619-4.18.0-305.el8.x86_64"
    index=1
    kernel="/boot/vmlinuz-0-rescue-0c75beb2b6ca4d78b335e92f0002b619"
    args="ro console=ttyS0,115200n8 console=tty0 net.ifnames=0 rd.blacklist=nouveau nvme_core.io_timeout=4294967295 crashkernel=auto"
    root="UUID=d35fe619-1d06-4ace-9fe3-169baad3e421"
    initrd="/boot/initramfs-0-rescue-0c75beb2b6ca4d78b335e92f0002b619.img"
    title="Red Hat Enterprise Linux (0-rescue-0c75beb2b6ca4d78b335e92f0002b619) 8.4 (Ootpa)"
    id="0c75beb2b6ca4d78b335e92f0002b619-0-rescue"
    index=2
    kernel="/boot/vmlinuz-4.18.0-305.3.1.el8_4.x86_64"
    args="ro console=ttyS0,115200n8 console=tty0 net.ifnames=0 rd.blacklist=nouveau nvme_core.io_timeout=4294967295 crashkernel=auto $tuned_params"
    root="UUID=d35fe619-1d06-4ace-9fe3-169baad3e421"
    initrd="/boot/initramfs-4.18.0-305.3.1.el8_4.x86_64.img $tuned_initrd"
    title="Red Hat Enterprise Linux (4.18.0-305.3.1.el8_4.x86_64) 8.4 (Ootpa)"
    id="ec2fa869f66b627b3c98f33dfa6bc44d-4.18.0-305.3.1.el8_4.x86_64"

    Anote o caminho do kernel que você definiu como padrão para sua instância. No exemplo anterior, o caminho do kernel no índice 2 é /boot/vmlinuz- 0-4.18.0-80.4.2.el8_1.x86_64.

  3. Para alterar o kernel padrão da instância, execute o seguinte comando:

    grubby --set-default=/boot/vmlinuz-4.18.0-305.3.1.el8_4.x86_64

    Observação: substitua 4.18.0-305.3.1.el8_4.x86_64 pelo número da versão do seu kernel.

  4. Para verificar se você configurou corretamente o kernel padrão, execute o seguinte comando:

    grubby --default-kernel

Reinicialize a instância

Se você usou o console de série do EC2, o Amazon EC2 agora carrega o kernel estável. É possível reinicializar a instância.

Se você usou uma instância de recuperação para acessar o volume raiz, conclua as seguintes etapas:

  1. Para sair do chroot e desmontar /dev, /run, /proc e /sys, execute o seguinte comando:

    exit
    umount /mnt/{dev,proc,run,sys,}
  2. Interrompa a instância de resgate.

  3. Separe o volume raiz da instância de resgate.

  4. Anexe o volume raiz à instância original como volume raiz /dev/xvda ou /dev/sda1

  5. Inicie a instância original.

  6. O Amazon EC2 agora carrega o kernel estável. É possível reinicializar a instância.

AWS OFICIALAtualizada há 6 meses