針對 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 網路驅動程式
存取 VM 的序列主控台。 網路功能已關閉,但登入提示仍可供使用。
使用正確的認證登入 VM。
切換至具有 sudo 存取權的根帳戶或用戶帳戶。
移至 /etc/modprobe.d 目錄,並尋找停用hv_netvsc驅動程式的任何行。
執行下列命令來識別停用hv_netvsc驅動程式和對應行號的檔案:
grep -nr "hv_netvsc" /etc/modprobe.d/
修改對應的檔案,並將hv_netvsc專案批註或刪除:
vi /etc/modprobe.d/disable.conf
注意
- 停用驅動程式的專案是由 Linux 作業系統所定義,而不是由Microsoft所定義。
- 將取代
disable.conf
為停用hv_netvsc驅動程式的對應檔名。
重建目前載入核心的初始RAMdisk 映像:
針對 RHEL/SLES 型映像
# dracut -f -v
針對以Ubuntu/Debian為基礎的映像
# mkinitramfs -k -o /boot/initrd.img-$(uname -r)
重新啟動 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 網路驅動程式離線
使用 az vm repair 從救援 VM 存取受影響 OS 磁碟的內容。
遵循 chroot 指示,將 和 chroot 掛接至救援 VM 中連結 OS 磁碟的文件系統。
存取受影響 OS 磁碟的內容之後,請遵循解決方案 1:使用序列主控台啟用 Hyper-V 網路驅動程式中的步驟 4 和 5,以重新啟用驅動程式並重建初始 RAMdisk 映射。
在重建初始RAMdisk映像之前,請切換至chroot環境。 必須提供映像的完整路徑。
套用變更之後,請對原始 VM 執行自動 OS 磁碟交換,並使用
az vm repair restore
命令重新啟動系統。
案例 2:NIC MAC 位址已變更或不符合
如果網路適配器 MAC 位址已變更或不符合 OS 設定內,您將無法透過 SSH 連線到 VM,因為網路服務無法使用。 您仍然可以從 Azure 入口網站 透過序列主控台登入。 顯示類似案例 1:網路 Hyper-V 驅動程式已停用的錯誤。
如果問題持續發生,即使已啟用 Hyper-V 網路驅動程式,請使用下列其中一個解決方案來驗證 OS NIC 設定並解決問題。
解決方案 1:使用序列主控台修正 NIC MAC 位址不符
存取 VM 的序列主控台。 網路功能已關閉,但登入提示仍可供使用。
使用正確的認證登入 VM。
切換至具有 sudo 存取權的根帳戶或用戶帳戶。
移至 /etc/cloud/cloud.cfg.d 目錄。
考慮 使用 Linux 合作夥伴映像 ,請開啟和編輯下列檔案:
- 91-azure_datasource.cfg 以 RHEL 為基礎的散發。
- 90_dpkg.cfg for Debian 和 Ubuntu 型散發套件。
apply_network_config
如果參數設定為 false,請將它設定為 true。 如果未指定任何專案,則預設值會設定為 true。 此設定可確保下一次重新啟動時,新的 MAC 位址會套用至網路設定。一般而言,只有在系統管理員刪除或新增 NIC,或在後端更新 NIC 時,NIC MAC 位址才會變更。 如果不需要透過 cloud-init 進行網路設定,而且
apply_network_config
參數必須設定為 false,請刪除 /var/lib/cloud/instance/obj.pkl 檔案,然後重新啟動系統。# rm /var/lib/cloud/instance/obj.pkl
套用變更之後,請重新啟動系統。
解決方案 2:修正 NIC MAC 位址離線不符
- 使用 az vm repair 命令,從救援虛擬機存取受影響 OS 磁碟的內容。
- 遵循 chroot 指示,將 和 chroot 掛接至救援 VM 中連結 OS 磁碟的文件系統。
- 存取受影響 OS 磁碟復本的內容之後,請遵循解決方案 1 中的步驟 4 到 7 :使用序列控制台 修正 NIC MAC 位址不符,以進行網路變更或清除 obj.pkl 檔案。
- 套用變更之後,請使用
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。
使用 az vm repair 命令,從救援虛擬機存取有問題的 OS 磁碟內容。
依照 chroot 指示,在救援 VM 中,將和 chroot 掛接至所連結 OS 磁碟的文件系統。
在 chroot 環境中,移至 /etc/modprobe.d 目錄,並尋找可能停用hv_utils、hv_vmbus、hv_storvsc或hv_netvsc驅動程式的任何行。
執行下列命令來識別停用hv_utils、hv_vmbus、hv_storvsc或hv_netvsc驅動程式和對應行號的檔案。
egrep -nr "hv_utils|hv_vmbus|hv_storvsc|hv_netvsc" /etc/modprobe.d/
修改對應的檔案,並批注或刪除hv_utils、hv_vmbus、hv_storvsc或hv_netvsc專案。 這些專案通常為下列任何一項(或兩者):
vi /etc/modprobe.d/disable.conf
重要
- 停用驅動程式的專案是由 Linux 作業系統所定義,而不是由Microsoft所定義。
- 將取代
disable.conf
為停用 Hyper-V 驅動程式的對應檔名。
重建目前載入核心的初始RAMdisk 映像:
針對 RHEL/SLES 型映像
# dracut -f -v
針對以Ubuntu/Debian為基礎的映像
# mkinitramfs -k -o /boot/initrd.img-$(uname -r)
套用變更之後,請使用
az vm repair restore
命令以原始 VM 執行自動 OS 磁碟交換,並重新啟動系統。
請一律備份原始的初始RAMdisk映像,以在需要時協助復原。
如果問題仍未解決,請參閱 Azure Linux 虛擬機無法開機,並輸入 dracut 緊急殼層 來調查 dracut 問題。
下一步
如果特定開機錯誤不是 Hyper-V 問題,請參閱針對 Azure Linux 虛擬機器 開機錯誤進行疑難解答,以取得進一步的疑難解答選項。
與我們連絡,以取得說明
如果您有問題或需要相關協助,請建立支援要求,或詢問 Azure community 支援。 您也可以向 Azure 意見反應社群提交產品意見反應。