Salta al contenuto

Come posso tornare a un kernel stabile noto dopo che un aggiornamento ha bloccato il riavvio della mia istanza EC2?

8 minuti di lettura
0

Un aggiornamento ha impedito il riavvio della mia istanza Amazon Elastic Compute Cloud (Amazon EC2). Desidero tornare a un kernel stabile.

Breve descrizione

Se hai effettuato un aggiornamento del kernel di un'istanza EC2 Linux ma ora il kernel è danneggiato, l'istanza non riesce a riavviarsi. Inoltre, non puoi utilizzare SSH per connetterti all'istanza in questione.

Per risolvere il problema, accedi al volume principale utilizzando la Console seriale EC2. Oppure crea un'istanza di ripristino temporanea, quindi rimonta il volume Amazon Elastic Block Store (Amazon EBS) sull'istanza di ripristino. Configura GNU GRUB per usare il kernel precedente, quindi riavvia l'istanza.

Risoluzione

Nota: se ricevi errori quando esegui i comandi dell'Interfaccia della linea di comando AWS (AWS CLI), consulta Risoluzione degli errori per AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.

Accedi al volume principale dell'istanza

Per accedere al volume principale, utilizza la Console seriale EC2 o un'istanza di ripristino.

Utilizza la Console seriale EC2

Prerequisiti: devi avere già configurato l'accesso alla Console seriale EC2. Se l'istanza non è raggiungibile e non hai già configurato l'accesso, devi utilizzare un'istanza di ripristino per accedere al volume principale. Inoltre, assicurati di rispettare i prerequisiti della Console seriale.

Se hai attivato la Console seriale EC2 per Linux, utilizzala per risolvere i problemi di avvio, configurazione di rete e configurazione SSH dei tipi di istanze basate su Nitro.

Puoi utilizzare la Console seriale per connetterti all'istanza senza una connessione di rete funzionante.

Prima di utilizzare la Console seriale, concedi l'accesso a livello di account AWS. Quindi crea policy AWS Identity and Access Management (AWS IAM) che garantiscano l'accesso agli utenti IAM. Ogni istanza che utilizza la Console seriale deve inoltre includere almeno un utente basato su password.

Utilizza un'istanza di ripristino

Importante: non eseguire questa procedura su un'istanza supportata da un archivio dell'istanza. La procedura di ripristino richiede l'arresto e l'avvio dell'istanza, per cui perderai i dati dell'istanza.

Per accedere al volume principale utilizzando un'istanza di ripristino, completa i seguenti passaggi:

  1. Crea uno snapshot Amazon EBS del volume principale.

  2. Arresta l'istanza interessata.

  3. Scollega il volume principale Amazon EBS (/dev/xvda or /dev/sda1) dall'istanza interessata. Annota il nome del dispositivo del volume principale.
    Nota: per identificare più facilmente il volume EBS nei passaggi successivi, contrassegnalo prima di scollegarlo. Il dispositivo principale è diverso a seconda dell'Amazon Machine Image (AMI). Ad esempio, Amazon Linux 2 (AL2) e Amazon Linux 2023 (AL2023) utilizzano /dev/xvda. Invece, Ubuntu 14, 16, 18, CentOS 7 e Red Hat Enterprise Linux (RHEL) 7.5 utilizzano /dev/sda1.

  4. Avvia un'istanza EC2 di ripristino nella stessa zona di disponibilità dello snapshot.
    Nota: controlla il codice prodotto dell'istanza. Alcuni codici prodotto richiedono l'avvio di un'istanza EC2 nello stesso tipo di sistema operativo. Ad esempio, se l'istanza EC2 interessata è un'AMI RHEL a pagamento, devi avviare un'AMI con lo stesso codice prodotto. Se hai un'istanza AL2, devi creare un'istanza di ripristino AL2 per evitare errori.

  5. Collega il volume come dispositivo secondario (/dev/sdf) all'istanza di ripristino.

  6. Utilizza SSH per connetterti all'istanza di ripristino.

  7. Per visualizzare i dispositivi disco disponibili, esegui questo comando:

    lsblk

    Esempio di output:

    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: ke istanze basate su Nitro mostrano i volumi EBS come dispositivi a blocchi NVMe con il nome del disco nvme[0-26]n1. Esempio di output di un'istanza basata su 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. Per diventare l'utente root, esegui questo comando:

    sudo -i
  9. Per montare la partizione root del volume montato su /mnt, esegui questo comando:

    mount -o nouuid /dev/xvdf1 /mnt

    Nota: sostituisci /dev/xvdf1 con la partizione root del volume. Se /mnt non esiste nella configurazione, esegui questi comandi per creare una directory di montaggio, quindi monta la partizione root nella nuova directory:

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

    Nota: se ricevi un errore quando esegui il comando mount precedente, esegui invece questo comando:

    mount /dev/xvdf1 /mnt

    Quindi utilizza la directory di montaggio per accedere ai dati dell'istanza interessata.

  10. Per montare /dev, /run, /proc e /sys dell'istanza di ripristino negli stessi percorsi del volume montato, esegui questo comando:

for m in dev proc run sys; do mount -o bind {,/mnt}/$m; done
  1. Se hai una partizione /boot separata, montala su /mnt/boot.
  2. Per passare alla directory di montaggio, esegui questo comando:
chroot /mnt

Aggiorna il kernel predefinito nel bootloader GRUB

Puoi trovare il kernel corrotto nella posizione 0 nell'elenco e l'ultimo kernel stabile nella posizione 1. Per sostituire il kernel corrotto con il kernel stabile, completa i seguenti passaggi in base alla distribuzione.

GRUB1 (Legacy GRUB) per Red Hat 6

Per sostituire il kernel corrotto con il kernel stabile nel file /boot/grub/grub.conf, esegui questo comando:

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

**GRUB2 per Ubuntu 14 LTS, 16.04 e 18.04 **

Completa i seguenti passaggi:

  1. Per sostituire la voce di menu predefinita GRUB_DEFAULT=0 corrotta con il valore GRUB_DEFAULT=saved stabile nel file /etc/default/grub, esegui questo comando:

    sed -i 's/GRUB_DEFAULT=0/GRUB_DEFAULT=saved/g' /etc/default/grub
  2. Per assicurarti che GRUB riconosca la modifica, esegui questo comando:

    update-grub

    Nota: potresti ricevere l'errore "device-mapper: reload ioctl on osprober-linux-xvdaX failed: Device or resource busy Command failed" quando ricostruisci il file di configurazione di grub. Per risolvere questo problema, aggiungi il parametro GRUB_DISABLE_OS_PROBER=true al file /etc/default/grub, quindi esegui nuovamente il comando precedente.

  3. Per assicurarti che Amazon EC2 carichi il kernel stabile al successivo riavvio, esegui questo comando:

    grub-set-default 1

**GRUB2 per RHEL 7 e AL2 **

Completa i seguenti passaggi:

  1. Per sostituire la voce di menu predefinita GRUB_DEFAULT=0 corrotta con il valore GRUB_DEFAULT-saved stabile nel file /etc/default/grub, esegui questo comando:

    sed -i 's/GRUB_DEFAULT=0/GRUB_DEFAULT=saved/g' /etc/default/grub
  2. Per aggiornare GRUB e rigenerare il file /boot/grub2/grub.cfg, esegui questo comando:

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

    Nota: potresti ricevere l'errore "device-mapper: reload ioctl on osprober-linux-xvdaX failed: Device or resource busy Command failed" quando ricostruisci il file di configurazione di grub. Per risolvere questo problema, aggiungi il parametro GRUB_DISABLE_OS_PROBER=true al file /etc/default/grub, quindi esegui nuovamente il comando precedente.

  3. Per assicurarti che Amazon EC2 carichi il kernel stabile al successivo riavvio, esegui questo comando:

    grub2-set-default 1

GRUB2 per RHEL 8 e CentOS 8 e AL2023

GRUB2 utilizza i file blscfg e le voci in /boot/loader per la configurazione di avvio invece del precedente formato grub.cfg. È consigliabile utilizzare lo strumento grubby per gestire i file blscfg e recuperare informazioni da /boot/loader/entries/. Se i file blscfg mancano o sono corrotti, grubby non mostra alcun risultato. Devi rigenerare i file per ripristinare la funzionalità.

Per aggiornare il kernel predefinito in GRUB2, completa i seguenti passaggi:

  1. Per vedere l'attuale kernel predefinito, esegui questo comando:

    grubby --default-kernel
  2. Per vedere tutti i kernel disponibili e i relativi indici, esegui questo comando:

    grubby --info=ALL

    Esempio di output:

    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"

    Annota il percorso del kernel che hai impostato come predefinito per l'istanza. Nell'esempio precedente, il percorso del kernel all'indice 2 è /boot/vmlinuz- 0-4.18.0-80.4.2.el8_1.x86_64.

  3. Per modificare il kernel predefinito dell'istanza, esegui questo comando:

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

    Nota: sostituisci 4.18.0-305.3.1.el8_4.x86_64 con il numero di versione del tuo kernel.

  4. Per verificare di aver configurato correttamente il kernel predefinito, esegui questo comando:

    grubby --default-kernel

Riavvia l'istanza

Se hai utilizzato la Console seriale EC2, ora Amazon EC2 carica il kernel stabile. Puoi riavviare l'istanza.

Se hai utilizzato un'istanza di ripristino per accedere al volume principale, completa i seguenti passaggi:

  1. Per uscire da chroot e smontare /dev, /run, /proc e /sys, esegui questo comando:

    exit
    umount /mnt/{dev,proc,run,sys,}
  2. Arresta l'istanza di ripristino.

  3. Scollega il volume principale dall'istanza di ripristino.

  4. Collega il volume principale all'istanza originale come volume principale /dev/xvda o /dev/sda1

  5. Avvia l'istanza originale.

  6. Ora Amazon EC2 carica il kernel stabile. Puoi riavviare l'istanza.

AWS UFFICIALEAggiornata 9 mesi fa