Udostępnij za pośrednictwem


Rozwiązywanie problemów z rozruchem i siecią maszyny wirtualnej z systemem Linux z powodu błędów związanych ze sterownikiem funkcji Hyper-V

Dotyczy: ✔️ maszyny wirtualne z systemem Linux

Platforma Azure działa na funkcji hypervisor funkcji Hyper-V, a systemy Linux wymagają, aby niektóre moduły jądra funkcji Hyper-V działały na platformie Azure. Te moduły jądra są dołączane do sterowników usług LINUX Integration Services (LIS) dla funkcji Hyper-V i platformy Azure. Firma Microsoft współtworzy je bezpośrednio z nadrzędnym jądrem systemu Linux.

W tym artykule omówiono wiele warunków, w których co najmniej jeden wyłączony sterownik funkcji Hyper-V może prowadzić do problemów z rozruchem i siecią maszyny wirtualnej z systemem Linux.

Wymagania wstępne

Upewnij się, że konsola szeregowa jest włączona i funkcjonalna na maszynie wirtualnej z systemem Linux.

Jak zidentyfikować brakujący problem ze sterownikiem funkcji Hyper-V

Aby ustalić, czy rozruch maszyny wirtualnej nie powiedzie się z powodu braku sterowników funkcji Hyper-V, użyj interfejsu wiersza polecenia platformy Azure lub witryny Azure Portal, aby wyświetlić dziennik konsoli szeregowej maszyny wirtualnej w okienku diagnostyki rozruchu lub okienku konsoli szeregowej. Przykładowe dane wyjściowe błędów są wyświetlane w odpowiednich sekcjach poniżej.

Przed rozpoczęciem rozwiązywania problemów

Aby rozwiązać problem Scenariusz 1: Sterownik funkcji Hyper-V sieci jest wyłączony i scenariusz 2: adres mac karty sieciowej jest zmieniany lub niezgodny, potrzebujesz dostępu do konsoli szeregowej dla maszyny wirtualnej z systemem Linux.

Jeśli nie masz dostępu do konsoli szeregowej, postępuj zgodnie z podejściem offline, aby uzyskać dostęp do zawartości problematycznego dysku systemu operacyjnego z maszyny wirtualnej ratowniczej. W przypadku podejścia offline wymagany jest dostęp do interfejsu wiersza polecenia platformy Azure lub usługi Azure Cloud Shell .

Aby rozwiązać problem w scenariuszu 3: Inne sterowniki funkcji Hyper-V są wyłączone, podejście w trybie offline jest jedyną opcją rozwiązania problemu.

Scenariusz 1. Sterownik funkcji Hyper-V sieci jest wyłączony

Ponieważ usługi sieciowe są niedostępne, nie możesz nawiązać połączenia Secure Shell Protocol (SSH) z maszyną wirtualną, ale nadal możesz zalogować się za pośrednictwem konsoli szeregowej w witrynie Azure Portal. W konsoli szeregowej lub najnowszym dzienniku szeregowym w okienku Diagnostyka rozruchu w witrynie Azure Portal są widoczne następujące typy błędów:

 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.

Or

 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

Rozwiązanie 1. Włączanie sterownika sieciowego funkcji Hyper-V przy użyciu konsoli szeregowej

  1. Uzyskaj dostęp do konsoli szeregowej maszyny wirtualnej. Sieć nie działa, ale monit logowania jest nadal dostępny.

  2. Zaloguj się do maszyny wirtualnej przy użyciu poprawnych poświadczeń.

  3. Przejdź do konta głównego lub konta użytkownika z dostępem sudo.

  4. Przejdź do katalogu /etc/modprobe.d i poszukaj dowolnego wiersza, który wyłącza sterownik hv_netvsc.

    1. Zidentyfikuj plik, który wyłącza sterownik hv_netvsc i odpowiednie numery wierszy, uruchamiając następujące polecenie:

      grep -nr "hv_netvsc" /etc/modprobe.d/
      
    2. Zmodyfikuj odpowiedni plik i oznacz jako komentarz lub usuń wpisy hv_netvsc:

      Zrzut ekranu przedstawiający możliwą zawartość pliku konfiguracji używaną do wyłączania sterowników sieciowych.

      vi /etc/modprobe.d/disable.conf
      

      Uwaga

      • Wpisy wyłączające sterowniki są definiowane przez system operacyjny Linux, a nie przez firmę Microsoft.
      • Zastąp disable.conf element odpowiednią nazwą pliku, w którym sterownik hv_netvsc jest wyłączony.
  5. Skompiluj początkowy obraz RAMdisk dla aktualnie załadowanego jądra:

    • W przypadku obrazów opartych na systemie RHEL/SLES

      # dracut -f -v
      
    • W przypadku obrazów opartych na systemie Ubuntu/Debian

      # mkinitramfs -k -o /boot/initrd.img-$(uname -r)
      
  6. Uruchom ponownie maszynę wirtualną.

Zawsze utwórz kopię zapasową oryginalnego początkowego obrazu RAMdisk, aby ułatwić wycofywanie w razie potrzeby.

  • W przypadku obrazów opartych na systemie RHEL:

    # cp /boot/initramfs-<kernelVersion>.img /boot/initramfs-<kernelVersion>.img.bak
    
  • W przypadku obrazów opartych na protokole SLES:

    # cp /boot/initrd-<kernelVersion> /boot/initrd-<kernelVersion>.bak
    
  • W przypadku obrazów opartych na systemie Ubuntu/Debian:

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

Rozwiązanie 2. Włączanie sterownika sieciowego funkcji Hyper-V w trybie offline

  1. Użyj polecenia az vm repair , aby uzyskać dostęp do zawartości dysku systemu operacyjnego, którego dotyczy problem, z maszyny wirtualnej ratowniczej.

  2. Zainstaluj i chroot w systemach plików dołączonego dysku systemu operacyjnego na maszynie wirtualnej ratowniczej, postępując zgodnie z instrukcjami chroot.

  3. Po uzyskaniu dostępu do zawartości dysku systemu operacyjnego, którego dotyczy problem, wykonaj kroki 4 i 5 w rozwiązaniu 1: Włącz sterownik sieciowy funkcji Hyper-V przy użyciu konsoli szeregowej, aby ponownie włączyć sterowniki i ponownie skompilować początkowy obraz RAMdisk.

    Przed odbudową początkowego obrazu RAMdisk przełącz się do środowiska chroot. Należy podać pełną ścieżkę obrazu.

  4. Po zastosowaniu zmian wykonaj automatyczną wymianę dysku systemu operacyjnego z oryginalną maszyną wirtualną i uruchom ponownie system przy użyciu az vm repair restore polecenia .

Scenariusz 2. Adres MAC karty sieciowej został zmieniony lub nie jest zgodny

Jeśli adres MAC karty interfejsu sieciowego zostanie zmieniony lub nie pasuje do konfiguracji systemu operacyjnego, nie będzie można nawiązać połączenia SSH z maszyną wirtualną, ponieważ usługi sieciowe są niedostępne. Nadal możesz zalogować się za pośrednictwem konsoli szeregowej z witryny Azure Portal. Wyświetlane są błędy podobne do tych w scenariuszu 1: Sterownik funkcji Hyper-V sieci jest wyłączony .

Jeśli problem będzie nadal występował, mimo że sterownik sieciowy funkcji Hyper-V jest włączony, użyj jednego z następujących rozwiązań, aby zweryfikować konfigurację karty sieciowej systemu operacyjnego i rozwiązać problem.

Rozwiązanie 1. Rozwiązywanie problemów z niezgodnością adresów MAC karty sieciowej przy użyciu konsoli szeregowej

  1. Uzyskaj dostęp do konsoli szeregowej maszyny wirtualnej. Sieć nie działa, ale monit logowania jest nadal dostępny.

  2. Zaloguj się do maszyny wirtualnej przy użyciu poprawnych poświadczeń.

  3. Przejdź do konta głównego lub konta użytkownika z dostępem sudo.

  4. Przejdź do katalogu /etc/cloud/cloud.cfg.d .

  5. Biorąc pod uwagę, że są używane obrazy partnerów systemu Linux, otwórz i zmodyfikuj następujące pliki:

    • 91-azure_datasource.cfg dla dystrybucji opartej na systemie RHEL.
    • 90_dpkg.cfg dla dystrybucji opartej na debianie i ubuntu.
  6. apply_network_config Jeśli parametr ma wartość false, ustaw go na wartość true. Jeśli nic nie zostanie określone, wartość domyślna zostanie ustawiona na true. To ustawienie zapewni zastosowanie nowego adresu MAC do konfiguracji sieci podczas następnego ponownego rozruchu.

  7. Ogólnie rzecz biorąc, adres MAC karty sieciowej zmieni się tylko wtedy, gdy karta sieciowa zostanie usunięta lub dodana przez administratora lub kartę sieciową zostanie zaktualizowana w zapleczu. Jeśli konfiguracja sieci za pośrednictwem pakietu cloud-init nie jest wymagana, a apply_network_config parametr musi być ustawiony na wartość false, usuń plik /var/lib/cloud/instance/obj.pkl i uruchom ponownie system.

    # rm /var/lib/cloud/instance/obj.pkl
    
  8. Po zastosowaniu zmian uruchom ponownie system.

Rozwiązanie 2. Naprawianie niezgodności adresów MAC karty sieciowej w trybie offline

  1. Użyj polecenia az vm repair, aby uzyskać dostęp do zawartości dysku systemu operacyjnego, którego dotyczy problem, z maszyny wirtualnej ratowniczej.
  2. Zainstaluj i chroot w systemach plików dołączonego dysku systemu operacyjnego na maszynie wirtualnej ratowniczej poprawnie, postępując zgodnie z instrukcjami chroot.
  3. Po uzyskaniu dostępu do zawartości kopii dysku systemu operacyjnego, do którego ma to wpływ, wykonaj kroki od 4 do 7 w rozwiązaniu 1: Napraw niezgodność adresów MAC karty sieciowej przy użyciu konsoli szeregowej, aby wprowadzić zmiany w sieci lub wyczyścić plik obj.pkl .
  4. Po zastosowaniu zmian użyj az vm repair restore polecenia , aby wykonać automatyczną zamianę dysku systemu operacyjnego z oryginalną maszyną wirtualną i ponownie uruchomić system.

Scenariusz 3. Inne sterowniki funkcji Hyper-V są wyłączone

Jeśli wystąpią problemy z rozruchem z innymi sterownikami funkcji Hyper-V, prawdopodobnie nie możesz nawiązać połączenia SSH z maszyną wirtualną, ponieważ usługi sieciowe są niedostępne. Jesteś porzucony do powłoki dracut. Ten problem można wyświetlić za pośrednictwem konsoli szeregowej w witrynie Azure Portal. W konsoli szeregowej lub najnowszym dzienniku szeregowym można zobaczyć następujące błędy w okienku Diagnostyka rozruchu w witrynie Azure Portal:

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

Or

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)

Rozwiązanie: włączanie sterowników funkcji Hyper-V

Jeśli maszyna wirtualna jest niedostępna z powodu wyłączenia innych sterowników funkcji Hyper-V, użyj metody offline, aby przywrócić sterowniki, ponieważ nie można załadować initramfs.

  1. Użyj polecenia az vm repair, aby uzyskać dostęp do zawartości problematycznego dysku systemu operacyjnego z maszyny wirtualnej ratowniczej.

  2. Zainstaluj i chroot w systemach plików dołączonego dysku systemu operacyjnego na maszynie wirtualnej ratowniczej poprawnie, postępując zgodnie z instrukcjami chroot.

  3. Po przejściu do środowiska chroot przejdź do katalogu /etc/modprobe.d i poszukaj dowolnego wiersza, który może wyłączyć hv_utils, hv_vmbus, hv_storvsc lub sterownik hv_netvsc.

    1. Uruchom następujące polecenie, aby zidentyfikować plik, który wyłącza sterownik hv_utils, hv_vmbus, hv_storvsc lub hv_netvsc oraz odpowiadający mu numer wiersza.

      egrep -nr "hv_utils|hv_vmbus|hv_storvsc|hv_netvsc" /etc/modprobe.d/
      
    2. Zmodyfikuj odpowiedni plik i oznacz jako komentarz lub usuń wpisy hv_utils, hv_vmbus, hv_storvsc lub hv_netvsc. Wpisy są najczęściej dowolnym z następujących elementów (lub obu):

      Zrzut ekranu przedstawiający możliwą zawartość pliku konfiguracji używaną do wyłączania modułów/sterowników jądra przy użyciu opcji instalacji.

      Zrzut ekranu przedstawiający możliwą zawartość pliku konfiguracji używaną do wyłączania modułów/sterowników jądra.

      vi /etc/modprobe.d/disable.conf
      

    Ważne

    • Wpisy wyłączające sterowniki są definiowane przez system operacyjny Linux, a nie przez firmę Microsoft.
    • Zastąp disable.conf element odpowiednią nazwą pliku, w którym są wyłączone sterowniki funkcji Hyper-V.
  4. Skompiluj początkowy obraz RAMdisk dla aktualnie załadowanego jądra:

    • W przypadku obrazów opartych na systemie RHEL/SLES

      # dracut -f -v
      
    • W przypadku obrazów opartych na systemie Ubuntu/Debian

      # mkinitramfs -k -o /boot/initrd.img-$(uname -r)
      
  5. Po zastosowaniu zmian użyj az vm repair restore polecenia , aby wykonać automatyczną zamianę dysku systemu operacyjnego z oryginalną maszyną wirtualną i ponownie uruchomić system.

Zawsze utwórz kopię zapasową oryginalnego początkowego obrazu RAMdisk, aby w razie potrzeby ułatwić wycofywanie.

Jeśli problem nadal nie został rozwiązany, zapoznaj się z tematem Nie można uruchomić maszyny wirtualnej z systemem Linux platformy Azure i przechodzi do powłoki awaryjnej dracut w celu zbadania problemów z dracutem.

Następne kroki

Jeśli określony błąd rozruchu nie jest problemem z funkcją Hyper-V, zobacz Rozwiązywanie problemów z błędami rozruchu maszyn wirtualnych z systemem Linux na platformie Azure, aby uzyskać dalsze opcje rozwiązywania problemów.

Skontaktuj się z nami, aby uzyskać pomoc

Jeśli masz pytania lub potrzebujesz pomocy, utwórz wniosek o pomoc techniczną lub zadaj pomoc techniczną społeczności platformy Azure. Możesz również przesłać opinię o produkcie do społeczności opinii na temat platformy Azure.