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:
-
Obtenha o ID do volume e o nome do dispositivo para o volume raiz da instância original.
-
Interrompa a instância original.
-
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.
-
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.
-
Use o par de chaves SSH para se conectar à instância temporária.
-
Para alterar o usuário-raiz, execute o seguinte comando:
sudo su
-
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.
-
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.
-
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.
-
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
- 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"
- 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
- Para sair e separar o volume, execute o seguinte comando:
exit; umount -fl /mnt
- 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.
- Conecte-se à instância original.