共用方式為


針對 Linux 虛擬機開機和網路問題進行疑難解答,因為 Hyper-V 驅動程式相關的錯誤

適用於:✔️ Linux VM

Azure 會在 Hyper-V Hypervisor 上執行,而 Linux 系統需要某些 Hyper-V 核心模組才能在 Azure 上執行。 這些核心模組會組合到 Hyper-V 和 Azure 的 Linux Integration Services (LIS) 驅動程式中。 Microsoft直接將它們提供給上游 Linux 核心。

本文討論多個已停用 Hyper-V 驅動程式可能會導致 Linux 虛擬機器 (VM) 開機和網路問題的情況。

必要條件

請確定 已在Linux VM中啟用序列主控台 並正常運作。

如何識別遺漏的 Hyper-V 驅動程序問題

若要識別 VM 是否因為缺少 Hyper-V 驅動程式而無法開機,請使用 Azure CLI 或 Azure 入口網站,在開機診斷窗格或序列控制檯窗格中檢視 VM 的序列控制台記錄。 失敗的範例輸出會顯示在下方的對應區段中。

疑難解答之前

若要針對案例 1 進行疑難解答 :網路 Hyper-V 驅動程式已停用 ,且 案例 2:NIC mac 位址已變更或不符合,您需要 Linux VM 的序列控制台 存取權。

如果您沒有序列主控台存取權,請遵循 離線方法 ,從救援虛擬機存取有問題的OS磁碟內容。 離線方法需要存取 Azure CLI 或 Azure Cloud Shell

若要針對案例 3 進行疑難解答 :已停用其他 Hyper-V 驅動程式,離線方法是解決問題的唯一選項。

案例 1:已停用網路 Hyper-V 驅動程式

因為網路服務無法使用,因此您無法將殼層通訊協定 (SSH) 安全到虛擬機,但您仍然可以從 Azure 入口網站 透過序列主控台登入。 您會在序列主控台或 Azure 入口網站 的 [開機診斷] 窗格中看到下列類型的錯誤:

 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

解決方案 1:使用序列主控台啟用 Hyper-V 網路驅動程式

  1. 存取 VM 的序列主控台。 網路功能已關閉,但登入提示仍可供使用。

  2. 使用正確的認證登入 VM。

  3. 切換至具有 sudo 存取權的根帳戶或用戶帳戶。

  4. 移至 /etc/modprobe.d 目錄,並尋找停用hv_netvsc驅動程式的任何行。

    1. 執行下列命令來識別停用hv_netvsc驅動程式和對應行號的檔案:

      grep -nr "hv_netvsc" /etc/modprobe.d/
      
    2. 修改對應的檔案,並將hv_netvsc專案批註或刪除:

      顯示用來停用網路驅動程式之可能組態檔內容的螢幕快照。

      vi /etc/modprobe.d/disable.conf
      

      注意

      • 停用驅動程式的專案是由 Linux 作業系統所定義,而不是由Microsoft所定義。
      • 將取代 disable.conf 為停用hv_netvsc驅動程式的對應檔名。
  5. 重建目前載入核心的初始RAMdisk 映像:

    • 針對 RHEL/SLES 型映像

      # dracut -f -v
      
    • 針對以Ubuntu/Debian為基礎的映像

      # mkinitramfs -k -o /boot/initrd.img-$(uname -r)
      
  6. 重新啟動 VM。

請一律備份原始的初始RAMdisk映像,以便在需要時進行復原。

  • 針對以 RHEL 為基礎的映射:

    # cp /boot/initramfs-<kernelVersion>.img /boot/initramfs-<kernelVersion>.img.bak
    
  • 針對以 SLES 為基礎的映射:

    # cp /boot/initrd-<kernelVersion> /boot/initrd-<kernelVersion>.bak
    
  • 針對以Ubuntu/Debian 為基礎的映像:

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

解決方案 2:讓 Hyper-V 網路驅動程式離線

  1. 使用 az vm repair 從救援 VM 存取受影響 OS 磁碟的內容。

  2. 遵循 chroot 指示,將 和 chroot 掛接至救援 VM 中連結 OS 磁碟的文件系統。

  3. 存取受影響 OS 磁碟的內容之後,請遵循解決方案 1:使用序列主控台啟用 Hyper-V 網路驅動程式中的步驟 4 和 5,以重新啟用驅動程式並重建初始 RAMdisk 映射。

    在重建初始RAMdisk映像之前,請切換至chroot環境。 必須提供映像的完整路徑。

  4. 套用變更之後,請對原始 VM 執行自動 OS 磁碟交換,並使用 az vm repair restore 命令重新啟動系統。

案例 2:NIC MAC 位址已變更或不符合

如果網路適配器 MAC 位址已變更或不符合 OS 設定內,您將無法透過 SSH 連線到 VM,因為網路服務無法使用。 您仍然可以從 Azure 入口網站 透過序列主控台登入。 顯示類似案例 1:網路 Hyper-V 驅動程式已停用的錯誤

如果問題持續發生,即使已啟用 Hyper-V 網路驅動程式,請使用下列其中一個解決方案來驗證 OS NIC 設定並解決問題。

解決方案 1:使用序列主控台修正 NIC MAC 位址不符

  1. 存取 VM 的序列主控台。 網路功能已關閉,但登入提示仍可供使用。

  2. 使用正確的認證登入 VM。

  3. 切換至具有 sudo 存取權的根帳戶或用戶帳戶。

  4. 移至 /etc/cloud/cloud.cfg.d 目錄。

  5. 考慮 使用 Linux 合作夥伴映像 ,請開啟和編輯下列檔案:

    • 91-azure_datasource.cfg 以 RHEL 為基礎的散發。
    • 90_dpkg.cfg for Debian 和 Ubuntu 型散發套件。
  6. apply_network_config如果參數設定為 false,請將它設定為 true。 如果未指定任何專案,則預設值會設定為 true。 此設定可確保下一次重新啟動時,新的 MAC 位址會套用至網路設定。

  7. 一般而言,只有在系統管理員刪除或新增 NIC,或在後端更新 NIC 時,NIC MAC 位址才會變更。 如果不需要透過 cloud-init 進行網路設定,而且 apply_network_config 參數必須設定為 false,請刪除 /var/lib/cloud/instance/obj.pkl 檔案,然後重新啟動系統。

    # rm /var/lib/cloud/instance/obj.pkl
    
  8. 套用變更之後,請重新啟動系統。

解決方案 2:修正 NIC MAC 位址離線不符

  1. 使用 az vm repair 命令,從救援虛擬機存取受影響 OS 磁碟的內容。
  2. 遵循 chroot 指示,將 和 chroot 掛接至救援 VM 中連結 OS 磁碟的文件系統。
  3. 存取受影響 OS 磁碟復本的內容之後,請遵循解決方案 1 中的步驟 4 到 7 :使用序列控制台 修正 NIC MAC 位址不符,以進行網路變更或清除 obj.pkl 檔案。
  4. 套用變更之後,請使用 az vm repair restore 命令以原始 VM 執行自動 OS 磁碟交換,並重新啟動系統。

案例 3:已停用其他 Hyper-V 驅動程式

如果您遇到其他 Hyper-V 驅動程式的開機問題,您可能無法透過 SSH 連線到 VM,因為網路服務無法使用。 你被扔到一個德拉庫殼。 您可以從 Azure 入口網站 透過序列主控台檢視此問題。 您可以在序列主控台或 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:/#

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)

解決方案:啟用 Hyper-V 驅動程式

如果 VM 因為其他 Hyper-V 驅動程式已停用而無法存取,請使用離線方法來重新啟用驅動程式,因為無法載入 initramfs。

  1. 使用 az vm repair 命令,從救援虛擬機存取有問題的 OS 磁碟內容。

  2. 依照 chroot 指示,在救援 VM 中,將和 chroot 掛接至所連結 OS 磁碟的文件系統。

  3. 在 chroot 環境中,移至 /etc/modprobe.d 目錄,並尋找可能停用hv_utils、hv_vmbus、hv_storvsc或hv_netvsc驅動程式的任何行。

    1. 執行下列命令來識別停用hv_utils、hv_vmbus、hv_storvsc或hv_netvsc驅動程式和對應行號的檔案。

      egrep -nr "hv_utils|hv_vmbus|hv_storvsc|hv_netvsc" /etc/modprobe.d/
      
    2. 修改對應的檔案,並批注或刪除hv_utils、hv_vmbus、hv_storvsc或hv_netvsc專案。 這些專案通常為下列任何一項(或兩者):

      此螢幕快照顯示使用 安裝選項停用核心模組/驅動程式的可能組態檔內容。

      此螢幕快照顯示用來停用核心模組/驅動程式的可能組態檔內容。

      vi /etc/modprobe.d/disable.conf
      

    重要

    • 停用驅動程式的專案是由 Linux 作業系統所定義,而不是由Microsoft所定義。
    • 將取代 disable.conf 為停用 Hyper-V 驅動程式的對應檔名。
  4. 重建目前載入核心的初始RAMdisk 映像:

    • 針對 RHEL/SLES 型映像

      # dracut -f -v
      
    • 針對以Ubuntu/Debian為基礎的映像

      # mkinitramfs -k -o /boot/initrd.img-$(uname -r)
      
  5. 套用變更之後,請使用 az vm repair restore 命令以原始 VM 執行自動 OS 磁碟交換,並重新啟動系統。

請一律備份原始的初始RAMdisk映像,以在需要時協助復原。

如果問題仍未解決,請參閱 Azure Linux 虛擬機無法開機,並輸入 dracut 緊急殼層 來調查 dracut 問題。

下一步

如果特定開機錯誤不是 Hyper-V 問題,請參閱針對 Azure Linux 虛擬機器 開機錯誤進行疑難解答,以取得進一步的疑難解答選項。

與我們連絡,以取得說明

如果您有問題或需要相關協助,請建立支援要求,或詢問 Azure community 支援。 您也可以向 Azure 意見反應社群提交產品意見反應。