La macchina virtuale Linux si avvia al salvataggio di GRUB

Si applica a: ✔️ macchine virtuali di Linux

Nota

CentOS a cui si fa riferimento in questo articolo è una distribuzione Linux e raggiungerà End Of Life (EOL). Valutare le proprie esigenze e pianificare di conseguenza. Per altre informazioni, vedere Indicazioni sulla fine della vita di CentOS.

Sommario

Questo articolo esamina diverse condizioni che causano problemi di salvataggio di GRUB e fornisce indicazioni per la risoluzione dei problemi.

Durante il processo di avvio, il boot loader prova a individuare il kernel Linux e a passare il controllo del processo di avvio. Se questo trasferimento non può essere eseguito, la macchina virtuale (VM) entra in una console di ripristino di GRUB. Il prompt della console di ripristino GRUB non viene visualizzato nel log della console seriale Azure, ma può essere visualizzato nello screenshot della diagnostica di avvio Azure.

Identifica il problema di salvataggio di GRUB

Visualizzare uno screenshot della diagnostica di avvio nella pagina di diagnostica di avvio del portale di Azure. Questa schermata aiuterà a diagnosticare il problema di ripristino di GRUB e determinare se un errore di avvio causa il problema.

Ecco un esempio di un problema di salvataggio di GRUB:

error: file '/boot/grub2/i386-pc/normal.mod' not found.  
Entering rescue mode...  
grub rescue>

Risolvi i problemi di salvataggio di GRUB offline

  1. Per risolvere un problema di salvataggio di GRUB, è necessaria una VM di salvataggio/riparazione. Utilizza i comandi di riparazione vm per creare una VM di riparazione a cui è collegata una copia del disco del sistema operativo della VM interessata. Montare la copia dei file system del sistema operativo nella macchina virtuale di ripristino utilizzando chroot.

    Nota

    In alternativa, è possibile creare manualmente una macchina virtuale di ripristino usando il portale di Azure. Per ulteriori informazioni, consulta Risolvi i problemi di una VM Linux attaccando il disco del sistema operativo a una VM di ripristino usando il portale di Azure.

  2. Identificare il problema di salvataggio di GRUB. Quando incontri uno dei seguenti problemi di salvataggio di GRUB, vai alla sezione corrispondente per risolverlo:

  3. Dopo che il problema di salvataggio di GRUB è stato risolto, eseguire le seguenti azioni:

    1. Smontare la copia dei file system dalla macchina virtuale di salvataggio/ripristino.

    2. Eseguire il comando az vm repair restore per scambiare il disco del sistema operativo ripristinato con il disco del sistema operativo originale della macchina virtuale. Per altre informazioni, vedere il Passaggio 5 in Ripara una VM Linux utilizzando i comandi di riparazione della macchina virtuale di Azure.

    3. Controllare se la macchina virtuale può iniziare esaminando la console seriale Azure o provando a connettersi alla macchina virtuale.

  4. Se l'intera /boot partizione o altri contenuti importanti mancano e non possono essere ripristinati, è consigliabile ripristinare la macchina virtuale da un backup. Per ulteriori informazioni, vedere come ripristinare i dati delle macchine virtuali Azure nel portale di Azure.

Vedere le sezioni seguenti per errori dettagliati, possibili cause e soluzioni.

Nota

Nei comandi menzionati nelle sezioni seguenti, sostituire /dev/sdX con il dispositivo disco del sistema operativo (OS) corrispondente.

Reinstallare GRUB e rigenerare il file di configurazione di GRUB, usando Azure Ripristino Automatico Linux

Azure gli script di ripristino automatico di Linux (ALAR) fanno parte dell'estensione di ripristino della macchina virtuale descritta in Use Azure Linux Auto Repair (ALAR) per correggere una macchina virtuale Linux. ALAR copre l'automazione di più scenari di riparazione, inclusi i problemi di GRUB rescue.

Gli script ALAR usano l'estensione repair-button di ripristino per risolvere i problemi grub specificando --button-command grubfix per le macchine virtuali di prima generazione o --button-command efifix per le macchine virtuali di seconda generazione. Questo parametro attiva il ripristino automatico. Implementare i comandi seguenti per automatizzare la correzione di errori GRUB comuni reinstallando GRUB e rigenerando il file di configurazione corrispondente:

  • Macchine virtuali Linux senza UEFI (basato su BIOS - Gen1):

    az extension add -n vm-repair
    az extension update -n vm-repair
    az vm repair repair-button --button-command 'grubfix' --verbose $RGNAME --name $VMNAME
    
  • Macchine virtuali Linux con UEFI (Gen2):

    az extension add -n vm-repair
    az extension update -n vm-repair
    az vm repair repair-button --button-command 'efifix' --verbose $RGNAME --name $VMNAME
    

Importante

Sostituire di conseguenza il nome $RGNAME del gruppo di risorse e il nome $VMNAME della macchina virtuale.

Lo script della macchina virtuale di ripristino, insieme allo script ALAR, crea temporaneamente un gruppo di risorse, una macchina virtuale di ripristino e una copia del disco del sistema operativo della macchina virtuale interessata. Reinstalla GRUB, rigenera il file di configurazione GRUB corrispondente e quindi scambia il disco del sistema operativo interrotto della macchina virtuale con il disco fisso copiato. Infine, lo repair-button script elimina automaticamente il gruppo di risorse contenente la macchina virtuale di ripristino temporanea.

Reinstallare GRUB e rigenerare manualmente il file di configurazione GRUB

  1. Verificare se è stata creata una macchina virtuale di salvataggio/ripristino. In caso contrario, seguire il passaggio 1 in Risoluzione dei problemi di salvataggio di GRUB offline per creare la macchina virtuale. Montare tutti i file system necessari, inclusi / e /boot nella macchina virtuale di ripristino/riparazione, quindi immettere l'ambiente chroot.

  2. Reinstallare GRUB e rigenerare il file di configurazione GRUB corrispondente utilizzando uno dei seguenti comandi:

    • Macchine virtuali RHEL/CentOS/Oracle 7.x/8.x/9.x Linux senza UEFI (basato su BIOS - Gen1)

      grub2-install /dev/sdX
      grub2-mkconfig -o /boot/grub2/grub.cfg
      sed -i 's/hd2/hd0/g' /boot/grub2/grub.cfg
      
    • Macchine virtuali RHEL/CentOS/Oracle 7.x/8.x/9.x Linux con UEFI (Gen2)

      yum reinstall grub2-efi-x64 shim-x64
      grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
      sed -i 's/hd2/hd0/g' /boot/efi/EFI/redhat/grub.cfg
      

      Se la macchina virtuale esegue CentOS, sostituire redhat con centos nel file grub.cfg percorso assoluto /boot/efi/EFI/centos/grub.cfg.

    • SLES 12/15 Gen1 e Gen2

      grub2-install /dev/sdX
      grub2-mkconfig -o /boot/grub2/grub.cfg
      sed -i 's/hd2/hd0/g' /boot/grub2/grub.cfg
      
    • Ubuntu Gen1 e Gen2

      grub-install /dev/sdX
      update-grub
      
  3. Andare al passaggio 3 in Risoluzione dei problemi di ripristino di GRUB offline per scambiare il disco del sistema.

Errore: filesystem sconosciuto

Lo screenshot seguente mostra il messaggio di errore:

Screenshot dell'errore del file system sconosciuto di GRUB.

Questo errore potrebbe essere associato a uno dei seguenti problemi:

Correggere il danneggiamento del file system /boot

Per correggere il /boot danneggiamento del file system, seguire questa procedura:

  1. Verificare se è stata creata una macchina virtuale di salvataggio/ripristino. In caso contrario, seguire il passaggio 1 in Risoluzione dei problemi di salvataggio di GRUB offline per creare la macchina virtuale.

  2. Fare riferimento a Risolvere i problemi di corruzione del file system in Azure Linux per risolvere i problemi di corruzione nella partizione corrispondente/boot.

  3. Andare alla fase 3 in Risoluzione dei problemi GRUB offline per sostituire il disco del sistema operativo.

Errore 15: file non trovato

Lo screenshot seguente mostra il messaggio di errore:

Schermata dell'errore 15 di GRUB file non trovato.

Per risolvere il problema, seguire la procedura seguente:

  1. Verificare se è stata creata una macchina virtuale di salvataggio/ripristino. In caso contrario, seguire il passaggio 1 in Risoluzione dei problemi di salvataggio di GRUB offline per creare la macchina virtuale. Montare tutti i file system necessari, inclusi / e /boot nella macchina virtuale di ripristino/riparazione, quindi immettere l'ambiente chroot.

  2. Esaminare il contenuto del /boot file system e determinare cosa manca.

  3. Se il file di configurazione GRUB manca, reinstallare GRUB e rigenerare manualmente il file di configurazione GRUB.

  4. Verificare che le autorizzazioni per i file nel /boot file system siano OK. È possibile confrontare le autorizzazioni usando un'altra macchina virtuale in esecuzione con la stessa versione di Linux.

  5. Se l'intera partizione /boot o altri contenuti importanti sono mancanti e non possono essere recuperati, si consiglia di ripristinare la macchina virtuale da un backup. Per ulteriori informazioni, vedere come ripristinare i dati delle macchine virtuali Azure nel portale di Azure.

  6. Una volta risolto il problema, procedere al passaggio 3 in Risoluzione dei problemi di salvataggio di GRUB offline per scambiare il disco del sistema operativo.

Errore: file '/boot/grub2/i386-pc/normal.mod' non trovato

Lo screenshot seguente mostra il messaggio di errore:

Screenshot dell'errore di grub normal.mod non trovato.

  1. Verificare se è stata creata una macchina virtuale di salvataggio/ripristino. Se non è stato creato, seguire il primo passaggio in Risoluzione dei problemi di rescue di GRUB offline per crearne uno. Montare tutti i file system necessari, inclusi / e /boot nella macchina virtuale di ripristino/riparazione, quindi immettere l'ambiente chroot.

  2. Se non è possibile montare il /boot file system a causa di un errore di danneggiamento, correggere il danneggiamento del file system /boot.

  3. Quando ti trovi all'interno di chroot, verifica il contenuto nella directory /boot/grub2/i386-pc. Se il contenuto non è presente, copiare il contenuto da /usr/lib/grub/i386-pc. Per fare ciò, utilizzare i seguenti comandi:

    ls -l /boot/grub2/i386-pc
    cp -rp /usr/lib/grub/i386-pc /boot/grub2
    
  4. Se il contenuto della /boot partizione è vuoto, usare i comandi seguenti per ricrearlo:

    Nota

    I passaggi seguenti si applicano alle macchine virtuali Linux RHEL/CentOS/Oracle 7.x/8.x senza UEFI (BIOS basato su Gen1).

    1. Nel processo chroot reinstallare il grub. Sostituire /dev/sd[X] di conseguenza con la copia corrispondente del disco del sistema operativo collegato alla macchina virtuale di riparazione/ripristino.

      grub2-install /dev/sd[X]
      
    2. Verificare che esista una voce DNS valida in /etc/resolv.conf per risolvere il nome del repository:

      cat /etc/resolv.conf
      
    3. Reinstallare il kernel:

      yum reinstall $(rpm -qa | grep -i kernel)
      
    4. Creare il grub.cfg file:

      grub2-mkconfig -o /boot/grub2/grub.cfg
      sed -i 's/hd2/hd0/g' /boot/grub2/grub.cfg
      
  5. Procedi con il passaggio 3 in Risoluzione dei problemi di salvataggio di GRUB offline per scambiare il disco del sistema operativo.

Errore: partizione non trovata

Lo screenshot seguente mostra il messaggio di errore:

Schermata dell'errore grub nessuna partizione di questo tipo.

Questo errore si verificherà con una macchina virtuale basata su RHEL (Red Hat, Oracle Linux, CentOS) in uno dei seguenti scenari:

  • La /boot partizione viene eliminata per errore.
  • La /boot partizione viene ricreata utilizzando i settori di inizio e fine errati.

Soluzione: ricreare la partizione /boot

Se la /boot partizione non è presente, ricrearla seguendo questa procedura:

  1. Verificare se è stata creata una macchina virtuale di salvataggio/ripristino. In caso contrario, seguire il passaggio 1 in Risoluzione dei problemi di salvataggio di GRUB offline per creare la macchina virtuale.

  2. Identificare se la tabella delle partizioni è stata creata come tipo dos o GPT utilizzando il seguente comando:

    sudo fdisk -l /dev/sdX
    
    • Tabella partizioni DOS

      Lo screenshot mostra l'avvio con la tabella delle partizioni di tipo dos.

    • Tabella delle partizioni GPT

      Lo screenshot mostra l'avvio con la tabella delle partizioni di tipo GPT.

  3. Se la tabella delle partizioni ha come tipo DOS, ricreare la partizione /boot nei sistemi DOS. Se la tabella delle partizioni è di tipo GPT, creare la partizione /boot nei sistemi GPT.

  4. Assicurarsi che il caricatore d'avvio GRUB sia installato utilizzando il disco appropriato. È possibile seguire la procedura descritta in Reinstallare GRUB e rigenerare manualmente il file di configurazione GRUB per installarlo e configurarlo.

  5. Procedi con il passaggio 3 in Risoluzione dei problemi di salvataggio di GRUB offline per scambiare il disco del sistema operativo.

Ricreare la partizione /boot nei sistemi DOS

  1. Ricreare la partizione /boot da una macchina virtuale di ripristino/riparazione mediante il comando seguente:

    sudo fdisk /dev/sdX
    

    Utilizzare i valori predefiniti nei settori Primo e Ultimo e tipo di partizione (83). Assicurarsi che la tabella di /boot partizione sia contrassegnata come avviabile usando l'opzione a nello fdisk strumento, come illustrato nell'output seguente:

    sudo fdisk /dev/sdc
    
    The device presents a logical sector size that is smaller than
    the physical sector size. Aligning to a physical sector (or optimal
    I/O) size boundary is recommended, or performance may be impacted.
    Welcome to fdisk (util-linux 2.23.2).
    
    Changes will remain in memory only, until you decide to write them.
    Be careful before using the write command.
    
    Command (m for help): n
    Partition type:
       p   primary (1 primary, 0 extended, 3 free)
       e   extended
    Select (default p): p
    Partition number (1,3,4, default 1): 1
    First sector (2048-134217727, default 2048):
    Using default value 2048
    Last sector, +sectors or +size{K,M,G} (2048-2099199, default 2099199):
    Using default value 2099199
    Partition 1 of type Linux and of size 1 GiB is set
    
    Command (m for help): t
    Partition number (1,2, default 2): 1
    Hex code (type L to list all codes): 83
    Changed type of partition 'Linux' to 'Linux'
    
    Command (m for help): a
    Partition number (1,2, default 2): 1
    
    Command (m for help): p
    
    Disk /dev/sdc: 68.7 GB, 68719476736 bytes, 134217728 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 4096 bytes
    I/O size (minimum/optimal): 4096 bytes / 4096 bytes
    Disk label type: dos
    Disk identifier: 0x000b7179
    
    Device Boot      Start         End      Blocks   Id  System
    /dev/sdc1   *        2048     2099199     1048576   83  Linux
    /dev/sdc2         2099200   134217727    66059264   8e  Linux LVM
    
    Command (m for help): w
    The partition table has been altered!
    
    Calling ioctl() to re-read partition table.
    
  2. Dopo aver ricreato la partizione mancante /boot , verificare se il /boot file system viene rilevato. Dovrebbe essere visualizzata una voce per /dev/sdX1 (la partizione /boot mancante).

    sudo blkid /dev/sdX1
    
    sudo blkid /dev/sdc1
    /dev/sdc1: UUID="<UUID>" TYPE="ext4"
    
  3. Se il /boot file system non è visibile in blkid dopo la ricreazione della partizione, significa che i /boot dati non esistono più. È necessario ricreare il file system /boot, utilizzando lo stesso UUID e formato di file system indicati nella voce /etc/fstab/boot, e quindi ripristinare il suo contenuto da un backup.

Ricreare la partizione /boot nei sistemi GPT

  1. Ricreare la partizione /boot da una macchina virtuale di ripristino/riparazione usando il comando seguente:

    sudo gdisk /dev/sdX
    

    Utilizzare i valori predefiniti nei settori Primo e Ultimo e tipo di partizione (8300), come mostrato nell'output seguente:

    sudo gdisk /dev/sdc
    GPT fdisk (gdisk) version 1.0.3
    
    Partition table scan:
      MBR: protective
      BSD: not present
      APM: not present
      GPT: present
    
    Found valid GPT with protective MBR; using GPT.
    
    Command (? for help): n
    Partition number (1-128, default 1): 1
    First sector (34-134217694, default = 1026048) or {+-}size{KMGTP}:
    Last sector (1026048-2050047, default = 2050047) or {+-}size{KMGTP}:
    Current type is 'Linux filesystem'
    Hex code or GUID (L to show codes, Enter = 8300):
    Changed type of partition to 'Linux filesystem'
    
    Command (? for help): p
    Disk /dev/sdc: 134217728 sectors, 64.0 GiB
    Model: Virtual Disk
    Sector size (logical/physical): 512/4096 bytes
    Disk identifier (GUID): 6D915856-445A-4513-97E4-C55F2E1AD6C0
    Partition table holds up to 128 entries
    Main partition table begins at sector 2 and ends at sector 33
    First usable sector is 34, last usable sector is 134217694
    Partitions will be aligned on 2048-sector boundaries
    Total free space is 6076 sectors (3.0 MiB)
    
    Number  Start (sector)    End (sector)  Size       Code  Name
       1         1026048         2050047   500.0 MiB   8300  Linux filesystem
       2         2050048       134215679   63.0 GiB    8E00
      14            2048           10239   4.0 MiB     EF02
      15           10240         1024000   495.0 MiB   EF00  EFI System Partition
    
    Command (? for help): w
    
    Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
    PARTITIONS!!
    
    Do you want to proceed? (Y/N): Y
    OK; writing new GUID partition table (GPT) to /dev/sdc.
    Warning: The kernel is still using the old partition table.
    The new table will be used at the next reboot or after you
    run partprobe(8) or kpartx(8)
    The operation has completed successfully.
    
  2. Controllare se il /boot file system viene rilevato dal sistema usando il comando seguente:

    sudo blkid /dev/sdX1
    

    Dovrebbe essere possibile visualizzare una voce per /dev/sdX1 (la partizione mancante /boot ).

    sudo blkid /dev/sdc1
    /dev/sdc1: UUID="<UUID>" BLOCK_SIZE="4096" TYPE="xfs" PARTLABEL="Linux filesystem" PARTUUID="<PARTUUID>"
    
  3. Se il /boot file system non è visibile dopo la ricreazione della partizione, ciò significa che i /boot dati non esistono più. È necessario ricreare il /boot file system (usando lo stesso UUID presente nella voce) e quindi ripristinarne il /etc/fstab/boot contenuto da un backup.

Errore: simbolo 'grub_efi_get_secure_boot' non trovato

Lo screenshot seguente mostra il messaggio di errore:

Schermata dell'errore 'grub_efi_get_secure_boot' non trovata.

Il kernel Linux versione 4.12.14 (utilizzato in SLES 12 SP5) non supporta l'opzione Avvio protetto. Pertanto, se l'avvio protetto è abilitato durante la distribuzione della macchina virtuale, ovvero il campo Tipo di sicurezza è impostato su Macchine virtuali di avvio attendibili, la macchina virtuale genera l'errore di avvio protetto tramite la console quando si tenta di avviare usando questa versione del kernel SUSE in un'immagine di macchina virtuale di generazione 2.

Soluzione

Per risolvere questo errore, attenersi alla seguente procedura:

  1. Verificare se è stata creata una macchina virtuale di salvataggio/ripristino. In caso contrario, seguire il passaggio 1 in Risoluzione dei problemi di ripristino di GRUB offline per creare la macchina virtuale. Montare tutti i file system necessari, inclusi / e /boot, e quindi accedere all'ambiente chroot.

  2. Nell'ambiente chroot, eseguire il seguente comando YaST:

    yast2 bootloader
    
  3. Deselezionare la "x" dall'opzione Abilita supporto di avvio protetto e quindi selezionare F10 per salvare la modifica.

    Schermata delle impostazioni del caricatore di avvio YaST2 nella console SUSE.

  4. Seguire il passaggio 3 in Risoluzione dei problemi di salvataggio di GRUB offline per scambiare il disco del sistema operativo.

Altri errori di salvataggio di GRUB

Lo screenshot seguente mostra il messaggio di errore:

Screenshot di un altro problema di salvataggio di grub.

Questo tipo di errore verrà attivato in uno dei seguenti scenari:

  • Manca il file di configurazione di GRUB.
  • È utilizzata la configurazione GRUB errata.
  • La /boot partizione o il relativo contenuto non sono presenti.

Per risolvere questo errore, attenersi alla seguente procedura:

  1. Verificare se è stata creata una macchina virtuale di salvataggio/ripristino. In caso contrario, seguire il passaggio 1 in Risoluzione dei problemi di salvataggio di GRUB offline per creare la macchina virtuale. Montare tutti i file system necessari, inclusi / e /boot, e quindi entrare nell'ambiente chroot.

  2. Assicurarsi che il /etc/default/grub file di configurazione sia configurato. Le immagini Azure Linux approvate hanno già le configurazioni necessarie. Per altre informazioni, vedere gli articoli seguenti:

  3. Reinstallare GRUB e rigenerare manualmente il file di configurazione GRUB.

    Nota

    Se il file mancante è /boot/grub/menu.lst, questo errore riguarda le versioni precedenti del sistema operativo (RHEL 6.x, Centos 6.x e Ubuntu 14.04). I comandi saranno diversi perché questi sistemi utilizzano la versione 1 di GRUB. La versione 1 di GRUB non è trattata in questo articolo.

  4. Se l'intera /boot partizione non è presente, seguire la procedura descritta in Errore: nessuna partizione di questo tipo.

  5. Una volta risolto il problema, procedere al passaggio 3 in Risoluzione dei problemi di salvataggio di GRUB offline per scambiare il disco del sistema operativo.

Passaggi successivi

Se l'errore di avvio specifico non è un problema di recupero GRUB, vedere Troubleshoot Azure Linux Macchine virtuali errori di avvio per altre opzioni di risoluzione dei problemi.

Dichiarazione di non responsabilità sulle informazioni di terze parti

I prodotti di terze parti illustrati in questo articolo sono prodotti da aziende indipendenti da Microsoft. Microsoft non garantisce, implicitamente o altrimenti, circa le prestazioni o l'affidabilità di questi prodotti.

Dichiarazione di non responsabilità di contatti di terze parti

Microsoft fornisce informazioni di contatto di terze parti per trovare informazioni aggiuntive su questo argomento. Queste informazioni di contatto sono soggette a modifica senza preavviso. Microsoft non garantisce l'accuratezza delle informazioni di contatto di terze parti.