Ir para o conteúdo

Como resolvo o erro “Kernel panic - not syncing” na minha instância do EC2?

6 minuto de leitura
0

Quero atualizar o kernel ou reinicializar minha instância Linux do Amazon Elastic Compute Cloud (Amazon EC2) devido à falta de módulos initramfs ou kernel. No entanto, recebo o erro “Kernel panic - not syncing”.

Breve descrição

O erro “Kernel panic - not sync” ocorre quando o dispositivo ou endereço não existe. Para resolver esse problema, execute uma instância temporária e, em seguida, conecte o disco raiz com defeito como uma unidade secundária para realizar o diagnóstico.

Importante: antes de parar e iniciar sua instância, execute as seguintes ações:

Observação: além disso, quando você interrompe ou executa uma instância, o endereço IP público da instância muda. Ao rotear tráfego externo para sua instância, é uma prática recomendada usar um endereço IP elástico em vez de um endereço IP público.

Para mais informações, acesse O que acontece quando você interrompe uma instância.

Resolução

Observação: as etapas de resolução a seguir valem somente para Amazon Linux 2, Amazon Linux 2023, Fedora 16 e versões posteriores, bem como Red Hat Enterprise Linux (RHEL) 7 e versões posteriores.

Para anexar o disco raiz a uma instância temporária, conclua as seguintes etapas:

  1. Obtenha o ID do volume e o nome do dispositivo para o volume raiz da instância original.

  2. Interrompa a instância original.

  3. Execute uma instância temporária a partir de uma imagem de máquina da Amazon (AMI) com a mesma versão do sistema operacional (SO) Linux na mesma zona de disponibilidade.

  4. Separe o volume raiz da instância original e anexe-o à instância temporária como um volume secundário. Anote o nome do dispositivo de volume.

  5. Use o par de chaves SSH para se conectar à instância temporária.

  6. Para alterar o usuário-raiz, execute o seguinte comando:

    sudo su
  7. Para identificar o nome e a partição do dispositivo de blocos, execute o seguinte comando na instância temporária:

    lsblk

    Exemplo de saída:

    NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    xvda    202:0    0    8G  0 disk
    └─xvda1 202:1    0    8G  0 part /
    xvdf    202:80   0  101G  0 disk
    └─xvdf1 202:81   0  101G  0 part
    xvdg    202:80   0   10G  0 disk

    Este exemplo usa uma instância XEN com drivers blkfront.

  8. Se você usar um volume particionado, execute o seguinte comando para montar a partição /dev/xvdf1 em vez do dispositivo /dev/xvdf:

    mount -o nouuid  /dev/xvdf1 /mnt

    Observação: tanto /dev/xvda quanto /dev/xvdf são volumes particionados, mas /dev/xvdg não.
    Se você usa uma instância criada no AWS Nitro System, o nome do dispositivo de volume é semelhante a /dev/nvme[0-26]n1. Para montar a partição no diretório /mnt, execute o seguinte comando:

    mount -o nouuid  /dev/nvme1n1p1 /mnt

    Observação: substitua nvme1n1p1 pelo nome do dispositivo de blocos que você identificou na etapa 7. Para obter mais informações, consulte Nomes de dispositivos para volumes em instâncias do Amazon EC2.

  9. Para criar um ambiente chroot no diretório /mnt, execute o seguinte comando:

    for i in dev proc sys run; do mount -o bind /$i /mnt/$i; done; chroot /mnt

    Este exemplo monta por associação os diretórios /dev, /proc, /sys e /run do sistema de arquivos raiz original. Essa configuração permite que processos executados dentro do ambiente chroot acessem os diretórios do sistema.

  10. Para criar um backup do initramfs no diretório /, execute o seguinte comando:

for file in /boot/initramfs-*.img; do cp "${file}" "/$(basename "$file")_$(date +%Y%m%d)"; done
  1. Para listar o kernel padrão, execute o seguinte comando:
grubby --default-kernel

Exemplo de saída:

/boot/vmlinuz-5.15.156-102.160.amzn2.x86_64

A saída anterior lista os kernels que inicializam na inicialização. Para listar os kernels e o initramfs no diretório de inicialização, execute o seguinte comando:

 ls -lh /boot/vmlinuz* && ls -lh /boot/initr*

Exemplo de saída:

-rwxr-xr-x. 1 root root 9.7M Apr 23 20:37 /boot/vmlinuz-5.10.215-203.850.amzn2.x86_64-rwxr-xr-x. 1 root root 9.9M Apr 23 17:00 /boot/vmlinuz-5.15.156-102.160.amzn2.x86_64
-rw-------. 1 root root 12M May 3 23:45 /boot/initramfs-5.10.215-203.850.amzn2.x86_64.img
-rw-------. 1 root root 9.8M May 14 08:03 /boot/initramfs-5.15.156-102.160.amzn2.x86_64.img

Observe os arquivos do kernel vmlinuz que têm arquivos initramfs correspondentes. Para recriar o initramfs, execute o seguinte comando:

dracut --force --verbose /boot/initramfs-kernelVersion.img kernelVersion

Observação: substitua kernelVersion pela versão mais recente do kernel. Para determinar se a instância está inicializando em UEFI ou BIOS, execute o seguinte comando:

boot_mode=$(ls /sys/firmware/efi/efivars >/dev/null 2>&1 && echo "EFI" || echo "BIOS"); echo "Boot mode detected: $boot_mode"
  1. Atualize a configuração do grub. Se sua instância inicializar no BIOS, execute o seguinte comando:
grub2-mkconfig -o /boot/grub2/grub.cfg

Observação: ao executar o comando anterior, você pode receber a mensagem de erro “device-mapper: reload ioctl on osprober-linux-xvda2 (253:0) failed: Device or resource busy Command failed”. Para resolver esse problema, adicione o parâmetro GRUB_DISABLE_OS_PROBER=true ao arquivo /etc/default/grub e execute o comando novamente.
Se sua instância inicializar em UEFI, execute os seguintes comandos com base no seu SO.
UEFI:
Amazon Linux 2 e Amazon Linux 2023:

grub2-mkconfig -o /boot/efi/EFI/amzn/grub.cfg

Fedora 16+:

grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg

Red Hat 7+:

grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
  1. Para sair e separar o volume, execute o seguinte comando:
exit; umount -fl /mnt
  1. Separe o volume secundário da instância temporária e anexe-o à instância original como dispositivo raiz. Use o nome do dispositivo que você anotou na etapa 4.
  2. Conecte-se à instância original.
AWS OFICIALAtualizada há um ano