Saltar al contenido

¿Cómo vuelvo a un kernel estable conocido después de que una actualización bloquee el reinicio de mi instancia de EC2?

9 minutos de lectura
0

Una actualización impidió el reinicio de mi instancia de Amazon Elastic Compute Cloud (Amazon EC2). Quiero volver a un kernel estable.

Descripción corta

Si has actualizado el kernel de tu instancia de EC2 de Linux pero ahora está dañado, la instancia no podrá reiniciarse. Tampoco puedes usar SSH para conectarte a la instancia afectada.

Para solucionar este problema, utiliza la consola serie de EC2 para acceder al volumen raíz. O bien, crea una instancia de rescate temporal y, a continuación, vuelve a montar tu volumen de Amazon Elastic Block Store (Amazon EBS) en la instancia de rescate. Configura tu GRUB de GNU para usar el kernel anterior y, a continuación, reinicia la instancia.

Resolución

Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulta Solución de problemas de AWS CLI. Además, asegúrate de utilizar la versión más reciente de la AWS CLI.

Acceso al volumen raíz de la instancia

Para acceder al volumen raíz, utiliza la consola serie de EC2 o una instancia de rescate.

Uso de la consola serie de EC2

Requisitos previos: Ya debes haber configurado el acceso a la consola serie de EC2. Si no puedes acceder a la instancia y aún no has configurado el acceso, debes usar una instancia de rescate para acceder al volumen raíz. Además, asegúrate de cumplir los requisitos previos de la consola serie.

Si has activado la consola serie de EC2 para Linux, úsala para los tipos de instancia basados en Nitro para solucionar problemas de arranque, configuración de red y configuración de SSH.

Puedes usar la consola serie para conectarte a la instancia sin una conexión de red activa.

Antes de utilizar la consola serie, concédele acceso en el nivel de cuenta de AWS. A continuación, crea políticas de AWS Identity and Access Management (IAM) que concedan acceso a tus usuarios de IAM. Además, cada instancia que utilice la consola serie debe incluir al menos un usuario con contraseña.

Uso de una instancia de rescate

Importante: No realices este procedimiento en una instancia respaldada por un almacén de instancias. El procedimiento de recuperación requiere detener e iniciar la instancia, por lo que perderás los datos de la instancia.

Para usar una instancia de rescate para acceder al volumen raíz, sigue estos pasos:

  1. Crea una instantánea de Amazon EBS del volumen raíz.

  2. Detén la instancia afectada.

  3. Desconecta el volumen raíz de Amazon EBS (/dev/xvda o /dev/sda1) de la instancia afectada. Anota el nombre de dispositivo de tu volumen raíz.
    Nota: Para ayudar a identificar el volumen de EBS en pasos posteriores, etiqueta el volumen antes de desconectarlo. El dispositivo raíz difiere según la imagen de máquina de Amazon (AMI). Por ejemplo, Amazon Linux 2 (AL2) y Amazon Linux 2023 (AL2023) usan /dev/xvda. Sin embargo, Ubuntu 14, 16, 18, CentOS 7 y Red Hat Enterprise Linux (RHEL) 7.5 usan /dev/sda1.

  4. Inicia una instancia de EC2 de rescate en la misma zona de disponibilidad que la instantánea.
    Nota: Comprueba el código de producto de la instancia. Algunos códigos de producto requieren que inicies una instancia de EC2 con el mismo tipo de sistema operativo (SO). Por ejemplo, si la instancia afectada es una AMI de RHEL de pago, deberás iniciar una AMI con el mismo código de producto. Si tienes una instancia de AL2, debes crear una instancia de rescate de AL2 para evitar errores.

  5. Conecta el volumen como dispositivo secundario (/dev/sdf) a la instancia de rescate.

  6. Usa SSH para conectarte a la instancia de rescate.

  7. Para ver los dispositivos de disco disponibles, ejecuta el siguiente comando:

    lsblk

    Resultado de ejemplo:

    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

    Nota: Las instancias basadas en Nitro muestran los volúmenes de EBS como dispositivos de bloque NVMe con el nombre de disco nvme[0-26]n1. Ejemplo de resultado en una instancia basada en 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 cambiar al usuario raíz, ejecuta el siguiente comando:

    sudo -i
  9. Para montar la partición raíz del volumen montado en /mnt, ejecuta el siguiente comando:

    mount -o nouuid /dev/xvdf1 /mnt

    Nota: Sustituye /dev/xvdf1 por la partición raíz del volumen. Si /mnt no existe en tu configuración, ejecuta los siguientes comandos para crear un directorio de montaje y, a continuación, monta la partición raíz en el nuevo directorio:

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

    Nota: Si recibes un error al ejecutar el comando mount anterior, ejecuta el siguiente comando en su lugar:

    mount /dev/xvdf1 /mnt

    A continuación, usa el directorio de montaje para acceder a los datos de la instancia afectada.

  10. Para montar /dev, /run, /proc y /sys de la instancia de rescate en las mismas rutas que el volumen montado, ejecuta el siguiente comando:

for m in dev proc run sys; do mount -o bind {,/mnt}/$m; done
  1. Si tienes una partición /boot independiente, móntala en /mnt/boot.
  2. Para cambiar al directorio de montaje, ejecuta el siguiente comando:
chroot /mnt

Actualización del kernel predeterminado en el gestor de arranque GRUB

Puedes encontrar el kernel dañado en la posición 0 de la lista y el último kernel estable en la posición 1. Para sustituir el kernel dañado por el kernel estable, sigue los pasos siguientes según tu distribución.

GRUB1 (GRUB heredado) para Red Hat 6

Para sustituir el kernel dañado por el kernel estable del archivo /boot/grub/grub.conf, ejecuta el siguiente comando:

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

GRUB2 para Ubuntu 14 LTS, 16.04 y 18.04

Sigue estos pasos:

  1. Para sustituir la entrada dañada del menú predeterminado GRUB_DEFAULT=0 por el valor GRUB_DEFAULT=saved estable en el archivo /etc/default/grub, ejecuta el siguiente comando:

    sed -i 's/GRUB_DEFAULT=0/GRUB_DEFAULT=saved/g' /etc/default/grub
  2. Para asegurarte de que GRUB reconoce el cambio, ejecuta el siguiente comando:

    update-grub

    Nota: Es posible que recibas el error «device-mapper: reload ioctl on osprober-linux-xvdaX failed: Device or resource busy Command failed» al reconstruir el archivo de configuración de grub. Para resolver este problema, agrega el parámetro GRUB_DISABLE_OS_PROBER=true al archivo /etc/default/grub y vuelve a ejecutar el comando anterior.

  3. Para asegurarte de que Amazon EC2 carga el kernel estable la próxima vez que se reinicie, ejecuta el siguiente comando:

    grub-set-default 1

GRUB2 para RHEL 7 y AL2

Sigue estos pasos:

  1. Para sustituir la entrada corrupta de menú predeterminado de GRUB_DEFAULT=0 por el valor estable de GRUB_DEFAULT-saved en el archivo /etc/default/grub, ejecuta el siguiente comando:

    sed -i 's/GRUB_DEFAULT=0/GRUB_DEFAULT=saved/g' /etc/default/grub
  2. Para actualizar GRUB y regenerar el archivo /boot/grub2/grub.cfg, ejecuta el siguiente comando:

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

    Nota: Es posible que recibas el error «device-mapper: reload ioctl on osprober-linux-xvdaX failed: Device or resource busy Command failed» al reconstruir el archivo de configuración de grub. Para resolver este problema, agrega el parámetro GRUB_DISABLE_OS_PROBER=true al archivo /etc/default/grub y vuelve a ejecutar el comando anterior.

  3. Para asegurarte de que Amazon EC2 carga el kernel estable la próxima vez que se reinicie, ejecuta el siguiente comando:

    grub2-set-default 1

GRUB2 para RHEL 8 y CentOS 8, y AL2023

GRUB2 usa archivos blscfg y entradas en /boot/loader para la configuración de arranque, en lugar del formato grub.cfg anterior. Se recomienda usar la herramienta grubby para administrar los archivos blscfg y recuperar información de /boot/loader/entries/. Si los archivos blscfg faltan o están dañados, grubby no muestra ningún resultado. Debes volver a generar los archivos para recuperar la funcionalidad.

Para actualizar el kernel predeterminado en GRUB2, sigue estos pasos:

  1. Para ver el kernel predeterminado actual, ejecuta el siguiente comando:

    grubby --default-kernel
  2. Para ver todos los kernels disponibles y sus índices, ejecuta el siguiente comando:

    grubby --info=ALL

    Resultado de ejemplo:

    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"

    Anota la ruta del kernel que configuraste como predeterminada para tu instancia. En el ejemplo anterior, la ruta del kernel en el índice 2 es /boot/vmlinuz- 0-4.18.0-80.4.2.el8_1.x86_64.

  3. Para cambiar el kernel predeterminado de la instancia, ejecuta el siguiente comando:

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

    Nota: Sustituye 4.18.0-305.3.1.el8_4.x86_64 por el número de versión de tu kernel.

  4. Para comprobar que has configurado correctamente el kernel predeterminado, ejecuta el siguiente comando:

    grubby --default-kernel

Reinicio de la instancia

Si has usado la consola serie de EC2, Amazon EC2 ahora carga el kernel estable. Puedes reiniciar la instancia.

Si has usado una instancia de rescate para acceder al volumen raíz, sigue estos pasos:

  1. Para salir de chroot y desmontar /dev, /run, /proc y /sys, ejecuta el siguiente comando:

    exit
    umount /mnt/{dev,proc,run,sys,}
  2. Detén la instancia de rescate.

  3. Desconecta el volumen raíz de la instancia de rescate.

  4. Conecta el volumen raíz a la instancia original como volumen raíz /dev/xvda o /dev/sda1.

  5. Inicia la instancia original.

  6. Amazon EC2 ahora carga el kernel estable. Puedes reiniciar la instancia.

OFICIAL DE AWSActualizada hace 8 meses