Risolvere i problemi di avvio e rete delle macchine virtuali Linux causati da errori associati al driver Hyper-V

Si applica a: ✔️ macchine virtuali Linux

Sommario

Azure è eseguito sull'hypervisor Hyper-V e i sistemi Linux richiedono determinati moduli kernel Hyper-V per funzionare su Azure. Questi moduli kernel vengono raggruppati nei driver LIS (Linux Integration Services) per Hyper-V e Azure. Microsoft li contribuisce direttamente al kernel Linux upstream.

Questo articolo illustra più condizioni in cui uno o più driver di Hyper-V disabilitati possono causare problemi di avvio e rete delle macchine virtuali Linux.

Prerequisiti

Assicurarsi che la console seriale sia abilitata e funzionale nella macchina virtuale Linux.

Come identificare il problema del driver mancante di Hyper-V

Per identificare se l'avvio della macchina virtuale non riesce a causa di driver di Hyper-V mancanti, usare interfaccia della riga di comando di Azure o il portale di Azure per visualizzare il log della console seriale della macchina virtuale nel riquadro di diagnostica di avvio o nel riquadro della console seriale. Gli output di esempio degli errori vengono visualizzati nelle sezioni corrispondenti seguenti.

Prima di risolvere i problemi

Per risolvere i problemi relativi a Scenario 1: il driver di Hyper-V di rete è disabilitato e Scenario 2: l'indirizzo mac (NIC Media Access Control) viene modificato o non corrisponde è necessario serial console l'accesso per la macchina virtuale Linux.

Se non si ha accesso alla console seriale, seguire l'approccio offline per accedere al contenuto del disco del sistema operativo problematico da una macchina virtuale di ripristino. L'accesso a interfaccia della riga di comando di Azure o Azure Cloud Shell è necessario per l'approccio offline.

Per risolvere i problemi Scenario 3: altri driver di Hyper-V sono disabilitati, l'approccio offline è l'unica opzione per risolvere il problema.

Scenario 1: Il driver di Hyper-V di rete è disabilitato

Poiché i servizi di rete non sono disponibili, non è possibile usare SSH (Secure Shell Protocol) in una macchina virtuale, ma è comunque possibile accedere tramite la console serial dal portale di Azure. Nella console seriale o nel log seriale più recente nel riquadro Boot Diagnostics nel portale di Azure vengono visualizzati i tipi di errori seguenti:

 cloud-init[807]: Cloud-init v. 19.4 running 'init-local' at Tue, xx Aug 20XX 20:41:53 +0000. Up 5.83 seconds.
 cloud-init[807]: 20XX-08-XX 20:41:54,231 - stages.py[WARNING]: Failed to rename devices: [nic not present] Cannot rename mac=xx:xx:xx:xx:xx:xx to eth0, not available.
[  OK  ] Started Initial cloud-init job (pre-networking).
----
[FAILED] Failed to start LSB: Bring up/down networking.
See 'systemctl status network.service' for details.

O

 cloud-init[799]: 2022-XX-XX 19:04:06,267 - azure.py[WARNING]: Interface not found for DHCP
 cloud-init[799]: 2022-XX-XX 19:04:07,269 - azure.py[WARNING]: Interface not found for DHCP
 cloud-init[799]: 2022-XX-XX 19:04:10,274 - azure.py[WARNING]: Interface not found for DHCP
 cloud-init[799]: 2022-XX-2XX 19:04:10,277 - azure.py[WARNING]: IMDS network metadata has incomplete configuration: None

Soluzione 1: Abilitare Hyper-V driver di rete tramite la console seriale

  1. Accedere alla console seriale della macchina virtuale. La rete è inattiva, ma la richiesta di accesso è ancora disponibile.

  2. Accedere alla macchina virtuale con le credenziali corrette.

  3. Passare all'account root o all'account utente con accesso sudo.

  4. Passare alla directory /etc/modprobe.d e cercare qualsiasi riga che disabilita il driver hv_netvsc.

    1. Identificare il file che disabilita il driver hv_netvsc e i numeri di riga corrispondenti eseguendo il comando seguente:

      sudo grep -nr "hv_netvsc" /etc/modprobe.d/
      
    2. Modificare il file corrispondente e commentare o eliminare le voci hv_netvsc:

      Screenshot che mostra il possibile contenuto del file di configurazione usato per disabilitare i driver di rete.

      sudo vi /etc/modprobe.d/disable.conf
      

      Note

      • Le voci che disabilitano i driver sono definite dal sistema operativo Linux, non da Microsoft.
      • Sostituire disable.conf con il nome file corrispondente in cui il driver hv_netvsc è disabilitato.
  5. Ricompilare l'immagine RAMdisk iniziale per il kernel attualmente caricato:

    • Per le immagini basate su RHEL/SLES

      sudo dracut -f -v
      
    • Per immagini basate su Ubuntu/Debian

      sudo mkinitramfs -k -o /boot/initrd.img-$(uname -r)
      
  6. Riavviare la macchina virtuale.

Eseguire sempre un backup dell'immagine RAMdisk iniziale originale per facilitare il rollback quando necessario.

  • Per le immagini basate su RHEL:

    sudo cp /boot/initramfs-<kernelVersion>.img /boot/initramfs-<kernelVersion>.img.bak
    
  • Per le immagini basate su SLES:

    sudo cp /boot/initrd-<kernelVersion> /boot/initrd-<kernelVersion>.bak
    
  • Per le immagini basate su Ubuntu/Debian:

    sudo cp /boot/initrd.img-<kernelVersion> /boot/initrd.img-<kernelVersion>.bak
    

Soluzione 2: Abilitare Hyper-V driver di rete offline

  1. Usare az vm repair per accedere al contenuto del disco del sistema operativo interessato da una macchina virtuale di ripristino.

  2. Montare e chroot ai file system del disco del sistema operativo collegato nella macchina virtuale di ripristino seguendo le istruzioni chroot.

  3. Dopo aver eseguito l'accesso al contenuto del disco del sistema operativo interessato, seguire i passaggi 4 e 5 in Solution 1: Abilitare Hyper-V driver di rete usando la console seriale per riabilitare i driver e ricompilare l'immagine RAMdisk iniziale.

    Prima della ricompilazione dell'immagine RAMdisk iniziale, passare all'ambiente chroot. È necessario specificare il percorso completo dell'immagine.

  4. Dopo aver applicato le modifiche, eseguire uno scambio automatico del disco del sistema operativo con la macchina virtuale originale e riavviare il sistema usando il az vm repair restore comando .

Scenario 2: l'indirizzo MAC (NIC Media Access Control) viene modificato o non corrisponde

Se l'indirizzo MAC della scheda di interfaccia di rete viene modificato o non corrisponde all'interno della configurazione del sistema operativo, non sarà possibile connettersi tramite SSH alla macchina virtuale perché i servizi di rete non sono disponibili. È comunque possibile accedere tramite serial console dal portale di Azure. Vengono visualizzati errori simili a quelli di Scenario 1: il driver di Hyper-V di rete è disabilitato.

Se il problema persiste anche se il driver di rete Hyper-V è abilitato, usare una delle soluzioni seguenti per convalidare la configurazione della scheda di interfaccia di rete del sistema operativo e risolvere il problema.

Soluzione 1: Correggere la mancata corrispondenza dell'indirizzo MAC della scheda di interfaccia di rete usando la console seriale

  1. Accedere alla console seriale della macchina virtuale. La rete è inattiva, ma la richiesta di accesso è ancora disponibile.

  2. Accedere alla macchina virtuale con le credenziali corrette.

  3. Passare all'account radice o all'account utente con accesso sudo.

  4. Passare alla directory /etc/cloud/cloud.cfg.d .

  5. Considerando che vengono usate immagini partner Linux, aprire e modificare i file seguenti:

    • 91-azure_datasource.cfg per la distribuzione basata su RHEL.
    • 90_dpkg.cfg per la distribuzione basata su Debian e Ubuntu.
  6. Se il apply_network_config parametro è impostato su false, impostarlo su true. Se non viene specificato alcun valore, il valore predefinito è impostato su true. Questa impostazione garantisce che il nuovo indirizzo MAC venga applicato alla configurazione di rete al riavvio successivo.

  7. In genere, un indirizzo MAC della scheda di interfaccia di rete cambia solo se una scheda di interfaccia di rete viene eliminata o aggiunta dall'amministratore o un'interfaccia di rete viene aggiornata nel back-end. Se la configurazione di rete tramite cloud-init non è desiderata e il apply_network_config parametro deve essere impostato su false, eliminare il file /var/lib/cloud/instance/obj.pkl e riavviare il sistema.

    sudo rm /var/lib/cloud/instance/obj.pkl
    
  8. Dopo aver applicato le modifiche, riavviare il sistema.

Soluzione 2: Correggere l'incongruenza dell'indirizzo MAC della NIC offline

  1. Usare il comando az vm repair per accedere al contenuto del disco del sistema operativo interessato da una macchina virtuale di ripristino.
  2. Montare e eseguire chroot nei file system del disco del sistema operativo collegato correttamente in una macchina virtuale di salvataggio seguendo le istruzioni chroot.
  3. Dopo aver eseguito l'accesso al contenuto della copia del disco del sistema operativo interessato, seguire i passaggi da 4 a 7 nella soluzione 1: Correggere la mancata corrispondenza dell'indirizzo MAC della scheda di interfaccia di rete usando la console seriale per apportare modifiche di rete o cancellare il file obj.pkl .
  4. Dopo aver applicato le modifiche, usare il az vm repair restore comando per eseguire uno scambio automatico del disco del sistema operativo con la macchina virtuale originale e riavviare il sistema.

Scenario 3: Altri driver Hyper-V sono disabilitati

Se si verificano problemi di avvio con altri driver Hyper-V, è probabile che non sia possibile connettersi tramite SSH a una macchina virtuale perché i servizi di rete non sono disponibili. Sei stato trasferito in una shell dracut. Questo problema può essere visualizzato tramite la console serial dal portale di Azure. È possibile visualizzare gli errori seguenti nella console seriale o nel log seriale più recente all'interno del riquadro Boot Diagnostics nel portale di Azure:

 dracut-initqueue[455]: Warning: dracut-initqueue timeout - starting timeout scripts
 dracut-initqueue[455]: Warning: Could not boot.
         Starting Setup Virtual Console...
[  OK  ] Started Setup Virtual Console.
         Starting Dracut Emergency Shell...
Warning: /dev/mapper/rootvg-rootlv does not exist
Generating "/run/initramfs/rdsosreport.txt"
 
Entering emergency mode. Exit the shell to continue.
Type "journalctl" to view system logs.
You might want to save "/run/initramfs/rdsosreport.txt" to a USB stick or /boot
after mounting them and attach it to a bug report.
dracut:/#

O

Gave up waiting for root file system device.  Common problems:
 - Boot args (cat /proc/cmdline)
   - Check rootdelay= (did the system wait long enough?)
 - Missing modules (cat /proc/modules; ls /dev)
ALERT!  UUID=143c811b-9b9c-48f3-b0c8-040f6e65f50aa does not exist.  Dropping to a shell!


BusyBox v1.27.2 (Ubuntu 1:1.27.2-2ubuntu3.4) built-in shell (ash)
Enter 'help' for a list of built-in commands.

(initramfs)

Soluzione: abilitare i driver Hyper-V

Se la macchina virtuale non è accessibile a causa di altri driver Hyper-V disabilitati, usare un approccio offline per riabilitare i driver, perché non è possibile caricare initramfs.

  1. Usare il comando az vm repair per accedere al contenuto del disco del sistema operativo problematico da una macchina virtuale di ripristino.

  2. Montare e chroot nei file system del disco del sistema operativo collegato in una macchina virtuale di ripristino seguendo correttamente le istruzioni chroot.

  3. Una volta nell'ambiente chroot, passare alla directory /etc/modprobe.d e cercare qualsiasi riga che potrebbe disabilitare il driver hv_utils, hv_vmbus, hv_storvsc o hv_netvsc.

    1. Eseguire il comando seguente per identificare il file che disabilita il driver hv_utils, hv_vmbus, hv_storvsc o hv_netvsc e il numero di riga corrispondente.

      sudo egrep -nr "hv_utils|hv_vmbus|hv_storvsc|hv_netvsc" /etc/modprobe.d/
      
    2. Modificare il file corrispondente e mettere in commento o eliminare le voci di hv_utils, hv_vmbus, hv_storvsc o hv_netvsc. Le voci più frequentemente saranno una delle seguenti (o entrambe):

      Screenshot che mostra il possibile contenuto del file di configurazione usato per disabilitare i moduli/driver del kernel usando l'opzione di installazione.

      Screenshot che mostra il possibile contenuto del file di configurazione usato per disabilitare i moduli/driver del kernel.

      sudo vi /etc/modprobe.d/disable.conf
      

    Importante

    • Le voci che disabilitano i driver sono definite dal sistema operativo Linux, non da Microsoft.
    • Sostituire disable.conf con il nome file corrispondente in cui i driver Hyper-V sono disabilitati.
  4. Ricompilare l'immagine RAMdisk iniziale per il kernel attualmente caricato:

    • Per le immagini basate su RHEL/SLES

      sudo dracut -f -v
      
    • Per immagini basate su Ubuntu/Debian

      sudo mkinitramfs -k -o /boot/initrd.img-$(uname -r)
      
  5. Dopo aver applicato le modifiche, usare il az vm repair restore comando per eseguire uno scambio automatico del disco del sistema operativo con la macchina virtuale originale e riavviare il sistema.

Eseguire sempre un backup dell'immagine RAMdisk iniziale originale per facilitare il rollback, se necessario.

Se il problema non è ancora risolto, fare riferimento a la macchina virtuale Linux di Azure non si avvia e entra nella shell di emergenza di dracut per analizzare i problemi di dracut.

Passaggi successivi

Nel caso in cui l'errore di avvio specifico non sia un problema di Hyper-V, vedere Troubleshoot Azure Errori di avvio di Linux Macchine virtuali per altre opzioni di risoluzione dei problemi.