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

Azure viene eseguito negli hypervisor Hyper-V e nei sistemi Linux è necessario che alcuni moduli kernel Hyper-V vengano eseguiti in Azure. Questi moduli kernel sono 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 Hyper-V disabilitati potrebbero 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 mancante del driver Hyper-V

Per identificare se l'avvio della macchina virtuale non riesce a causa di driver Hyper-V mancanti, usare l'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.

Operazioni preliminari alla risoluzione dei problemi

Per risolvere i problemi relativi allo scenario 1: il driver Hyper-V di rete è disabilitato e lo scenario 2: l'indirizzo mac della scheda di interfaccia di rete viene modificato o non corrisponde, è necessario l'accesso alla console seriale 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 all'interfaccia della riga di comando di Azure o ad Azure Cloud Shell è necessario per l'approccio offline.

Per risolvere lo scenario 3: altri driver Hyper-V sono disabilitati, l'approccio offline è l'unica opzione per risolvere il problema.

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

Poiché i servizi di rete non sono disponibili, non è possibile accedere a una macchina virtuale tramite secure shell Protocol (SSH), ma è comunque possibile accedere tramite console seriale dal portale di Azure. Nel portale di Azure vengono visualizzati i tipi di errori seguenti nella console seriale o nel log seriale più recente all'interno del riquadro Diagnostica di avvio:

 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 il driver di rete Hyper-V 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/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:

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

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

      vi /etc/modprobe.d/disable.conf
      

      Nota

      • 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

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

      # 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:

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

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

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

Soluzione 2: Abilitare il driver di rete Hyper-V 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 nei 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 nella soluzione 1: Abilitare il driver di rete Hyper-V 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 della scheda di interfaccia di rete 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 la console seriale dal portale di Azure. Vengono visualizzati errori simili a quelli dello scenario 1: il driver 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.

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

Soluzione 2: Correggere la mancata corrispondenza dell'indirizzo MAC della scheda di interfaccia di rete 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 chroot nei file system del disco del sistema operativo collegato in una macchina virtuale di salvataggio correttamente 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 caduto in una shell dracut. Questo problema può essere visualizzato tramite la console seriale dal portale di Azure. È possibile visualizzare gli errori seguenti nella console seriale o nel log seriale più recente all'interno del riquadro Diagnostica di avvio 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.

      egrep -nr "hv_utils|hv_vmbus|hv_storvsc|hv_netvsc" /etc/modprobe.d/
      
    2. Modificare il file corrispondente e impostare come commento o eliminare le voci di hv_utils, hv_vmbus, hv_storvsc o hv_netvsc. Le voci sono in genere 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.

      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

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

      # 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 viene ancora risolto, fare riferimento alla macchina virtuale Linux di Azure che non viene avviata e entra nella shell di emergenza 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 Risolvere gli errori di avvio di Linux di Azure Macchine virtuali per altre opzioni di risoluzione dei problemi.

Contattaci per ricevere assistenza

In caso di domande o bisogno di assistenza, creare una richiesta di supporto tecnico oppure formula una domanda nel Supporto della community di Azure. È possibile anche inviare un feedback sul prodotto al feedback della community di Azure.