在 Hyper-V 上執行 Linux 的最佳做法

適用於: Windows Server 2022、Azure Stack HCI 版本 20H2;Windows Server 2019、Windows Server 2016、Hyper-V Server 2016、Windows Server 2012 R2、Hyper-V Server 2012 R2、Windows Server 2012、Hyper-V Server 2012、Windows Server 2008 R2、Windows 10、Windows 8.1、Windows 8、Windows 7.1、Windows 7

本主題包含 Hyper-V 上執行 Linux 虛擬機器的建議清單。

在動態 VHDX 檔案上調整 Linux 檔案系統

即使檔案系統大部分是空的,某些 Linux 檔案系統仍可能會耗用大量的實際磁碟空間。 若要減少動態 VHDX 檔案的實際磁碟空間使用量,請考慮下列建議:

  • 建立 VHDX 時,請使用 PowerShell 中的 1MB BlockSizeBytes (從預設 32MB),例如:
PS > New-VHD -Path C:\MyVHDs\test.vhdx -SizeBytes 127GB -Dynamic -BlockSizeBytes 1MB
  • ext4 格式會比 ext3 受到喜歡,因為 ext4 與動態 VHDX 檔案搭配使用時,會比 ext3 更有空間效率。

  • 建立檔案系統時,指定群組數目為 4096,例如:

# mkfs.ext4 -G 4096 /dev/sdX1

第 2 代虛擬機器上的 Grub 功能表逾時

由於從第 2 代虛擬機器的模擬中移除了舊版硬體,grub 功能表倒數計時器倒數太快,無法顯示 grub 功能表,立即載入預設專案。 在修正 grub 以使用 EFI 支援的計時器之前,請將 /boot/grub/grub.conf、/etc/default/grub 或同等專案修改為 "timeout=100000" 而不是預設的 "timeout=5"。

第 2 代虛擬機器上的 PxE 開機

因為第 2 代虛擬機器中沒有 PIT 計時器,因此 PxE TFTP 伺服器的網路連線可能會過早終止,從而防止開機載入器讀取 Grub 設定,並從伺服器載入核心。

在 RHEL 6.x 上,可以使用舊版 grub v0.97 EFI 開機載入器,而不是 grub2,如下所述: https://access.redhat.com/documentation/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/s1-netboot-pxe-config-efi.html

在除了 RHEL 6.x 以外的 Linux 發行版本上,可以遵循類似的步驟來設定 grub v0.97 以從 PxE 伺服器載入 Linux 核心。

此外,在 RHEL/CentOS 6.6 上,鍵盤和滑鼠輸入將無法與預先安裝的核心一起使用,這會防止在功能表中指定安裝選項。 序列主控台必須設定為允許選擇安裝選項。

  • 在 PxE 伺服器上的 efidefault 檔案中,新增下列核心參數 "console=ttyS1"

  • 在 Hyper-V 中的 VM 上,使用此 PowerShell Cmdlet 設定 COM 連接埠:

Set-VMComPort -VMName <Name> -Number 2 -Path \\.\pipe\dbg1

在安裝前核心中指定 kickstart 檔案,也能避免在安裝期間需要鍵盤和滑鼠輸入。

搭配容錯移轉叢集使用靜態 MAC 位址

將使用容錯移轉叢集部署的 Linux 虛擬機器,應該為每個虛擬網路介面卡設定靜態媒體存取控制 (MAC) 位址。 在某些 Linux 版本中,網路設定可能會在容錯移轉後遺失,因為新的 MAC 位址會指派給虛擬網路介面卡。 若要避免遺失網路設定,請確定每個虛擬網路介面卡都有靜態 MAC 位址。 您可以在 Hyper-V 管理員或容錯移轉叢集管理員中編輯虛擬機器的設定,以設定 MAC 位址。

使用 Hyper-V 特定的網路介面卡,而不是舊版網路介面卡

設定並使用虛擬乙太網路介面卡,這是具有增強效能的 Hyper-V 特定網路卡。 如果舊版和 Hyper-V 特定網路介面卡都連結至虛擬機器,則 config -a 輸出中的網路名稱可能會顯示隨機值,例如 _tmp12000801310。 若要避免此問題,在 Linux 虛擬機器中使用 Hyper-V 特定網路介面卡時,請移除所有舊版網路介面卡。

使用 I/O 排程器 noop/none 以提升磁碟 I/O 效能

Linux 核心提供兩組磁碟 I/O 排程器來重新排序要求。 一組適用於較舊的 ‘blk’ 子系統,而另一組則適用於較新的 ‘blk-mq’ 子系統。 不論是哪一種情況,使用現今的固態磁碟,建議使用排程器,將排程決策傳遞至基礎 Hyper-V Hypervisor。 對於使用 ‘blk’ 子系統的 Linux 核心,這是 “ noop ” 排程器。 對於使用 ‘blk’ 子系統的 Linux 核心,這是 “ 無 ” 排程器。

對於特定的磁碟,您可以在這個檔案系統位置看到可用的排程器: /sys/class/block/<diskname>/queue/scheduler,目前選取的排程器會以方括弧括住。 您可以寫入此檔案系統位置來變更排程器。 變更必須新增至初始化指令碼,才能在重新開機後保存。 如需詳細資訊,請咨詢您的 Linux 散發文件。

NUMA

早於 2.6.37 的 Linux 核心版本不支援具較大 VM 大小之 Hyper-V 上的 NUMA。 這個問題主要會影響使用上游 Red Hat 2.6.32 核心的較舊發行版本,而且已在 Red Hat Enterprise Linux (RHEL) 6.6 (kernel-2.6.32-504) 中加以修正。 執行的自訂核心是 2.6.37 以前版本的系統,或 2.6.32-504 以前的 RHEL 型核心必須在 grub.conf 的核心命令列上設定開機參數 numa=off。 如需詳細資訊,請參閱 Red Hat KB 436883 \(英文\)。

為 kdump 保留更多記憶體

如果傾印擷取核心最終在開機時發生異常狀況,請為核心保留更多記憶體。 例如,將 crashkernel=384M-:128M 參數變更為 Ubuntu grub 設定檔中的 crashkernel=384M-:256M

壓縮 VHDX 或展開 VHD 和 VHDX 檔案可能會導致錯誤的 GPT 分割區資料表

Hyper-V 允許壓縮虛擬磁碟 (VHDX) 檔案,而不考慮磁碟上可能存在的任何磁碟分割、磁碟區或檔案系統資料結構。 如果在分割區結尾之前,VHDX 縮小至 VHDX 結尾的位置,資料可能會遺失、該分割區可能會損毀,或讀取分割區時傳回不正確的資料。

調整 VHD 或 VHDX 的大小之後,系統管理員應該使用 fdisk 之類的公用程式或部分來更新磁碟分割、磁碟區和檔案系統結構,以反映磁碟大小變更。 使用分割區管理工具檢查分割區配置時,壓縮或擴充具有 GUID 磁碟分割表格的 VHD 或 VHDX 大小會導致警告,而且系統管理員會被警告修正第一個和第二個 GPT 標頭。 此手動步驟很安全,不會造成資料遺失。

其他參考