共用方式為


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

Azure 會在 Hyper-V Hypervisor 上執行,而 Linux 系統需要某些 Hyper-V 核心模組才能在 Azure 上執行。 這些核心模組會組合成 Linux Integration Services (適用於 Hyper-V 和 Azure 的 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 (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.

 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 指示,在救援 VM 中將連結 OS 磁碟的文件系統掛接並進行節流。

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

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

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

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

如果網路適配器 MAC 位址已變更或不符合作業系統設定,您將無法透過 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 代表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 指示,在救援 VM 中正確地將連結 OS 磁碟的文件系統掛接並進行 Chroot。
  3. 存取受影響 OS 磁碟的復本內容之後,請遵循 解決方案 1:使用序列主控台修正 NIC MAC 位址不符 中的步驟 4 到 7,進行網路變更或清除 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:/#

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 驅動程式

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

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

  2. 遵循 Chroot 指示,在救援 VM 中正確地將連結 OS 磁碟的文件系統掛接並進行 Chroot。

  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 緊急殼層 來調查繪製問題。

後續步驟

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

與我們連絡,以取得說明

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